Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Sacado_mpl_bind.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Sacado Package
4 //
5 // Copyright 2006 NTESS and the Sacado contributors.
6 // SPDX-License-Identifier: LGPL-2.1-or-later
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef SACADO_MPL_BIND_HPP
11 #define SACADO_MPL_BIND_HPP
12 
13 #include <type_traits>
14 
17 
18 namespace Sacado {
19 
20  namespace mpl {
21 
22  template <int k, class F, class T1, class T2, class T3, class T4, class T5>
23  struct hk { typedef F type; };
24 
25  template <int k, int N, class T1, class T2, class T3, class T4, class T5>
26  struct hk<k,arg<N>,T1,T2,T3,T4,T5> :
27  apply_wrap<arg<N>,T1,T2,T3,T4,T5> {};
28 
29  template <int k, class T1, class T2, class T3, class T4, class T5>
30  struct hk<k,arg<-1>,T1,T2,T3,T4,T5> :
31  apply_wrap<arg<k>,T1,T2,T3,T4,T5> {};
32 
33  template <class F, class T1>
34  struct bind1 {
35  template <class U1=mpl::none,
36  class U2=mpl::none,
37  class U3=mpl::none,
38  class U4=mpl::none,
39  class U5=mpl::none>
40  struct apply :
41  apply_wrap1<F,
42  typename hk<std::is_same<T1,placeholders::_>::value,
43  T1,
44  U1,U2,U3,U4,U5>::type> {};
45  };
46 
47  template <class F, class T1, class T2>
48  struct bind2 {
49  template <class U1=mpl::none,
50  class U2=mpl::none,
51  class U3=mpl::none,
52  class U4=mpl::none,
53  class U5=mpl::none>
54  struct apply :
55  apply_wrap2<F,
56  typename hk<std::is_same<T1,placeholders::_>::value,
57  T1,
58  U1,U2,U3,U4,U5>::type,
59  typename hk<std::is_same<T1,placeholders::_>::value+
60  std::is_same<T2,placeholders::_>::value,
61  T2,
62  U1,U2,U3,U4,U5>::type> {};
63  };
64 
65  template <class F, class T1, class T2, class T3>
66  struct bind3 {
67  template <class U1=mpl::none,
68  class U2=mpl::none,
69  class U3=mpl::none,
70  class U4=mpl::none,
71  class U5=mpl::none>
72  struct apply :
73  apply_wrap3<F,
74  typename hk<std::is_same<T1,placeholders::_>::value,
75  T1,
76  U1,U2,U3,U4,U5>::type,
77  typename hk<std::is_same<T1,placeholders::_>::value+
78  std::is_same<T2,placeholders::_>::value,
79  T2,
80  U1,U2,U3,U4,U5>::type,
81  typename hk<std::is_same<T1,placeholders::_>::value+
82  std::is_same<T2,placeholders::_>::value+
83  std::is_same<T3,placeholders::_>::value,
84  T3,
85  U1,U2,U3,U4,U5>::type> {};
86  };
87 
88  template <class F, class T1, class T2, class T3, class T4>
89  struct bind4 {
90  template <class U1=mpl::none,
91  class U2=mpl::none,
92  class U3=mpl::none,
93  class U4=mpl::none,
94  class U5=mpl::none>
95  struct apply :
96  apply_wrap4<F,
97  typename hk<std::is_same<T1,placeholders::_>::value,
98  T1,
99  U1,U2,U3,U4,U5>::type,
100  typename hk<std::is_same<T1,placeholders::_>::value+
101  std::is_same<T2,placeholders::_>::value,
102  T2,
103  U1,U2,U3,U4,U5>::type,
104  typename hk<std::is_same<T1,placeholders::_>::value+
105  std::is_same<T2,placeholders::_>::value+
106  std::is_same<T3,placeholders::_>::value,
107  T3,
108  U1,U2,U3,U4,U5>::type,
109  typename hk<std::is_same<T1,placeholders::_>::value+
110  std::is_same<T2,placeholders::_>::value+
111  std::is_same<T3,placeholders::_>::value+
112  std::is_same<T4,placeholders::_>::value,
113  T4,
114  U1,U2,U3,U4,U5>::type> {};
115  };
116 
117  template <class F, class T1, class T2, class T3, class T4, class T5>
118  struct bind5 {
119  template <class U1=mpl::none,
120  class U2=mpl::none,
121  class U3=mpl::none,
122  class U4=mpl::none,
123  class U5=mpl::none>
124  struct apply :
125  apply_wrap5<F,
126  typename hk<std::is_same<T1,placeholders::_>::value,
127  T1,
128  U1,U2,U3,U4,U5>::type,
129  typename hk<std::is_same<T1,placeholders::_>::value+
130  std::is_same<T2,placeholders::_>::value,
131  T2,
132  U1,U2,U3,U4,U5>::type,
133  typename hk<std::is_same<T1,placeholders::_>::value+
134  std::is_same<T2,placeholders::_>::value+
135  std::is_same<T3,placeholders::_>::value,
136  T3,
137  U1,U2,U3,U4,U5>::type,
138  typename hk<std::is_same<T1,placeholders::_>::value+
139  std::is_same<T2,placeholders::_>::value+
140  std::is_same<T3,placeholders::_>::value+
141  std::is_same<T4,placeholders::_>::value,
142  T4,
143  U1,U2,U3,U4,U5>::type,
144  typename hk<std::is_same<T1,placeholders::_>::value+
145  std::is_same<T2,placeholders::_>::value+
146  std::is_same<T3,placeholders::_>::value+
147  std::is_same<T4,placeholders::_>::value+
148  std::is_same<T5,placeholders::_>::value,
149  T5,
150  U1,U2,U3,U4,U5>::type> {};
151  };
152 
153  } // namespace mpl
154 
155 } // namespace Sacado
156 
157 #endif // SACADO_MPL_BIND_HPP
#define T2(r, f)
Definition: Sacado_rad.hpp:558
#define T1(r, f)
Definition: Sacado_rad.hpp:583
const int N