Chris@16: // Copyright (C) 2003, Fernando Luis Cacciola Carballal. Chris@16: // Copyright (C) 2007, Tobias Schwinger. Chris@16: // Chris@16: // Use, modification, and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/optional for documentation. Chris@16: // Chris@16: // You are welcome to contact the author at: Chris@16: // fernando_cacciola@hotmail.com Chris@16: // Chris@16: #ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP Chris@16: #ifndef BOOST_PP_IS_ITERATING Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: class in_place_factory_base {} ; Chris@16: Chris@16: #define BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY) Chris@16: #define BOOST_PP_FILENAME_1 Chris@16: #include BOOST_PP_ITERATE() Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #define BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP Chris@16: #else Chris@16: #define N BOOST_PP_ITERATION() Chris@16: Chris@16: #if N Chris@16: template< BOOST_PP_ENUM_PARAMS(N, class A) > Chris@16: #endif Chris@16: class BOOST_PP_CAT(in_place_factory,N) Chris@16: : Chris@16: public in_place_factory_base Chris@16: { Chris@16: public: Chris@16: Chris@16: explicit BOOST_PP_CAT(in_place_factory,N) Chris@16: ( BOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) ) Chris@16: #if N > 0 Chris@16: : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _) Chris@16: #endif Chris@16: {} Chris@16: Chris@16: template Chris@101: void* apply(void* address) const Chris@16: { Chris@16: return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) ); Chris@16: } Chris@16: Chris@16: template Chris@101: void* apply(void* address, std::size_t n) const Chris@16: { Chris@16: for(char* next = address = this->BOOST_NESTED_TEMPLATE apply(address); Chris@16: !! --n;) Chris@16: this->BOOST_NESTED_TEMPLATE apply(next = next+sizeof(T)); Chris@16: return address; Chris@16: } Chris@16: Chris@16: BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) Chris@16: }; Chris@16: Chris@16: #if N > 0 Chris@16: template< BOOST_PP_ENUM_PARAMS(N, class A) > Chris@16: inline BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) > Chris@16: in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) ) Chris@16: { Chris@16: return BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) > Chris@16: ( BOOST_PP_ENUM_PARAMS(N, a) ); Chris@16: } Chris@16: #else Chris@16: inline in_place_factory0 in_place() Chris@16: { Chris@16: return in_place_factory0(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: #undef N Chris@16: #endif Chris@16: #endif Chris@16: