os/ossrv/ossrv_pub/boost_apis/boost/lambda/construct.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// - construct.hpp -- Lambda Library -------------
sl@0
     2
//
sl@0
     3
// Copyright (C) 2000 Gary Powell (powellg@amazon.com)
sl@0
     4
// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
sl@0
     5
//
sl@0
     6
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     7
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     8
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     9
//
sl@0
    10
// For more information, see http://www.boost.org
sl@0
    11
//
sl@0
    12
// -----------------------------------------------
sl@0
    13
sl@0
    14
#if !defined(BOOST_LAMBDA_CONSTRUCT_HPP)
sl@0
    15
#define BOOST_LAMBDA_CONSTRUCT_HPP
sl@0
    16
sl@0
    17
namespace boost { 
sl@0
    18
namespace lambda {
sl@0
    19
sl@0
    20
  // constructor is used together with bind. constructor<A> creates a bindable
sl@0
    21
  // function object that passes its arguments forward to a constructor call
sl@0
    22
  // of type A
sl@0
    23
sl@0
    24
template<class T> struct constructor {
sl@0
    25
sl@0
    26
  template <class U> struct sig { typedef T type; };
sl@0
    27
sl@0
    28
  T operator()() const {
sl@0
    29
    return T();
sl@0
    30
  }
sl@0
    31
sl@0
    32
  template<class A1>
sl@0
    33
  T operator()(A1& a1) const {
sl@0
    34
    return T(a1);
sl@0
    35
  }
sl@0
    36
sl@0
    37
  template<class A1, class A2>
sl@0
    38
  T operator()(A1& a1, A2& a2) const {
sl@0
    39
    return T(a1, a2);
sl@0
    40
  }
sl@0
    41
sl@0
    42
  template<class A1, class A2, class A3>
sl@0
    43
  T operator()(A1& a1, A2& a2, A3& a3) const {
sl@0
    44
    return T(a1, a2, a3);
sl@0
    45
  }
sl@0
    46
sl@0
    47
  template<class A1, class A2, class A3, class A4>
sl@0
    48
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
sl@0
    49
    return T(a1, a2, a3, a4);
sl@0
    50
  }
sl@0
    51
sl@0
    52
  template<class A1, class A2, class A3, class A4, class A5>
sl@0
    53
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
sl@0
    54
    return T(a1, a2, a3, a4, a5);
sl@0
    55
  }
sl@0
    56
sl@0
    57
  template<class A1, class A2, class A3, class A4, class A5, class A6>
sl@0
    58
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
sl@0
    59
    return T(a1, a2, a3, a4, a5, a6);
sl@0
    60
  }
sl@0
    61
sl@0
    62
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
sl@0
    63
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
sl@0
    64
    return T(a1, a2, a3, a4, a5, a6, a7);
sl@0
    65
  }
sl@0
    66
sl@0
    67
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
sl@0
    68
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
sl@0
    69
    return T(a1, a2, a3, a4, a5, a6, a7, a8);
sl@0
    70
  }
sl@0
    71
sl@0
    72
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
sl@0
    73
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
sl@0
    74
    return T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
sl@0
    75
  }
sl@0
    76
sl@0
    77
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
sl@0
    78
  T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
sl@0
    79
    return T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
sl@0
    80
  }
sl@0
    81
sl@0
    82
};
sl@0
    83
sl@0
    84
sl@0
    85
namespace detail {
sl@0
    86
sl@0
    87
// A standard conforming compiler could disambiguate between
sl@0
    88
// A1* and A1&, but not all compilers do that, so we need the
sl@0
    89
// helpers
sl@0
    90
sl@0
    91
sl@0
    92
template <bool IsPointer>
sl@0
    93
struct destructor_helper {
sl@0
    94
sl@0
    95
  template<class A1>
sl@0
    96
  static void exec(A1& a1) {
sl@0
    97
    // remove all the qualifiers, not sure whether it is necessary
sl@0
    98
    typedef typename boost::remove_cv<A1>::type plainA1;
sl@0
    99
     a1.~plainA1();
sl@0
   100
  }
sl@0
   101
};
sl@0
   102
sl@0
   103
template <>
sl@0
   104
struct destructor_helper<true> {
sl@0
   105
sl@0
   106
  template<class A1>
sl@0
   107
  static void exec(A1* a1) {
sl@0
   108
    typedef typename boost::remove_cv<A1>::type plainA1;
sl@0
   109
    (*a1).~plainA1();
sl@0
   110
  }
sl@0
   111
};
sl@0
   112
sl@0
   113
}
sl@0
   114
sl@0
   115
