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