1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/ossrv_pub/boost_apis/boost/lambda/construct.hpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,237 @@
1.4 +// - construct.hpp -- Lambda Library -------------
1.5 +//
1.6 +// Copyright (C) 2000 Gary Powell (powellg@amazon.com)
1.7 +// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
1.8 +//
1.9 +// Distributed under the Boost Software License, Version 1.0. (See
1.10 +// accompanying file LICENSE_1_0.txt or copy at
1.11 +// http://www.boost.org/LICENSE_1_0.txt)
1.12 +//
1.13 +// For more information, see http://www.boost.org
1.14 +//
1.15 +// -----------------------------------------------
1.16 +
1.17 +#if !defined(BOOST_LAMBDA_CONSTRUCT_HPP)
1.18 +#define BOOST_LAMBDA_CONSTRUCT_HPP
1.19 +
1.20 +namespace boost {
1.21 +namespace lambda {
1.22 +
1.23 + // constructor is used together with bind. constructor<A> creates a bindable
1.24 + // function object that passes its arguments forward to a constructor call
1.25 + // of type A
1.26 +
1.27 +template<class T> struct constructor {
1.28 +
1.29 + template <class U> struct sig { typedef T type; };
1.30 +
1.31 + T operator()() const {
1.32 + return T();
1.33 + }
1.34 +
1.35 + template<class A1>
1.36 + T operator()(A1& a1) const {
1.37 + return T(a1);
1.38 + }
1.39 +
1.40 + template<class A1, class A2>
1.41 + T operator()(A1& a1, A2& a2) const {
1.42 + return T(a1, a2);
1.43 + }
1.44 +
1.45 + template<class A1, class A2, class A3>
1.46 + T operator()(A1& a1, A2& a2, A3& a3) const {
1.47 + return T(a1, a2, a3);
1.48 + }
1.49 +
1.50 + template<class A1, class A2, class A3, class A4>
1.51 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
1.52 + return T(a1, a2, a3, a4);
1.53 + }
1.54 +
1.55 + template<class A1, class A2, class A3, class A4, class A5>
1.56 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
1.57 + return T(a1, a2, a3, a4, a5);
1.58 + }
1.59 +
1.60 + template<class A1, class A2, class A3, class A4, class A5, class A6>
1.61 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
1.62 + return T(a1, a2, a3, a4, a5, a6);
1.63 + }
1.64 +
1.65 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
1.66 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
1.67 + return T(a1, a2, a3, a4, a5, a6, a7);
1.68 + }
1.69 +
1.70 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
1.71 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
1.72 + return T(a1, a2, a3, a4, a5, a6, a7, a8);
1.73 + }
1.74 +
1.75 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
1.76 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
1.77 + return T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
1.78 + }
1.79 +
1.80 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
1.81 + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
1.82 + return T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
1.83 + }
1.84 +
1.85 +};
1.86 +
1.87 +
1.88 +namespace detail {
1.89 +
1.90 +// A standard conforming compiler could disambiguate between
1.91 +// A1* and A1&, but not all compilers do that, so we need the
1.92 +// helpers
1.93 +
1.94 +
1.95 +template <bool IsPointer>
1.96 +struct destructor_helper {
1.97 +
1.98 + template<class A1>
1.99 + static void exec(A1& a1) {
1.100 + // remove all the qualifiers, not sure whether it is necessary
1.101 + typedef typename boost::remove_cv<A1>::type plainA1;
1.102 + a1.~plainA1();
1.103 + }
1.104 +};
1.105 +
1.106 +template <>
1.107 +struct destructor_helper<true> {
1.108 +
1.109 + template<class A1>
1.110 + static void exec(A1* a1) {
1.111 + typedef typename boost::remove_cv<A1>::type plainA1;
1.112 + (*a1).~plainA1();
1.113 + }
1.114 +};
1.115 +
1.116 +}
1.117 +
1.118 +// destructor funtion object
1.119 +struct destructor {
1.120 +
1.121 + template <class T> struct sig { typedef void type; };
1.122 +
1.123 + template<class A1>
1.124 + void operator()(A1& a1) const {
1.125 + typedef typename boost::remove_cv<A1>::type plainA1;
1.126 + detail::destructor_helper<boost::is_pointer<plainA1>::value>::exec(a1);
1.127 + }
1.128 +};
1.129 +
1.130 +
1.131 +
1.132 +// new_ptr is used together with bind.
1.133 +
1.134 + // note: placement new is not supported
1.135 +
1.136 +template<class T> struct new_ptr {
1.137 +
1.138 + template <class U> struct sig { typedef T* type; };
1.139 +
1.140 + T* operator()() const {
1.141 + return new T();
1.142 + }
1.143 +
1.144 + template<class A1>
1.145 + T* operator()(A1& a1) const {
1.146 + return new T(a1);
1.147 + }
1.148 +
1.149 + template<class A1, class A2>
1.150 + T* operator()(A1& a1, A2& a2) const {
1.151 + return new T(a1, a2);
1.152 + }
1.153 +
1.154 + template<class A1, class A2, class A3>
1.155 + T* operator()(A1& a1, A2& a2, A3& a3) const {
1.156 + return new T(a1, a2, a3);
1.157 + }
1.158 +
1.159 + template<class A1, class A2, class A3, class A4>
1.160 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
1.161 + return new T(a1, a2, a3, a4);
1.162 + }
1.163 +
1.164 + template<class A1, class A2, class A3, class A4, class A5>
1.165 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
1.166 + return new T(a1, a2, a3, a4, a5);
1.167 + }
1.168 +
1.169 + template<class A1, class A2, class A3, class A4, class A5, class A6>
1.170 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
1.171 + return new T(a1, a2, a3, a4, a5, a6);
1.172 + }
1.173 +
1.174 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
1.175 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
1.176 + return new T(a1, a2, a3, a4, a5, a6, a7);
1.177 + }
1.178 +
1.179 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
1.180 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
1.181 + return new T(a1, a2, a3, a4, a5, a6, a7, a8);
1.182 + }
1.183 +
1.184 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
1.185 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
1.186 + return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
1.187 + }
1.188 +
1.189 + template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
1.190 + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
1.191 + return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
1.192 + }
1.193 +
1.194 +};
1.195 +
1.196 +// delete_ptr return void
1.197 +
1.198 +struct delete_ptr {
1.199 +
1.200 + template <class U> struct sig { typedef void type; };
1.201 +
1.202 + template <class A1>
1.203 + void operator()(A1& a1) const {
1.204 + delete a1;
1.205 + }
1.206 +
1.207 +};
1.208 +
1.209 +
1.210 +// new_array is used together with bind.
1.211 +
1.212 +template<class T> struct new_array {
1.213 +
1.214 + template <class U> struct sig { typedef T* type; };
1.215 +
1.216 + T* operator()(int size) const {
1.217 + return new T[size];
1.218 + }
1.219 +};
1.220 +
1.221 +
1.222 +// delete_ptr return void
1.223 +
1.224 +struct delete_array {
1.225 +
1.226 + template <class U> struct sig { typedef void type; };
1.227 +
1.228 + template <class A1>
1.229 + void operator()(A1& a1) const {
1.230 + delete[] a1;
1.231 + }
1.232 +
1.233 +};
1.234 +
1.235 +
1.236 +
1.237 +} // namespace lambda
1.238 +} // namespace boost
1.239 +
1.240 +#endif