diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-06-01 08:48:42 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-06-01 09:24:28 (GMT) |
commit | 2812bddd81f8a1b804c7460f4e14cd0aa393d129 (patch) | |
tree | d46294f35150c4f0f43deaf2d31fceaf945ae715 /3rdParty/Boost/boost/typeof/modifiers.hpp | |
download | swift-contrib-2812bddd81f8a1b804c7460f4e14cd0aa393d129.zip swift-contrib-2812bddd81f8a1b804c7460f4e14cd0aa393d129.tar.bz2 |
Import.
Diffstat (limited to '3rdParty/Boost/boost/typeof/modifiers.hpp')
-rw-r--r-- | 3rdParty/Boost/boost/typeof/modifiers.hpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/3rdParty/Boost/boost/typeof/modifiers.hpp b/3rdParty/Boost/boost/typeof/modifiers.hpp new file mode 100644 index 0000000..630d0dc --- /dev/null +++ b/3rdParty/Boost/boost/typeof/modifiers.hpp @@ -0,0 +1,121 @@ +// Copyright (C) 2004 Arkadiy Vertleyb +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED +#define BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED + +#include <boost/typeof/encode_decode.hpp> +#include <boost/preprocessor/facilities/identity.hpp> + +#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() + +// modifiers + +#define BOOST_TYPEOF_modifier_support(ID, Fun)\ + template<class V, class T> struct encode_type_impl<V, Fun(T)>\ + {\ + typedef\ + typename boost::type_of::encode_type<\ + typename boost::type_of::push_back<\ + V\ + , boost::mpl::size_t<ID> >::type\ + , T>::type\ + type;\ + };\ + template<class Iter> struct decode_type_impl<boost::mpl::size_t<ID>, Iter>\ + {\ + typedef boost::type_of::decode_type<Iter> d1;\ + typedef Fun(typename d1::type) type;\ + typedef typename d1::iter iter;\ + } + + +#define BOOST_TYPEOF_const_fun(T) const T +#define BOOST_TYPEOF_volatile_fun(T) volatile T +#define BOOST_TYPEOF_volatile_const_fun(T) volatile const T +#define BOOST_TYPEOF_pointer_fun(T) T* +#define BOOST_TYPEOF_reference_fun(T) T& + +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) +//Borland incorrectly handles T const, T const volatile and T volatile. +//It drops the decoration no matter what, so we need to try to handle T* const etc. without loosing the top modifier. +#define BOOST_TYPEOF_const_pointer_fun(T) T const * +#define BOOST_TYPEOF_const_reference_fun(T) T const & +#define BOOST_TYPEOF_volatile_pointer_fun(T) T volatile* +#define BOOST_TYPEOF_volatile_reference_fun(T) T volatile& +#define BOOST_TYPEOF_volatile_const_pointer_fun(T) T volatile const * +#define BOOST_TYPEOF_volatile_const_reference_fun(T) T volatile const & +#endif + +BOOST_TYPEOF_BEGIN_ENCODE_NS + +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_pointer_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_reference_fun); + +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_pointer_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_reference_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_pointer_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_reference_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_pointer_fun); +BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_reference_fun); +#endif + +BOOST_TYPEOF_END_ENCODE_NS + +#undef BOOST_TYPEOF_modifier_support +#undef BOOST_TYPEOF_const_fun +#undef BOOST_TYPEOF_volatile_fun +#undef BOOST_TYPEOF_volatile_const_fun +#undef BOOST_TYPEOF_pointer_fun +#undef BOOST_TYPEOF_reference_fun + +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) +#undef BOOST_TYPEOF_const_pointer_fun +#undef BOOST_TYPEOF_const_reference_fun +#undef BOOST_TYPEOF_volatile_pointer_fun +#undef BOOST_TYPEOF_volatile_reference_fun +#undef BOOST_TYPEOF_volatile_const_pointer_fun +#undef BOOST_TYPEOF_volatile_const_reference_fun +#endif + +// arrays + +#define BOOST_TYPEOF_array_support(ID, Qualifier)\ + template<class V, class T, int N>\ + struct encode_type_impl<V, Qualifier() T[N]>\ + {\ + typedef\ + typename boost::type_of::encode_type<\ + typename boost::type_of::push_back<\ + typename boost::type_of::push_back<\ + V\ + , boost::mpl::size_t<ID> >::type\ + , boost::mpl::size_t<N> >::type\ + , T>::type\ + type;\ + };\ + template<class Iter>\ + struct decode_type_impl<boost::mpl::size_t<ID>, Iter>\ + {\ + enum{n = Iter::type::value};\ + typedef boost::type_of::decode_type<typename Iter::next> d;\ + typedef typename d::type Qualifier() type[n];\ + typedef typename d::iter iter;\ + } + +BOOST_TYPEOF_BEGIN_ENCODE_NS + +BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_EMPTY); +BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(const)); +BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile)); +BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile const)); +BOOST_TYPEOF_END_ENCODE_NS + +#undef BOOST_TYPEOF_array_support + +#endif//BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED |