187 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright (C) 2004, 2005 Arkadiy Vertleyb | ||
|  | // Copyright (C) 2005 Peder Holt | ||
|  | // 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_TYPEOF_IMPL_HPP_INCLUDED | ||
|  | #define BOOST_TYPEOF_TYPEOF_IMPL_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/mpl/size_t.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum.hpp> | ||
|  | #include <boost/typeof/encode_decode.hpp> | ||
|  | #include <boost/typeof/vector.hpp> | ||
|  | #include <boost/type_traits/is_function.hpp> | ||
|  | #include <boost/utility/enable_if.hpp> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_VECTOR(n) BOOST_PP_CAT(boost::type_of::vector, n) | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_sizer_item(z, n, _)\ | ||
|  |     char item ## n[V::item ## n ::value]; | ||
|  | 
 | ||
|  | namespace boost { namespace type_of { | ||
|  |     template<class V> | ||
|  |     struct sizer | ||
|  |     { | ||
|  |         // char item0[V::item0::value]; | ||
|  |         // char item1[V::item1::value]; | ||
|  |         // ... | ||
|  | 
 | ||
|  |         BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE, BOOST_TYPEOF_sizer_item, ~) | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #undef BOOST_TYPEOF_sizer_item | ||
|  | 
 | ||
|  | // | ||
|  | namespace boost { namespace type_of { | ||
|  | # ifdef BOOST_NO_SFINAE | ||
|  |     template<class V, class T> | ||
|  |     sizer<typename encode_type<V, T>::type> encode(const T&); | ||
|  | # else | ||
|  |     template<class V, class T> | ||
|  |     typename enable_if< | ||
|  |         typename is_function<T>::type, | ||
|  |         sizer<typename encode_type<V, T>::type> >::type encode(T&); | ||
|  | 
 | ||
|  |     template<class V, class T> | ||
|  |     typename disable_if< | ||
|  |         typename is_function<T>::type, | ||
|  |         sizer<typename encode_type<V, T>::type> >::type encode(const T&); | ||
|  | # endif | ||
|  | }} | ||
|  | // | ||
|  | namespace boost { namespace type_of { | ||
|  | 
 | ||
|  |     template<class V> | ||
|  |     struct decode_begin | ||
|  |     { | ||
|  |         typedef typename decode_type<typename V::begin>::type type; | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TYPEITEM(z, n, expr)\ | ||
|  |     boost::mpl::size_t<sizeof(boost::type_of::encode<BOOST_TYPEOF_VECTOR(0)<> >(expr).item ## n)> | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_ENCODED_VECTOR(Expr)                                   \ | ||
|  |     BOOST_TYPEOF_VECTOR(BOOST_TYPEOF_LIMIT_SIZE)<                           \ | ||
|  |         BOOST_PP_ENUM(BOOST_TYPEOF_LIMIT_SIZE, BOOST_TYPEOF_TYPEITEM, Expr) \ | ||
|  |     > | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF(Expr)\ | ||
|  |     boost::type_of::decode_begin<BOOST_TYPEOF_ENCODED_VECTOR(Expr) >::type | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_TPL typename BOOST_TYPEOF | ||
|  | 
 | ||
|  | //offset_vector is used to delay the insertion of data into the vector in order to allow | ||
|  | //encoding to be done in many steps | ||
|  | namespace boost { namespace type_of { | ||
|  |     template<typename V,typename Offset> | ||
|  |     struct offset_vector { | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class V,class Offset,class T> | ||
|  |     struct push_back<boost::type_of::offset_vector<V,Offset>,T> { | ||
|  |         typedef offset_vector<V,typename Offset::prior> type; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class V,class T> | ||
|  |     struct push_back<boost::type_of::offset_vector<V,mpl::size_t<0> >,T> { | ||
|  |         typedef typename push_back<V,T>::type type; | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_NESTED_TYPEITEM(z, n, expr)\ | ||
|  |     BOOST_STATIC_CONSTANT(int,BOOST_PP_CAT(value,n) = sizeof(boost::type_of::encode<_typeof_start_vector>(expr).item ## n));\ | ||
|  |     typedef boost::mpl::size_t<BOOST_PP_CAT(self_t::value,n)> BOOST_PP_CAT(item,n); | ||
|  | 
 | ||
|  | #ifdef __DMC__ | ||
|  | #define BOOST_TYPEOF_NESTED_TYPEITEM_2(z,n,expr)\ | ||
|  |     typedef typename _typeof_encode_fraction<iteration>::BOOST_PP_CAT(item,n) BOOST_PP_CAT(item,n); | ||
|  | 
 | ||
|  | #define BOOST_TYPEOF_FRACTIONTYPE()\ | ||
|  |     BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE,BOOST_TYPEOF_NESTED_TYPEITEM_2,_)\ | ||
|  |     typedef _typeof_fraction_iter<Pos> fraction_type; | ||
|  | #else | ||
|  | #define BOOST_TYPEOF_FRACTIONTYPE()\ | ||
|  |     typedef _typeof_encode_fraction<self_t::iteration> fraction_type; | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef __BORLANDC__ | ||
|  | namespace boost { namespace type_of { | ||
|  |     template<typename Pos,typename Iter> | ||
|  |     struct generic_typeof_fraction_iter { | ||
|  |         typedef generic_typeof_fraction_iter<Pos,Iter> self_t; | ||
|  |         static const int pos=(Pos::value); | ||
|  |         static const int iteration=(pos/5); | ||
|  |         static const int where=pos%5; | ||
|  |         typedef typename Iter::template _apply_next<self_t::iteration>::type fraction_type; | ||
|  |         typedef generic_typeof_fraction_iter<typename Pos::next,Iter> next; | ||
|  |         typedef typename v_iter<fraction_type,mpl::int_<self_t::where> >::type type; | ||
|  |     }; | ||
|  | }} | ||
|  | #define BOOST_TYPEOF_NESTED_TYPEDEF_IMPL(expr) \ | ||
|  |         template<int _Typeof_Iteration>\ | ||
|  |         struct _typeof_encode_fraction {\ | ||
|  |             typedef _typeof_encode_fraction<_Typeof_Iteration> self_t;\ | ||
|  |             BOOST_STATIC_CONSTANT(int,_typeof_encode_offset = (_Typeof_Iteration*BOOST_TYPEOF_LIMIT_SIZE));\ | ||
|  |             typedef boost::type_of::offset_vector<BOOST_TYPEOF_VECTOR(0)<>,boost::mpl::size_t<self_t::_typeof_encode_offset> > _typeof_start_vector;\ | ||
|  |             BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE,BOOST_TYPEOF_NESTED_TYPEITEM,expr)\ | ||
|  |             template<int Next>\ | ||
|  |             struct _apply_next {\ | ||
|  |                 typedef _typeof_encode_fraction<Next> type;\ | ||
|  |             };\ | ||
|  |         };\ | ||
|  |         template<typename Pos>\ | ||
|  |         struct _typeof_fraction_iter {\ | ||
|  |             typedef boost::type_of::generic_typeof_fraction_iter<Pos,_typeof_encode_fraction<0> > self_t;\ | ||
|  |             typedef typename self_t::next next;\ | ||
|  |             typedef typename self_t::type type;\ | ||
|  |         }; | ||
|  | #else | ||
|  | #define BOOST_TYPEOF_NESTED_TYPEDEF_IMPL(expr) \ | ||
|  |         template<int _Typeof_Iteration>\ | ||
|  |         struct _typeof_encode_fraction {\ | ||
|  |             typedef _typeof_encode_fraction<_Typeof_Iteration> self_t;\ | ||
|  |             BOOST_STATIC_CONSTANT(int,_typeof_encode_offset = (_Typeof_Iteration*BOOST_TYPEOF_LIMIT_SIZE));\ | ||
|  |             typedef boost::type_of::offset_vector<BOOST_TYPEOF_VECTOR(0)<>,boost::mpl::size_t<self_t::_typeof_encode_offset> > _typeof_start_vector;\ | ||
|  |             BOOST_PP_REPEAT(BOOST_TYPEOF_LIMIT_SIZE,BOOST_TYPEOF_NESTED_TYPEITEM,expr)\ | ||
|  |         };\ | ||
|  |         template<typename Pos>\ | ||
|  |         struct _typeof_fraction_iter {\ | ||
|  |             typedef _typeof_fraction_iter<Pos> self_t;\ | ||
|  |             BOOST_STATIC_CONSTANT(int,pos=(Pos::value));\ | ||
|  |             BOOST_STATIC_CONSTANT(int,iteration=(pos/BOOST_TYPEOF_LIMIT_SIZE));\ | ||
|  |             BOOST_STATIC_CONSTANT(int,where=pos%BOOST_TYPEOF_LIMIT_SIZE);\ | ||
|  |             BOOST_TYPEOF_FRACTIONTYPE()\ | ||
|  |             typedef typename boost::type_of::v_iter<fraction_type,boost::mpl::int_<self_t::where> >::type type;\ | ||
|  |             typedef _typeof_fraction_iter<typename Pos::next> next;\ | ||
|  |         }; | ||
|  | #endif | ||
|  | #ifdef __MWERKS__ | ||
|  | 
 | ||
|  | # define BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) \ | ||
|  | template<typename T>\ | ||
|  | struct BOOST_PP_CAT(_typeof_template_,name) {\ | ||
|  |     BOOST_TYPEOF_NESTED_TYPEDEF_IMPL(expr)\ | ||
|  |     typedef typename boost::type_of::decode_type<_typeof_fraction_iter<boost::mpl::size_t<0> > >::type type;\ | ||
|  | };\ | ||
|  | typedef BOOST_PP_CAT(_typeof_template_,name)<int> name; | ||
|  | 
 | ||
|  | # define BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr) BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) | ||
|  | 
 | ||
|  | #else | ||
|  | # define BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr) \ | ||
|  |     struct name {\ | ||
|  |         BOOST_TYPEOF_NESTED_TYPEDEF_IMPL(expr)\ | ||
|  |         typedef typename boost::type_of::decode_type<_typeof_fraction_iter<boost::mpl::size_t<0> > >::type type;\ | ||
|  |     }; | ||
|  | 
 | ||
|  | # define BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) \ | ||
|  |     struct name {\ | ||
|  |         BOOST_TYPEOF_NESTED_TYPEDEF_IMPL(expr)\ | ||
|  |         typedef boost::type_of::decode_type<_typeof_fraction_iter<boost::mpl::size_t<0> > >::type type;\ | ||
|  |     }; | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif//BOOST_TYPEOF_COMPLIANT_TYPEOF_IMPL_HPP_INCLUDED |