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
							 |