1 /* 2 Copyright 2007 Tobias Schwinger 3 4 Copyright 2019 Glen Joseph Fernandes 5 (glenjofe@gmail.com) 6 7 Distributed under the Boost Software License, Version 1.0. 8 (http://www.boost.org/LICENSE_1_0.txt) 9 */ 10 #ifndef BOOST_FUNCTIONAL_VALUE_FACTORY_HPP 11 #define BOOST_FUNCTIONAL_VALUE_FACTORY_HPP 12 13 #include <boost/config.hpp> 14 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \ 15 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 16 #include <utility> 17 #endif 18 19 namespace boost { 20 21 template<class T> 22 class value_factory; 23 24 template<class T> 25 class value_factory { 26 public: 27 typedef T result_type; 28 29 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \ 30 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 31 template<class... Args> operator ()(Args &&...args) const32 result_type operator()(Args&&... args) const { 33 return result_type(std::forward<Args>(args)...); 34 } 35 #else operator ()() const36 result_type operator()() const { 37 return result_type(); 38 } 39 40 template<class A0> operator ()(A0 & a0) const41 result_type operator()(A0& a0) const { 42 return result_type(a0); 43 } 44 45 template<class A0, class A1> operator ()(A0 & a0,A1 & a1) const46 result_type operator()(A0& a0, A1& a1) const { 47 return result_type(a0, a1); 48 } 49 50 template<class A0, class A1, class A2> operator ()(A0 & a0,A1 & a1,A2 & a2) const51 result_type operator()(A0& a0, A1& a1, A2& a2) const { 52 return result_type(a0, a1, a2); 53 } 54 55 template<class A0, class A1, class A2, class A3> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3) const56 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3) const { 57 return result_type(a0, a1, a2, a3); 58 } 59 60 template<class A0, class A1, class A2, class A3, class A4> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4) const61 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4) const { 62 return result_type(a0, a1, a2, a3, a4); 63 } 64 65 template<class A0, class A1, class A2, class A3, class A4, class A5> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5) const66 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4, 67 A5& a5) const { 68 return result_type(a0, a1, a2, a3, a4, a5); 69 } 70 71 template<class A0, class A1, class A2, class A3, class A4, class A5, 72 class A6> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6) const73 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, 74 A6& a6) const { 75 return result_type(a0, a1, a2, a3, a4, a5, a6); 76 } 77 78 template<class A0, class A1, class A2, class A3, class A4, class A5, 79 class A6, class A7> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7) const80 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, 81 A6& a6, A7& a7) const { 82 return result_type(a0, a1, a2, a3, a4, a5, a6, a7); 83 } 84 85 template<class A0, class A1, class A2, class A3, class A4, class A5, 86 class A6, class A7, class A8> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8) const87 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, 88 A6& a6, A7& a7, A8& a8) const { 89 return result_type(a0, a1, a2, a3, a4, a5, a6, a7, a8); 90 } 91 92 template<class A0, class A1, class A2, class A3, class A4, class A5, 93 class A6, class A7, class A8, class A9> operator ()(A0 & a0,A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8,A9 & a9) const94 result_type operator()(A0& a0, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, 95 A6& a6, A7& a7, A8& a8, A9& a9) const { 96 return result_type(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); 97 } 98 #endif 99 }; 100 101 template<class T> 102 class value_factory<T&> { }; 103 104 } /* boost */ 105 106 #endif 107