• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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