source: NonGTP/Boost/boost/utility/typed_in_place_factory.hpp @ 857

Revision 857, 2.0 KB checked in by igarcia, 18 years ago (diff)
Line 
1// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
2//
3// Use, modification, and distribution is subject to the Boost Software
4// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6//
7// See http://www.boost.org/lib/optional for documentation.
8//
9// You are welcome to contact the author at:
10//  fernando_cacciola@hotmail.com
11//
12#ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP
13#define BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP
14
15#include <boost/utility/detail/in_place_factory_prefix.hpp>
16
17namespace boost {
18
19class typed_in_place_factory_base {} ;
20
21#define BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS(z,n,_) \
22template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
23class BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) : public typed_in_place_factory_base \
24{ \
25public: \
26\
27  typedef T value_type ; \
28\
29  BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A,const& a) ) \
30    : \
31    BOOST_PP_ENUM( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _ ) \
32  {} \
33\
34  void apply ( void* address ) const \
35  { \
36    new ( address ) T ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), m_a ) ) ; \
37  } \
38\
39  BOOST_PP_REPEAT( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) \
40} ; \
41\
42template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \
43BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T , BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
44in_place ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A, const& a) ) \
45{ \
46  return BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T, BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \
47           ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), a ) ) ; \
48} ; \
49
50BOOST_PP_REPEAT( BOOST_MAX_INPLACE_FACTORY_ARITY, BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS, BOOST_PP_EMPTY() )
51
52} // namespace boost
53
54#include <boost/utility/detail/in_place_factory_suffix.hpp>
55
56#endif
57
Note: See TracBrowser for help on using the repository browser.