Sacado Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Sacado_mpl_bind.hpp
Go to the documentation of this file.
1// $Id$
2// $Source$
3// @HEADER
4// ***********************************************************************
5//
6// Sacado Package
7// Copyright (2006) Sandia Corporation
8//
9// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10// the U.S. Government retains certain rights in this software.
11//
12// This library is free software; you can redistribute it and/or modify
13// it under the terms of the GNU Lesser General Public License as
14// published by the Free Software Foundation; either version 2.1 of the
15// License, or (at your option) any later version.
16//
17// This library is distributed in the hope that it will be useful, but
18// WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20// Lesser General Public License for more details.
21//
22// You should have received a copy of the GNU Lesser General Public
23// License along with this library; if not, write to the Free Software
24// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
25// USA
26// Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
27// (etphipp@sandia.gov).
28//
29// ***********************************************************************
30// @HEADER
31
32#ifndef SACADO_MPL_BIND_HPP
33#define SACADO_MPL_BIND_HPP
34
35#include <type_traits>
36
39
40namespace Sacado {
41
42 namespace mpl {
43
44 template <int k, class F, class T1, class T2, class T3, class T4, class T5>
45 struct hk { typedef F type; };
46
47 template <int k, int N, class T1, class T2, class T3, class T4, class T5>
48 struct hk<k,arg<N>,T1,T2,T3,T4,T5> :
49 apply_wrap<arg<N>,T1,T2,T3,T4,T5> {};
50
51 template <int k, class T1, class T2, class T3, class T4, class T5>
52 struct hk<k,arg<-1>,T1,T2,T3,T4,T5> :
53 apply_wrap<arg<k>,T1,T2,T3,T4,T5> {};
54
55 template <class F, class T1>
56 struct bind1 {
57 template <class U1=mpl::none,
58 class U2=mpl::none,
59 class U3=mpl::none,
60 class U4=mpl::none,
61 class U5=mpl::none>
62 struct apply :
64 typename hk<std::is_same<T1,placeholders::_>::value,
65 T1,
66 U1,U2,U3,U4,U5>::type> {};
67 };
68
69 template <class F, class T1, class T2>
70 struct bind2 {
71 template <class U1=mpl::none,
72 class U2=mpl::none,
73 class U3=mpl::none,
74 class U4=mpl::none,
75 class U5=mpl::none>
76 struct apply :
78 typename hk<std::is_same<T1,placeholders::_>::value,
79 T1,
80 U1,U2,U3,U4,U5>::type,
81 typename hk<std::is_same<T1,placeholders::_>::value+
82 std::is_same<T2,placeholders::_>::value,
83 T2,
84 U1,U2,U3,U4,U5>::type> {};
85 };
86
87 template <class F, class T1, class T2, class T3>
88 struct bind3 {
89 template <class U1=mpl::none,
90 class U2=mpl::none,
91 class U3=mpl::none,
92 class U4=mpl::none,
93 class U5=mpl::none>
94 struct apply :
96 typename hk<std::is_same<T1,placeholders::_>::value,
97 T1,
98 U1,U2,U3,U4,U5>::type,
99 typename hk<std::is_same<T1,placeholders::_>::value+
100 std::is_same<T2,placeholders::_>::value,
101 T2,
102 U1,U2,U3,U4,U5>::type,
103 typename hk<std::is_same<T1,placeholders::_>::value+
104 std::is_same<T2,placeholders::_>::value+
105 std::is_same<T3,placeholders::_>::value,
106 T3,
107 U1,U2,U3,U4,U5>::type> {};
108 };
109
110 template <class F, class T1, class T2, class T3, class T4>
111 struct bind4 {
112 template <class U1=mpl::none,
113 class U2=mpl::none,
114 class U3=mpl::none,
115 class U4=mpl::none,
116 class U5=mpl::none>
117 struct apply :
118 apply_wrap4<F,
119 typename hk<std::is_same<T1,placeholders::_>::value,
120 T1,
121 U1,U2,U3,U4,U5>::type,
122 typename hk<std::is_same<T1,placeholders::_>::value+
123 std::is_same<T2,placeholders::_>::value,
124 T2,
125 U1,U2,U3,U4,U5>::type,
126 typename hk<std::is_same<T1,placeholders::_>::value+
127 std::is_same<T2,placeholders::_>::value+
128 std::is_same<T3,placeholders::_>::value,
129 T3,
130 U1,U2,U3,U4,U5>::type,
131 typename hk<std::is_same<T1,placeholders::_>::value+
132 std::is_same<T2,placeholders::_>::value+
133 std::is_same<T3,placeholders::_>::value+
134 std::is_same<T4,placeholders::_>::value,
135 T4,
136 U1,U2,U3,U4,U5>::type> {};
137 };
138
139 template <class F, class T1, class T2, class T3, class T4, class T5>
140 struct bind5 {
141 template <class U1=mpl::none,
142 class U2=mpl::none,
143 class U3=mpl::none,
144 class U4=mpl::none,
145 class U5=mpl::none>
146 struct apply :
147 apply_wrap5<F,
148 typename hk<std::is_same<T1,placeholders::_>::value,
149 T1,
150 U1,U2,U3,U4,U5>::type,
151 typename hk<std::is_same<T1,placeholders::_>::value+
152 std::is_same<T2,placeholders::_>::value,
153 T2,
154 U1,U2,U3,U4,U5>::type,
155 typename hk<std::is_same<T1,placeholders::_>::value+
156 std::is_same<T2,placeholders::_>::value+
157 std::is_same<T3,placeholders::_>::value,
158 T3,
159 U1,U2,U3,U4,U5>::type,
160 typename hk<std::is_same<T1,placeholders::_>::value+
161 std::is_same<T2,placeholders::_>::value+
162 std::is_same<T3,placeholders::_>::value+
163 std::is_same<T4,placeholders::_>::value,
164 T4,
165 U1,U2,U3,U4,U5>::type,
166 typename hk<std::is_same<T1,placeholders::_>::value+
167 std::is_same<T2,placeholders::_>::value+
168 std::is_same<T3,placeholders::_>::value+
169 std::is_same<T4,placeholders::_>::value+
170 std::is_same<T5,placeholders::_>::value,
171 T5,
172 U1,U2,U3,U4,U5>::type> {};
173 };
174
175 } // namespace mpl
176
177} // namespace Sacado
178
179#endif // SACADO_MPL_BIND_HPP
#define T1(r, f)
#define F
#define T2(r, f)
const int N