diff -r 000000000000 -r e4d67989cc36 ossrv_pub/boost_apis/boost/lambda/construct.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ossrv_pub/boost_apis/boost/lambda/construct.hpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,237 @@ +// - construct.hpp -- Lambda Library ------------- +// +// Copyright (C) 2000 Gary Powell (powellg@amazon.com) +// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// For more information, see http://www.boost.org +// +// ----------------------------------------------- + +#if !defined(BOOST_LAMBDA_CONSTRUCT_HPP) +#define BOOST_LAMBDA_CONSTRUCT_HPP + +namespace boost { +namespace lambda { + + // constructor is used together with bind. constructor creates a bindable + // function object that passes its arguments forward to a constructor call + // of type A + +template struct constructor { + + template struct sig { typedef T type; }; + + T operator()() const { + return T(); + } + + template + T operator()(A1& a1) const { + return T(a1); + } + + template + T operator()(A1& a1, A2& a2) const { + return T(a1, a2); + } + + template + T operator()(A1& a1, A2& a2, A3& a3) const { + return T(a1, a2, a3); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4) const { + return T(a1, a2, a3, a4); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const { + return T(a1, a2, a3, a4, a5); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const { + return T(a1, a2, a3, a4, a5, a6); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const { + return T(a1, a2, a3, a4, a5, a6, a7); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const { + return T(a1, a2, a3, a4, a5, a6, a7, a8); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const { + return T(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } + + template + T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const { + return T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } + +}; + + +namespace detail { + +// A standard conforming compiler could disambiguate between +// A1* and A1&, but not all compilers do that, so we need the +// helpers + + +template +struct destructor_helper { + + template + static void exec(A1& a1) { + // remove all the qualifiers, not sure whether it is necessary + typedef typename boost::remove_cv::type plainA1; + a1.~plainA1(); + } +}; + +template <> +struct destructor_helper { + + template + static void exec(A1* a1) { + typedef typename boost::remove_cv::type plainA1; + (*a1).~plainA1(); + } +}; + +} + +// destructor funtion object +struct destructor { + + template struct sig { typedef void type; }; + + template + void operator()(A1& a1) const { + typedef typename boost::remove_cv::type plainA1; + detail::destructor_helper::value>::exec(a1); + } +}; + + + +// new_ptr is used together with bind. + + // note: placement new is not supported + +template struct new_ptr { + + template struct sig { typedef T* type; }; + + T* operator()() const { + return new T(); + } + + template + T* operator()(A1& a1) const { + return new T(a1); + } + + template + T* operator()(A1& a1, A2& a2) const { + return new T(a1, a2); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3) const { + return new T(a1, a2, a3); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4) const { + return new T(a1, a2, a3, a4); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const { + return new T(a1, a2, a3, a4, a5); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const { + return new T(a1, a2, a3, a4, a5, a6); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const { + return new T(a1, a2, a3, a4, a5, a6, a7); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const { + return new T(a1, a2, a3, a4, a5, a6, a7, a8); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const { + return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } + + template + T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const { + return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } + +}; + +// delete_ptr return void + +struct delete_ptr { + + template struct sig { typedef void type; }; + + template + void operator()(A1& a1) const { + delete a1; + } + +}; + + +// new_array is used together with bind. + +template struct new_array { + + template struct sig { typedef T* type; }; + + T* operator()(int size) const { + return new T[size]; + } +}; + + +// delete_ptr return void + +struct delete_array { + + template struct sig { typedef void type; }; + + template + void operator()(A1& a1) const { + delete[] a1; + } + +}; + + + +} // namespace lambda +} // namespace boost + +#endif