~ubuntu-branches/ubuntu/natty/deal.ii/natty

« back to all changes in this revision

Viewing changes to contrib/boost/include/boost/utility/in_place_factory.hpp

  • Committer: Bazaar Package Importer
  • Author(s): Adam C. Powell, IV
  • Date: 2009-05-08 23:13:50 UTC
  • Revision ID: james.westby@ubuntu.com-20090508231350-rrh1ltgi0tifabwc
Tags: upstream-6.2.0
ImportĀ upstreamĀ versionĀ 6.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// 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/lib/optional for documentation.
 
9
//
 
10
// You are welcome to contact the author at:
 
11
//  fernando_cacciola@hotmail.com
 
12
//
 
13
#ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
 
14
#ifndef BOOST_PP_IS_ITERATING
 
15
 
 
16
#include <boost/utility/detail/in_place_factory_prefix.hpp>
 
17
 
 
18
namespace boost {
 
19
 
 
20
class in_place_factory_base {} ;
 
21
 
 
22
#define  BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
 
23
#define  BOOST_PP_FILENAME_1 <boost/utility/in_place_factory.hpp>
 
24
#include BOOST_PP_ITERATE()
 
25
 
 
26
} // namespace boost
 
27
 
 
28
#include <boost/utility/detail/in_place_factory_suffix.hpp>
 
29
 
 
30
#define BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
 
31
#else
 
32
#define N BOOST_PP_ITERATION()
 
33
 
 
34
#if N
 
35
template< BOOST_PP_ENUM_PARAMS(N, class A) >
 
36
#endif
 
37
class BOOST_PP_CAT(in_place_factory,N)
 
38
  : 
 
39
  public in_place_factory_base
 
40
{
 
41
public:
 
42
 
 
43
  explicit BOOST_PP_CAT(in_place_factory,N)
 
44
      ( BOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) )
 
45
#if N > 0
 
46
    : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
 
47
#endif
 
48
  {}
 
49
 
 
50
  template<class T>
 
51
  void* apply(void* address
 
52
      BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
 
53
  {
 
54
    return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
 
55
  }
 
56
 
 
57
  template<class T>
 
58
  void* apply(void* address, std::size_t n
 
59
      BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
 
60
  {
 
61
    for(char* next = address = this->BOOST_NESTED_TEMPLATE apply<T>(address);
 
62
        !! --n;)
 
63
      this->BOOST_NESTED_TEMPLATE apply<T>(next = next+sizeof(T));
 
64
    return address; 
 
65
  }
 
66
 
 
67
  BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
 
68
};
 
69
 
 
70
#if N > 0
 
71
template< BOOST_PP_ENUM_PARAMS(N, class A) >
 
72
inline BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
 
73
in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
 
74
{
 
75
  return BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
 
76
      ( BOOST_PP_ENUM_PARAMS(N, a) );
 
77
}
 
78
#else
 
79
inline in_place_factory0 in_place()
 
80
{
 
81
  return in_place_factory0();
 
82
}
 
83
#endif
 
84
 
 
85
#undef N
 
86
#endif
 
87
#endif
 
88