Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / functional / value_factory.hpp
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>
32     result_type operator()(Args&&... args) const {
33         return result_type(std::forward<Args>(args)...);
34     }
35 #else
36     result_type operator()() const {
37         return result_type();
38     }
39
40     template<class A0>
41     result_type operator()(A0& a0) const {
42         return result_type(a0);
43     }
44
45     template<class A0, class A1>
46     result_type operator()(A0& a0, A1& a1) const {
47         return result_type(a0, a1);
48     }
49
50     template<class A0, class A1, class A2>
51     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>
56     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>
61     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>
66     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>
73     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>
80     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>
87     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>
94     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