construct.hpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // - construct.hpp -- Lambda Library -------------
  2. //
  3. // Copyright (C) 2000 Gary Powell (powellg@amazon.com)
  4. // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // For more information, see http://www.boost.org
  11. //
  12. // -----------------------------------------------
  13. #if !defined(BOOST_LAMBDA_CONSTRUCT_HPP)
  14. #define BOOST_LAMBDA_CONSTRUCT_HPP
  15. #include "boost/type_traits/remove_cv.hpp"
  16. #include "boost/type_traits/is_pointer.hpp"
  17. namespace boost {
  18. namespace lambda {
  19. // constructor is used together with bind. constructor<A> creates a bindable
  20. // function object that passes its arguments forward to a constructor call
  21. // of type A
  22. template<class T> struct constructor {
  23. template <class U> struct sig { typedef T type; };
  24. T operator()() const {
  25. return T();
  26. }
  27. template<class A1>
  28. T operator()(A1& a1) const {
  29. return T(a1);
  30. }
  31. template<class A1, class A2>
  32. T operator()(A1& a1, A2& a2) const {
  33. return T(a1, a2);
  34. }
  35. template<class A1, class A2, class A3>
  36. T operator()(A1& a1, A2& a2, A3& a3) const {
  37. return T(a1, a2, a3);
  38. }
  39. template<class A1, class A2, class A3, class A4>
  40. T operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
  41. return T(a1, a2, a3, a4);
  42. }
  43. template<class A1, class A2, class A3, class A4, class A5>
  44. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
  45. return T(a1, a2, a3, a4, a5);
  46. }
  47. template<class A1, class A2, class A3, class A4, class A5, class A6>
  48. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
  49. return T(a1, a2, a3, a4, a5, a6);
  50. }
  51. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
  52. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
  53. return T(a1, a2, a3, a4, a5, a6, a7);
  54. }
  55. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
  56. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
  57. return T(a1, a2, a3, a4, a5, a6, a7, a8);
  58. }
  59. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
  60. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
  61. return T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  62. }
  63. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
  64. T operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
  65. return T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
  66. }
  67. };
  68. namespace detail {
  69. // A standard conforming compiler could disambiguate between
  70. // A1* and A1&, but not all compilers do that, so we need the
  71. // helpers
  72. template <bool IsPointer>
  73. struct destructor_helper {
  74. template<class A1>
  75. static void exec(A1& a1) {
  76. // remove all the qualifiers, not sure whether it is necessary
  77. typedef typename boost::remove_cv<A1>::type plainA1;
  78. a1.~plainA1();
  79. }
  80. };
  81. template <>
  82. struct destructor_helper<true> {
  83. template<class A1>
  84. static void exec(A1* a1) {
  85. typedef typename boost::remove_cv<A1>::type plainA1;
  86. (*a1).~plainA1();
  87. }
  88. };
  89. }
  90. // destructor funtion object
  91. struct destructor {
  92. template <class T> struct sig { typedef void type; };
  93. template<class A1>
  94. void operator()(A1& a1) const {
  95. typedef typename boost::remove_cv<A1>::type plainA1;
  96. detail::destructor_helper<boost::is_pointer<plainA1>::value>::exec(a1);
  97. }
  98. };
  99. // new_ptr is used together with bind.
  100. // note: placement new is not supported
  101. template<class T> struct new_ptr {
  102. template <class U> struct sig { typedef T* type; };
  103. T* operator()() const {
  104. return new T();
  105. }
  106. template<class A1>
  107. T* operator()(A1& a1) const {
  108. return new T(a1);
  109. }
  110. template<class A1, class A2>
  111. T* operator()(A1& a1, A2& a2) const {
  112. return new T(a1, a2);
  113. }
  114. template<class A1, class A2, class A3>
  115. T* operator()(A1& a1, A2& a2, A3& a3) const {
  116. return new T(a1, a2, a3);
  117. }
  118. template<class A1, class A2, class A3, class A4>
  119. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4) const {
  120. return new T(a1, a2, a3, a4);
  121. }
  122. template<class A1, class A2, class A3, class A4, class A5>
  123. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) const {
  124. return new T(a1, a2, a3, a4, a5);
  125. }
  126. template<class A1, class A2, class A3, class A4, class A5, class A6>
  127. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) const {
  128. return new T(a1, a2, a3, a4, a5, a6);
  129. }
  130. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
  131. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) const {
  132. return new T(a1, a2, a3, a4, a5, a6, a7);
  133. }
  134. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
  135. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) const {
  136. return new T(a1, a2, a3, a4, a5, a6, a7, a8);
  137. }
  138. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
  139. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) const {
  140. return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  141. }
  142. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
  143. T* operator()(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9, A10& a10) const {
  144. return new T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
  145. }
  146. };
  147. // delete_ptr return void
  148. struct delete_ptr {
  149. template <class U> struct sig { typedef void type; };
  150. template <class A1>
  151. void operator()(A1& a1) const {
  152. delete a1;
  153. }
  154. };
  155. // new_array is used together with bind.
  156. template<class T> struct new_array {
  157. template <class U> struct sig { typedef T* type; };
  158. T* operator()(int size) const {
  159. return new T[size];
  160. }
  161. };
  162. // delete_ptr return void
  163. struct delete_array {
  164. template <class U> struct sig { typedef void type; };
  165. template <class A1>
  166. void operator()(A1& a1) const {
  167. delete[] a1;
  168. }
  169. };
  170. } // namespace lambda
  171. } // namespace boost
  172. #endif