401 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			401 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost.Assign library | ||
|  | // | ||
|  | //  Copyright Thorsten Ottosen 2003-2004. Use, modification and | ||
|  | //  distribution is subject to 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) | ||
|  | // | ||
|  | // For more information, see http://www.boost.org/libs/assign/ | ||
|  | // | ||
|  | 
 | ||
|  | #ifndef BOOST_ASSIGN_LIST_INSERTER_HPP | ||
|  | #define BOOST_ASSIGN_LIST_INSERTER_HPP | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) | ||
|  | # pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #include <boost/mpl/if.hpp> | ||
|  | #include <boost/type_traits/is_same.hpp> | ||
|  | #include <boost/range/begin.hpp> | ||
|  | #include <boost/range/end.hpp> | ||
|  | #include <boost/config.hpp> | ||
|  | #include <cstddef> | ||
|  | 
 | ||
|  | #include <boost/preprocessor/repetition/enum_binary_params.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_params.hpp> | ||
|  | #include <boost/preprocessor/cat.hpp> | ||
|  | #include <boost/preprocessor/iteration/local.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/inc.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  | namespace assign_detail | ||
|  | { | ||
|  |     template< class T > | ||
|  |     struct repeater | ||
|  |     { | ||
|  |         std::size_t  sz; | ||
|  |         T            val; | ||
|  | 
 | ||
|  |         repeater( std::size_t sz_, T r ) : sz( sz_ ), val( r ) | ||
|  |         { } | ||
|  |     }; | ||
|  |      | ||
|  |     template< class Fun > | ||
|  |     struct fun_repeater | ||
|  |     { | ||
|  |         std::size_t  sz; | ||
|  |         Fun          val; | ||
|  |          | ||
|  |         fun_repeater( std::size_t sz_, Fun r ) : sz( sz_ ), val( r ) | ||
|  |         { } | ||
|  |     }; | ||
|  |      | ||
|  |     template< class C > | ||
|  |     class call_push_back | ||
|  |     { | ||
|  |         C& c_; | ||
|  |     public: | ||
|  |         call_push_back( C& c ) : c_( c ) | ||
|  |         { } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         void operator()( T r )  | ||
|  |         { | ||
|  |             c_.push_back( r ); | ||
|  |         } | ||
|  |     }; | ||
|  |      | ||
|  |     template< class C > | ||
|  |     class call_push_front | ||
|  |     { | ||
|  |         C& c_; | ||
|  |     public: | ||
|  |         call_push_front( C& c ) : c_( c ) | ||
|  |         { } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         void operator()( T r )  | ||
|  |         { | ||
|  |             c_.push_front( r ); | ||
|  |         } | ||
|  |     }; | ||
|  |      | ||
|  |     template< class C > | ||
|  |     class call_push | ||
|  |     { | ||
|  |         C& c_; | ||
|  |     public: | ||
|  |         call_push( C& c ) : c_( c ) | ||
|  |         { } | ||
|  |      | ||
|  |         template< class T > | ||
|  |         void operator()( T r )  | ||
|  |         { | ||
|  |             c_.push( r ); | ||
|  |         } | ||
|  |     }; | ||
|  |      | ||
|  |     template< class C > | ||
|  |     class call_insert | ||
|  |     { | ||
|  |         C& c_; | ||
|  |     public: | ||
|  |         call_insert( C& c ) : c_( c ) | ||
|  |         { } | ||
|  |      | ||
|  |         template< class T > | ||
|  |         void operator()( T r )  | ||
|  |         { | ||
|  |             c_.insert( r ); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     template< class C > | ||
|  |     class call_add_edge | ||
|  |     { | ||
|  |         C& c_; | ||
|  |     public: | ||
|  |         call_add_edge( C& c ) : c_(c) | ||
|  |         { } | ||
|  | 
 | ||
|  |         template< class T > | ||
|  |         void operator()( T l, T r ) | ||
|  |         { | ||
|  |             add_edge( l, r, c_ ); | ||
|  |         } | ||
|  | 
 | ||
|  |         template< class T, class EP > | ||
|  |         void operator()( T l, T r, const EP& ep ) | ||
|  |         { | ||
|  |             add_edge( l, r, ep, c_ ); | ||
|  |         } | ||
|  | 
 | ||
|  |     }; | ||
|  |      | ||
|  |     struct forward_n_arguments {}; | ||
|  |      | ||
|  | } // namespace 'assign_detail' | ||
|  | 
 | ||
|  | namespace assign | ||
|  | { | ||
|  | 
 | ||
|  |     template< class T > | ||
|  |     inline assign_detail::repeater<T> | ||
|  |     repeat( std::size_t sz, T r ) | ||
|  |     { | ||
|  |         return assign_detail::repeater<T>( sz, r ); | ||
|  |     } | ||
|  |      | ||
|  |     template< class Function > | ||
|  |     inline assign_detail::fun_repeater<Function> | ||
|  |     repeat_fun( std::size_t sz, Function r ) | ||
|  |     { | ||
|  |         return assign_detail::fun_repeater<Function>( sz, r ); | ||
|  |     } | ||
|  |      | ||
|  | 
 | ||
|  |     template< class Function, class Argument = assign_detail::forward_n_arguments >  | ||
|  |     class list_inserter | ||
|  |     { | ||
|  |         struct single_arg_type {}; | ||
|  |         struct n_arg_type      {}; | ||
|  | 
 | ||
|  |         typedef BOOST_DEDUCED_TYPENAME mpl::if_c< is_same<Argument,assign_detail::forward_n_arguments>::value, | ||
|  |                                                   n_arg_type, | ||
|  |                                                   single_arg_type >::type arg_type;   | ||
|  |              | ||
|  |     public: | ||
|  |          | ||
|  |         list_inserter( Function fun ) : insert_( fun ) | ||
|  |         {} | ||
|  |          | ||
|  |         template< class Function2, class Arg > | ||
|  |         list_inserter( const list_inserter<Function2,Arg>& r )  | ||
|  |         : insert_( r.fun_private() )  | ||
|  |         {} | ||
|  | 
 | ||
|  |         list_inserter( const list_inserter& r ) : insert_( r.insert_ ) | ||
|  |         {} | ||
|  | 
 | ||
|  |         list_inserter& operator()() | ||
|  |         { | ||
|  |             insert_( Argument() ); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         list_inserter& operator=( const T& r ) | ||
|  |         { | ||
|  |             insert_( r ); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         list_inserter& operator=( assign_detail::repeater<T> r ) | ||
|  |         { | ||
|  |             return operator,( r ); | ||
|  |         } | ||
|  |          | ||
|  |         template< class Nullary_function > | ||
|  |         list_inserter& operator=( const assign_detail::fun_repeater<Nullary_function>& r ) | ||
|  |         { | ||
|  |             return operator,( r ); | ||
|  |         } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         list_inserter& operator,( const T& r ) | ||
|  |         { | ||
|  |             insert_( r  ); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  | #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205)) | ||
|  |         template< class T > | ||
|  |         list_inserter& operator,( const assign_detail::repeater<T> & r ) | ||
|  |         { | ||
|  |             return repeat( r.sz, r.val );  | ||
|  |         } | ||
|  | #else | ||
|  |         template< class T > | ||
|  |         list_inserter& operator,( assign_detail::repeater<T> r ) | ||
|  |         { | ||
|  |             return repeat( r.sz, r.val );  | ||
|  |         } | ||
|  | #endif | ||
|  |          | ||
|  |         template< class Nullary_function > | ||
|  |         list_inserter& operator,( const assign_detail::fun_repeater<Nullary_function>& r ) | ||
|  |         { | ||
|  |             return repeat_fun( r.sz, r.val );  | ||
|  |         } | ||
|  | 
 | ||
|  |         template< class T > | ||
|  |         list_inserter& repeat( std::size_t sz, T r ) | ||
|  |         { | ||
|  |             std::size_t i = 0; | ||
|  |             while( i++ != sz ) | ||
|  |                 insert_( r ); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         template< class Nullary_function > | ||
|  |         list_inserter& repeat_fun( std::size_t sz, Nullary_function fun ) | ||
|  |         { | ||
|  |             std::size_t i = 0; | ||
|  |             while( i++ != sz ) | ||
|  |                 insert_( fun() ); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         template< class SinglePassIterator > | ||
|  |         list_inserter& range( SinglePassIterator first,  | ||
|  |                               SinglePassIterator last ) | ||
|  |         { | ||
|  |             for( ; first != last; ++first ) | ||
|  |                 insert_( *first ); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         template< class SinglePassRange > | ||
|  |         list_inserter& range( const SinglePassRange& r ) | ||
|  |         { | ||
|  |             return range( boost::begin(r), boost::end(r) ); | ||
|  |         } | ||
|  |          | ||
|  |         template< class T > | ||
|  |         list_inserter& operator()( const T& t ) | ||
|  |         { | ||
|  |             insert_( t ); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  | #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value | ||
|  | #define BOOST_ASSIGN_MAX_PARAMS 5         | ||
|  | #endif | ||
|  | #define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1) | ||
|  | #define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class T) | ||
|  | #define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& t) | ||
|  | #define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, t) | ||
|  |          | ||
|  | #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS) | ||
|  | #define BOOST_PP_LOCAL_MACRO(n) \ | ||
|  |     template< class T, BOOST_ASSIGN_PARAMS1(n) > \ | ||
|  |     list_inserter& operator()(T t, BOOST_ASSIGN_PARAMS2(n) ) \ | ||
|  |         { \ | ||
|  |             BOOST_PP_CAT(insert, BOOST_PP_INC(n))(t, BOOST_ASSIGN_PARAMS3(n), arg_type()); \ | ||
|  |             return *this; \ | ||
|  |         } \ | ||
|  |         /**/ | ||
|  | 
 | ||
|  | #include BOOST_PP_LOCAL_ITERATE() | ||
|  |          | ||
|  | 
 | ||
|  | #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS) | ||
|  | #define BOOST_PP_LOCAL_MACRO(n) \ | ||
|  |     template< class T, BOOST_ASSIGN_PARAMS1(n) > \ | ||
|  |     void BOOST_PP_CAT(insert, BOOST_PP_INC(n))(T const& t, BOOST_ASSIGN_PARAMS2(n), single_arg_type) \ | ||
|  |     { \ | ||
|  |         insert_( Argument(t, BOOST_ASSIGN_PARAMS3(n) )); \ | ||
|  |     } \ | ||
|  |     /**/ | ||
|  |          | ||
|  | #include BOOST_PP_LOCAL_ITERATE() | ||
|  | 
 | ||
|  | #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS) | ||
|  | #define BOOST_PP_LOCAL_MACRO(n) \ | ||
|  |     template< class T, BOOST_ASSIGN_PARAMS1(n) > \ | ||
|  |     void BOOST_PP_CAT(insert, BOOST_PP_INC(n))(T const& t, BOOST_ASSIGN_PARAMS2(n), n_arg_type) \ | ||
|  |     { \ | ||
|  |         insert_(t, BOOST_ASSIGN_PARAMS3(n) ); \ | ||
|  |     } \ | ||
|  |     /**/ | ||
|  |          | ||
|  | #include BOOST_PP_LOCAL_ITERATE() | ||
|  | 
 | ||
|  |          | ||
|  |         Function fun_private() const | ||
|  |         { | ||
|  |             return insert_; | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  |          | ||
|  |         list_inserter& operator=( const list_inserter& ); | ||
|  |         Function insert_; | ||
|  |     }; | ||
|  |      | ||
|  |     template< class Function > | ||
|  |     inline list_inserter< Function > | ||
|  |     make_list_inserter( Function fun ) | ||
|  |     { | ||
|  |         return list_inserter< Function >( fun ); | ||
|  |     } | ||
|  |      | ||
|  |     template< class Function, class Argument > | ||
|  |     inline list_inserter<Function,Argument> | ||
|  |     make_list_inserter( Function fun, Argument* ) | ||
|  |     { | ||
|  |         return list_inserter<Function,Argument>( fun ); | ||
|  |     } | ||
|  | 
 | ||
|  |     template< class C > | ||
|  |     inline list_inserter< assign_detail::call_push_back<C>,  | ||
|  |                           BOOST_DEDUCED_TYPENAME C::value_type > | ||
|  |     push_back( C& c ) | ||
|  |     { | ||
|  |         static BOOST_DEDUCED_TYPENAME C::value_type* p = 0; | ||
|  |         return make_list_inserter( assign_detail::call_push_back<C>( c ),  | ||
|  |                                    p ); | ||
|  |     } | ||
|  |      | ||
|  |     template< class C > | ||
|  |     inline list_inserter< assign_detail::call_push_front<C>, | ||
|  |                           BOOST_DEDUCED_TYPENAME C::value_type > | ||
|  |     push_front( C& c ) | ||
|  |     { | ||
|  |         static BOOST_DEDUCED_TYPENAME C::value_type* p = 0; | ||
|  |         return make_list_inserter( assign_detail::call_push_front<C>( c ), | ||
|  |                                    p ); | ||
|  |     } | ||
|  | 
 | ||
|  |     template< class C > | ||
|  |     inline list_inserter< assign_detail::call_insert<C>,  | ||
|  |                           BOOST_DEDUCED_TYPENAME C::value_type > | ||
|  |     insert( C& c ) | ||
|  |     { | ||
|  |         static BOOST_DEDUCED_TYPENAME C::value_type* p = 0; | ||
|  |         return make_list_inserter( assign_detail::call_insert<C>( c ), | ||
|  |                                    p ); | ||
|  |     } | ||
|  | 
 | ||
|  |     template< class C > | ||
|  |     inline list_inserter< assign_detail::call_push<C>,  | ||
|  |                           BOOST_DEDUCED_TYPENAME C::value_type > | ||
|  |     push( C& c ) | ||
|  |     { | ||
|  |         static BOOST_DEDUCED_TYPENAME C::value_type* p = 0; | ||
|  |         return make_list_inserter( assign_detail::call_push<C>( c ), | ||
|  |                                    p ); | ||
|  |     } | ||
|  | 
 | ||
|  |     template< class C > | ||
|  |     inline list_inserter< assign_detail::call_add_edge<C> > | ||
|  |     add_edge( C& c )    | ||
|  |     { | ||
|  |         return make_list_inserter( assign_detail::call_add_edge<C>( c ) ); | ||
|  |     } | ||
|  |      | ||
|  | } // namespace 'assign' | ||
|  | } // namespace 'boost' | ||
|  | 
 | ||
|  | #undef BOOST_ASSIGN_PARAMS1 | ||
|  | #undef BOOST_ASSIGN_PARAMS2 | ||
|  | #undef BOOST_ASSIGN_PARAMS3 | ||
|  | #undef BOOST_ASSIGN_MAX_PARAMETERS | ||
|  | 
 | ||
|  | #endif |