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