Chris@16
|
1 // Copyright (C) 2003, Fernando Luis Cacciola Carballal.
|
Chris@16
|
2 // Copyright (C) 2007, Tobias Schwinger.
|
Chris@16
|
3 //
|
Chris@16
|
4 // Use, modification, and distribution is subject to the Boost Software
|
Chris@16
|
5 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //
|
Chris@16
|
8 // See http://www.boost.org/libs/optional for documentation.
|
Chris@16
|
9 //
|
Chris@16
|
10 // You are welcome to contact the author at:
|
Chris@16
|
11 // fernando_cacciola@hotmail.com
|
Chris@16
|
12 //
|
Chris@16
|
13 #ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
|
Chris@16
|
14 #ifndef BOOST_PP_IS_ITERATING
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/utility/detail/in_place_factory_prefix.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost {
|
Chris@16
|
19
|
Chris@16
|
20 class in_place_factory_base {} ;
|
Chris@16
|
21
|
Chris@16
|
22 #define BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
|
Chris@16
|
23 #define BOOST_PP_FILENAME_1 <boost/utility/in_place_factory.hpp>
|
Chris@16
|
24 #include BOOST_PP_ITERATE()
|
Chris@16
|
25
|
Chris@16
|
26 } // namespace boost
|
Chris@16
|
27
|
Chris@16
|
28 #include <boost/utility/detail/in_place_factory_suffix.hpp>
|
Chris@16
|
29
|
Chris@16
|
30 #define BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
|
Chris@16
|
31 #else
|
Chris@16
|
32 #define N BOOST_PP_ITERATION()
|
Chris@16
|
33
|
Chris@16
|
34 #if N
|
Chris@16
|
35 template< BOOST_PP_ENUM_PARAMS(N, class A) >
|
Chris@16
|
36 #endif
|
Chris@16
|
37 class BOOST_PP_CAT(in_place_factory,N)
|
Chris@16
|
38 :
|
Chris@16
|
39 public in_place_factory_base
|
Chris@16
|
40 {
|
Chris@16
|
41 public:
|
Chris@16
|
42
|
Chris@16
|
43 explicit BOOST_PP_CAT(in_place_factory,N)
|
Chris@16
|
44 ( BOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) )
|
Chris@16
|
45 #if N > 0
|
Chris@16
|
46 : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
|
Chris@16
|
47 #endif
|
Chris@16
|
48 {}
|
Chris@16
|
49
|
Chris@16
|
50 template<class T>
|
Chris@101
|
51 void* apply(void* address) const
|
Chris@16
|
52 {
|
Chris@16
|
53 return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
|
Chris@16
|
54 }
|
Chris@16
|
55
|
Chris@16
|
56 template<class T>
|
Chris@101
|
57 void* apply(void* address, std::size_t n) const
|
Chris@16
|
58 {
|
Chris@16
|
59 for(char* next = address = this->BOOST_NESTED_TEMPLATE apply<T>(address);
|
Chris@16
|
60 !! --n;)
|
Chris@16
|
61 this->BOOST_NESTED_TEMPLATE apply<T>(next = next+sizeof(T));
|
Chris@16
|
62 return address;
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
|
Chris@16
|
66 };
|
Chris@16
|
67
|
Chris@16
|
68 #if N > 0
|
Chris@16
|
69 template< BOOST_PP_ENUM_PARAMS(N, class A) >
|
Chris@16
|
70 inline BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
|
Chris@16
|
71 in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
|
Chris@16
|
72 {
|
Chris@16
|
73 return BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
|
Chris@16
|
74 ( BOOST_PP_ENUM_PARAMS(N, a) );
|
Chris@16
|
75 }
|
Chris@16
|
76 #else
|
Chris@16
|
77 inline in_place_factory0 in_place()
|
Chris@16
|
78 {
|
Chris@16
|
79 return in_place_factory0();
|
Chris@16
|
80 }
|
Chris@16
|
81 #endif
|
Chris@16
|
82
|
Chris@16
|
83 #undef N
|
Chris@16
|
84 #endif
|
Chris@16
|
85 #endif
|
Chris@16
|
86
|