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
 | 
