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 // $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 
40 namespace 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 :
63  apply_wrap1<F,
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 :
77  apply_wrap2<F,
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 :
95  apply_wrap3<F,
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 T2(r, f)
Definition: Sacado_rad.hpp:578
#define T1(r, f)
Definition: Sacado_rad.hpp:603
const int N