122 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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 |