list_of.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 331 行

HPP
331
字号
// 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_OF_HPP#define BOOST_ASSIGN_LIST_OF_HPP#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma once#endif#include <boost/assign/assignment_exception.hpp>#include <boost/config.hpp>#include <boost/type_traits/detail/yes_no_type.hpp>#include <boost/mpl/if.hpp>#include <deque>#include <cstddef>#include <utility>#include <boost/preprocessor/repetition/enum_binary_params.hpp>#include <boost/preprocessor/repetition/enum_params.hpp>#include <boost/preprocessor/iteration/local.hpp>#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))// BCB requires full type definition for is_array<> to work correctly.#include <boost/array.hpp>#endifnamespace boost{// this here is necessary to avoid compiler error in <boost/array.hpp>#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    template< class T, std::size_t sz >    class array;#endif        namespace assign_detail{    template< class T, std::size_t sz >    type_traits::yes_type is_array( const array<T,sz>* );    type_traits::no_type is_array( ... );    template< class T, class U >    type_traits::yes_type is_pair( const std::pair<T,U>* );    type_traits::no_type is_pair( ... );          struct array_type_tag    {    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    private:      char dummy_;  // BCB would by default use 8 bytes    #endif    };    struct adapter_type_tag    {    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    private:      char dummy_;  // BCB would by default use 8 bytes    #endif    };    struct pair_type_tag    {    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    private:      char dummy_;  // BCB would by default use 8 bytes    #endif    };    struct default_type_tag    {    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    private:      char dummy_;  // BCB would by default use 8 bytes    #endif    };        template< class T >     class generic_list    {        typedef std::deque<T>  impl_type;        impl_type              values_;            public:        typedef BOOST_DEDUCED_TYPENAME impl_type::iterator         iterator;        typedef BOOST_DEDUCED_TYPENAME impl_type::const_iterator   const_iterator;        typedef BOOST_DEDUCED_TYPENAME impl_type::value_type       value_type;        typedef BOOST_DEDUCED_TYPENAME impl_type::size_type        size_type;        typedef BOOST_DEDUCED_TYPENAME impl_type::difference_type  difference_type;            public:        iterator begin()             { return values_.begin(); }        const_iterator begin() const { return values_.begin(); }        iterator end()               { return values_.end(); }        const_iterator end() const   { return values_.end(); }        bool empty() const           { return values_.empty(); }        size_type size() const       { return values_.size(); }            private:        void push_back( value_type r ) { values_.push_back( r ); }            public:        generic_list& operator()()        {            this->push_back( T() );            return *this;        }                template< class U >        generic_list& operator()( U u )        {            this->push_back( u );            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 U)#define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, U, u)#define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, u)#define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)#define BOOST_PP_LOCAL_MACRO(n) \    template< class U, BOOST_ASSIGN_PARAMS1(n) > \    generic_list& operator()(U u, BOOST_ASSIGN_PARAMS2(n) ) \    { \        this->push_back(T(u, BOOST_ASSIGN_PARAMS3(n))); \        return *this; \    } \    /**/        #include BOOST_PP_LOCAL_ITERATE()                template< class U >        generic_list& operator,( U u )        {            this->push_back( u );            return *this;        }                template< class U >        generic_list& repeat( std::size_t sz, U u )        {            std::size_t i = 0;            while( i++ != sz )                this->push_back( u );            return *this;        }                template< class Nullary_function >        generic_list& repeat_fun( std::size_t sz, Nullary_function fun )        {            std::size_t i = 0;            while( i++ != sz )                this->push_back( fun() );            return *this;        }                template< class Container >        operator Container() const        {            static Container* c = 0;            BOOST_STATIC_CONSTANT( bool, is_array_flag = sizeof( assign_detail::is_array( c ) )                                    == sizeof( type_traits::yes_type ) );                        typedef BOOST_DEDUCED_TYPENAME mpl::if_c< is_array_flag,                                                      array_type_tag,                                             default_type_tag >::type tag_type;                        return convert( c, tag_type() );        }                template< class Container >        Container convert( const Container*, default_type_tag ) const        {#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)// old Dinkumware doesn't support iterator type as template            Container result;            BOOST_DEDUCED_TYPENAME std::deque<T>::const_iterator                 it = this->begin(), end = this->end();            while( it != end )            {                result.insert( result.end(), *it );                ++it;            }            return result;#else            return Container( this->begin(), this->end() );#endif        }                template< class Array >        Array convert( const Array*, array_type_tag ) const        {            typedef BOOST_DEDUCED_TYPENAME Array::value_type value_type;            Array array;            if( array.size() < this->size() )                throw assign::assignment_exception( "array initialized with too many elements" );            std::size_t n = 0;             BOOST_DEDUCED_TYPENAME std::deque<T>::const_iterator                 i = this->begin(), end = this->end();            for( ; i != end; ++i, ++n )                array[n] = *i;            for( ; n < array.size(); ++n )                array[n] = value_type();            return array;         }                template< class Adapter >        Adapter convert_to_adapter( const Adapter* = 0 ) const        {            Adapter a;            BOOST_DEDUCED_TYPENAME std::deque<T>::const_iterator                 i = this->begin(), end = this->end();            for( ; i != end; ++i )                a.push( *i );            return a;        }            private:        struct adapter_converter;        friend struct adapter_converter;                struct adapter_converter        {            const generic_list& gl;            adapter_converter( const generic_list& this_ ) : gl( this_ )            {}                        adapter_converter( const adapter_converter& r )             : gl( r.gl )            { }                        template< class Adapter >            operator Adapter() const            {                return gl.convert_to_adapter<Adapter>();            }        };            public:         template< class Container >        Container to_container( Container& c ) const        {            return convert( &c, default_type_tag() );         }                adapter_converter to_adapter() const        {            return adapter_converter( *this );        }                template< class Adapter >        Adapter to_adapter( Adapter& a ) const        {            return this->convert_to_adapter( &a );         }        template< class Array >        Array to_array( Array& a ) const        {            return convert( &a, array_type_tag() );        }    };    } // namespace 'assign_detail'namespace assign{    template< class T >    inline assign_detail::generic_list<T>    list_of()    {        return assign_detail::generic_list<T>();    }        template< class T >    inline assign_detail::generic_list<T>     list_of( T t )    {        return assign_detail::generic_list<T>()( t );    }        #define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)#define BOOST_PP_LOCAL_MACRO(n) \    template< class T, class U, BOOST_ASSIGN_PARAMS1(n) > \    inline assign_detail::generic_list<T> \    list_of(U u, BOOST_ASSIGN_PARAMS2(n) ) \    { \        return assign_detail::generic_list<T>()(u, BOOST_ASSIGN_PARAMS3(n)); \    } \    /**/    #include BOOST_PP_LOCAL_ITERATE()    template< class Key, class T >    inline assign_detail::generic_list< std::pair<Key,T> >    map_list_of( Key k, T t )    {        return assign_detail::generic_list< std::pair<Key,T> >()( k, t );    }} // namespace 'assign'} // namespace 'boost'#undef BOOST_ASSIGN_MAX_PARAMS         #undef BOOST_ASSIGN_MAX_PARAMETERS         #undef BOOST_ASSIGN_PARAMS1#undef BOOST_ASSIGN_PARAMS2#undef BOOST_ASSIGN_PARAMS3#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?