blob: cc077dd38216bb93b2ce89bce82c42f97ca10000 [file] [log] [blame]
Jeff Thompsonef2d5a42013-08-22 19:09:24 -07001// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
2// Copyright (C) 2007, Tobias Schwinger.
3//
4// Use, modification, and distribution is subject to the Boost Software
5// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7//
8// See http://www.boost.org/libs/optional for documentation.
9//
10// You are welcome to contact the author at:
11// fernando_cacciola@hotmail.com
12//
Jeff Thompson3d613fd2013-10-15 15:39:04 -070013#ifndef NDNBOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
14#ifndef NDNBOOST_PP_IS_ITERATING
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070015
16#include <ndnboost/utility/detail/in_place_factory_prefix.hpp>
17
18namespace ndnboost {
19
20class in_place_factory_base {} ;
21
Jeff Thompson3d613fd2013-10-15 15:39:04 -070022#define NDNBOOST_PP_ITERATION_LIMITS (0, NDNBOOST_MAX_INPLACE_FACTORY_ARITY)
23#define NDNBOOST_PP_FILENAME_1 <ndnboost/utility/in_place_factory.hpp>
24#include NDNBOOST_PP_ITERATE()
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070025
26} // namespace ndnboost
27
28#include <ndnboost/utility/detail/in_place_factory_suffix.hpp>
29
Jeff Thompson3d613fd2013-10-15 15:39:04 -070030#define NDNBOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070031#else
Jeff Thompson3d613fd2013-10-15 15:39:04 -070032#define N NDNBOOST_PP_ITERATION()
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070033
34#if N
Jeff Thompson3d613fd2013-10-15 15:39:04 -070035template< NDNBOOST_PP_ENUM_PARAMS(N, class A) >
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070036#endif
Jeff Thompson3d613fd2013-10-15 15:39:04 -070037class NDNBOOST_PP_CAT(in_place_factory,N)
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070038 :
39 public in_place_factory_base
40{
41public:
42
Jeff Thompson3d613fd2013-10-15 15:39:04 -070043 explicit NDNBOOST_PP_CAT(in_place_factory,N)
44 ( NDNBOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) )
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070045#if N > 0
Jeff Thompson3d613fd2013-10-15 15:39:04 -070046 : NDNBOOST_PP_ENUM(N, NDNBOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070047#endif
48 {}
49
50 template<class T>
51 void* apply(void* address
Jeff Thompson3d613fd2013-10-15 15:39:04 -070052 NDNBOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070053 {
Jeff Thompson3d613fd2013-10-15 15:39:04 -070054 return new(address) T( NDNBOOST_PP_ENUM_PARAMS(N, m_a) );
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070055 }
56
57 template<class T>
58 void* apply(void* address, std::size_t n
Jeff Thompson3d613fd2013-10-15 15:39:04 -070059 NDNBOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070060 {
Jeff Thompson3d613fd2013-10-15 15:39:04 -070061 for(char* next = address = this->NDNBOOST_NESTED_TEMPLATE apply<T>(address);
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070062 !! --n;)
Jeff Thompson3d613fd2013-10-15 15:39:04 -070063 this->NDNBOOST_NESTED_TEMPLATE apply<T>(next = next+sizeof(T));
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070064 return address;
65 }
66
Jeff Thompson3d613fd2013-10-15 15:39:04 -070067 NDNBOOST_PP_REPEAT(N, NDNBOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070068};
69
70#if N > 0
Jeff Thompson3d613fd2013-10-15 15:39:04 -070071template< NDNBOOST_PP_ENUM_PARAMS(N, class A) >
72inline NDNBOOST_PP_CAT(in_place_factory,N)< NDNBOOST_PP_ENUM_PARAMS(N, A) >
73in_place( NDNBOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070074{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070075 return NDNBOOST_PP_CAT(in_place_factory,N)< NDNBOOST_PP_ENUM_PARAMS(N, A) >
76 ( NDNBOOST_PP_ENUM_PARAMS(N, a) );
Jeff Thompsonef2d5a42013-08-22 19:09:24 -070077}
78#else
79inline in_place_factory0 in_place()
80{
81 return in_place_factory0();
82}
83#endif
84
85#undef N
86#endif
87#endif
88