123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // Boost.Assign library
- //
- // Copyright Thorsten Ottosen 2006. 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_PTR_CONTAINER_PTR_MAP_INSERTER_HPP
- #define BOOST_ASSIGN_PTR_CONTAINER_PTR_MAP_INSERTER_HPP
- #if defined(_MSC_VER)
- # pragma once
- #endif
- #include <boost/assign/list_inserter.hpp>
- #include <boost/type_traits/remove_reference.hpp>
- #include <boost/type_traits/remove_pointer.hpp>
- #include <boost/move/utility.hpp>
- #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
- #include <boost/preprocessor/repetition/enum_binary_params.hpp>
- #include <boost/preprocessor/repetition/enum_params.hpp>
- #include <boost/preprocessor/iteration/local.hpp>
- #endif
- namespace boost
- {
- namespace assign
- {
- template< class PtrMap, class Obj >
- class ptr_map_inserter
- {
- typedef BOOST_DEDUCED_TYPENAME
- remove_pointer< BOOST_DEDUCED_TYPENAME
- remove_reference<Obj>::type >::type
- obj_type;
- typedef BOOST_DEDUCED_TYPENAME PtrMap::key_type
- key_type;
-
- public:
-
- ptr_map_inserter( PtrMap& m ) : m_( m )
- {}
- #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
- template< class Key >
- ptr_map_inserter& operator()( const Key& t )
- {
- key_type k(t);
- m_.insert( k, new obj_type );
- return *this;
- }
- #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value
- #define BOOST_ASSIGN_MAX_PARAMS 6
- #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) > \
- ptr_map_inserter& operator()( const T& t, BOOST_ASSIGN_PARAMS2(n) ) \
- { \
- key_type k(t); \
- m_.insert( k, new obj_type( BOOST_ASSIGN_PARAMS3(n) ) ); \
- return *this; \
- } \
- /**/
-
- #include BOOST_PP_LOCAL_ITERATE()
- #else
- template< class Key, class... Ts >
- ptr_map_inserter& operator()(Key&& k, Ts&&... ts)
- {
- key_type key(boost::forward<Key>(k));
- m_.insert(key, new obj_type(boost::forward<Ts>(ts)...));
- return *this;
- }
- #endif
- private:
- ptr_map_inserter& operator=( const ptr_map_inserter& );
- PtrMap& m_;
- };
-
- template< class PtrMap >
- inline ptr_map_inserter< PtrMap, typename PtrMap::mapped_reference >
- ptr_map_insert( PtrMap& m )
- {
- return ptr_map_inserter< PtrMap, typename PtrMap::mapped_reference >( m );
- }
- #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- template< class T, class PtrMap >
- inline ptr_map_inserter< PtrMap, T >
- ptr_map_insert( PtrMap& m )
- {
- return ptr_map_inserter< PtrMap, T >( m );
- }
- #endif
-
- } // namespace 'assign'
- } // namespace 'boost'
- #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
- #undef BOOST_ASSIGN_PARAMS1
- #undef BOOST_ASSIGN_PARAMS2
- #undef BOOST_ASSIGN_PARAMS3
- #undef BOOST_ASSIGN_MAX_PARAMETERS
- #endif
- #endif
|