// destructor funtion object
sl@0
   116
struct destructor {  
sl@0
   117
sl@0
   118
  template <class T> struct sig { typedef void type; };  
sl@0
   119
sl@0
   120
  template<class A1>
sl@0
   121
  void operator()(A1& a1) const {
sl@0
   122
    typedef typename boost::remove_cv<A1>::type plainA1;
sl@0
   123
    detail::destructor_helper<boost::is_pointer<plainA1>::value>::exec(a1);
sl@0
   124
  }
sl@0
   125
};
sl@0
   126
sl@0
   127
sl@0
   128
sl@0
   129
// new_ptr is used together with bind.
sl@0
   130
sl@0
   131
  // note: placement new is not supported
sl@0
   132
sl@0
   133
template<class T> struct new_ptr {
sl@0
   134
sl@0
   135
  template <class U> struct sig { typedef T* type; };  
sl@0
   136
sl@0
   137
  T* operator()() const {
sl@0
   138
    return new T();
sl@0
   139
  }
sl@0
   140
sl@0
   141
  template<class A1>
sl@0
   142
  T* operator()(A1& a1) const {
sl@0
   143
    return new T(a1);
sl@0
   144
  }
sl@0
   145
sl@0
   146
  template<class A1, class A2>
sl@0
   147
  T* operator()(A1& a1, A2& a2) const {
sl@0
   148
    return new T(a1, a2);
sl@0
   149
  }
sl@0
   150
sl@0
   151
  template<class A1, class A2, class A3>
sl@0
   152
  T* operator()(A1& a1, A2& a2, A3& a3) const {
sl@0
   153
    return new T(a1, a2, a3);
sl@0
   154
  }
sl@0
   155
sl@0
   156
  template<class A1, class A2, class A3, class A4>
sl@0
   157
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
sl@0
   158
    return new T(a1, a2, a3, a4);
sl@0
   159
  }
sl@0
   160
sl@0
   161
  template<class A1, class A2, class A3, class A4, class A5>
sl@0
   162
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
sl@0
   163
    return new T(a1, a2, a3, a4, a5);
sl@0
   164
  }
sl@0
   165
sl@0
   166
  template<class A1, class A2, class A3, class A4, class A5, class A6>
sl@0
   167
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
sl@0
   168
    return new T(a1, a2, a3, a4, a5, a6);
sl@0
   169
  }
sl@0
   170
sl@0
   171
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
sl@0
   172
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
sl@0
   173
    return new T(a1, a2, a3, a4, a5, a6, a7);
sl@0
   174
  }
sl@0
   175
sl@0
   176
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
sl@0
   177
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
sl@0
   178
    return new T(a1, a2, a3, a4, a5, a6, a7, a8);
sl@0
   179
  }
sl@0
   180
sl@0
   181
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
sl@0
   182
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
sl@0
   183
    return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
sl@0
   184
  }
sl@0
   185
sl@0
   186
  template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
sl@0
   187
  T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
sl@0
   188
    return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
sl@0
   189
  }
sl@0
   190
sl@0
   191
};
sl@0
   192
sl@0
   193
// delete_ptr return void
sl@0
   194
sl@0
   195
struct delete_ptr {
sl@0
   196
sl@0
   197
  template <class U> struct sig { typedef void type; };  
sl@0
   198
sl@0
   199
  template <class A1>
sl@0
   200
  void operator()(A1& a1) const {
sl@0
   201
    delete a1;
sl@0
   202
  }
sl@0
   203
sl@0
   204
};
sl@0
   205
sl@0
   206
sl@0
   207
// new_array is used together with bind.
sl@0
   208
sl@0
   209
template<class T> struct new_array {
sl@0
   210
sl@0
   211
  template <class U> struct sig { typedef T* type; };  
sl@0
   212
sl@0
   213
  T* operator()(int size) const {
sl@0
   214
    return new T[size];
sl@0
   215
  }
sl@0
   216
};
sl@0
   217
sl@0
   218
sl@0
   219
// delete_ptr return void
sl@0
   220
sl@0
   221
struct delete_array {
sl@0
   222
sl@0
   223
  template <class U> struct sig { typedef void type; };  
sl@0
   224
sl@0
   225
  template <class A1>
sl@0
   226
  void operator()(A1& a1) const {
sl@0
   227
    delete[] a1;
sl@0
   228
  }
sl@0
   229
sl@0
   230
};
sl@0
   231
sl@0
   232
sl@0
   233
sl@0
   234
} // namespace lambda 
sl@0
   235
} // namespace boost
sl@0
   236
sl@0
   237
#endif