1 #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
2 #define BOOST_BIND_PROTECT_HPP_INCLUDED
3 
4 //
5 //  protect.hpp
6 //
7 //  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
8 //  Copyright (c) 2009 Steven Watanabe
9 //
10 // Distributed under the Boost Software License, Version 1.0. (See
11 // accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
13 //
14 
15 #include <boost/config.hpp>
16 #include <boost/detail/workaround.hpp>
17 
18 namespace boost
19 {
20 
21 namespace _bi
22 {
23 
24 template<class F> class protected_bind_t
25 {
26 public:
27 
28     typedef typename F::result_type result_type;
29 
protected_bind_t(F f)30     explicit protected_bind_t(F f): f_(f)
31     {
32     }
33 
operator ()()34     result_type operator()()
35     {
36         return f_();
37     }
38 
operator ()() const39     result_type operator()() const
40     {
41         return f_();
42     }
43 
operator ()(A1 & a1)44     template<class A1> result_type operator()(A1 & a1)
45     {
46         return f_(a1);
47     }
48 
operator ()(A1 & a1) const49     template<class A1> result_type operator()(A1 & a1) const
50     {
51         return f_(a1);
52     }
53 
54 
55 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
56  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
57 
operator ()(const A1 & a1)58     template<class A1> result_type operator()(const A1 & a1)
59     {
60         return f_(a1);
61     }
62 
operator ()(const A1 & a1) const63     template<class A1> result_type operator()(const A1 & a1) const
64     {
65         return f_(a1);
66     }
67 
68 #endif
69 
operator ()(A1 & a1,A2 & a2)70     template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
71     {
72         return f_(a1, a2);
73     }
74 
operator ()(A1 & a1,A2 & a2) const75     template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
76     {
77         return f_(a1, a2);
78     }
79 
80 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
81  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
82 
operator ()(A1 const & a1,A2 & a2)83     template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
84     {
85         return f_(a1, a2);
86     }
87 
operator ()(A1 const & a1,A2 & a2) const88     template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
89     {
90         return f_(a1, a2);
91     }
92 
operator ()(A1 & a1,A2 const & a2)93     template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
94     {
95         return f_(a1, a2);
96     }
97 
operator ()(A1 & a1,A2 const & a2) const98     template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
99     {
100         return f_(a1, a2);
101     }
102 
operator ()(A1 const & a1,A2 const & a2)103     template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
104     {
105         return f_(a1, a2);
106     }
107 
operator ()(A1 const & a1,A2 const & a2) const108     template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
109     {
110         return f_(a1, a2);
111     }
112 
113 #endif
114 
operator ()(A1 & a1,A2 & a2,A3 & a3)115     template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
116     {
117         return f_(a1, a2, a3);
118     }
119 
operator ()(A1 & a1,A2 & a2,A3 & a3) const120     template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
121     {
122         return f_(a1, a2, a3);
123     }
124 
125 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
126  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
127 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3)128     template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
129     {
130         return f_(a1, a2, a3);
131     }
132 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3) const133     template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
134     {
135         return f_(a1, a2, a3);
136     }
137 
138 #endif
139 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4)140     template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
141     {
142         return f_(a1, a2, a3, a4);
143     }
144 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4) const145     template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
146     {
147         return f_(a1, a2, a3, a4);
148     }
149 
150 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
151  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
152 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4)153     template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
154     {
155         return f_(a1, a2, a3, a4);
156     }
157 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4) const158     template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const
159     {
160         return f_(a1, a2, a3, a4);
161     }
162 
163 #endif
164 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5)165     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
166     {
167         return f_(a1, a2, a3, a4, a5);
168     }
169 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5) const170     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const
171     {
172         return f_(a1, a2, a3, a4, a5);
173     }
174 
175 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
176  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
177 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5)178     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5)
179     {
180         return f_(a1, a2, a3, a4, a5);
181     }
182 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5) const183     template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const
184     {
185         return f_(a1, a2, a3, a4, a5);
186     }
187 
188 #endif
189 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6)190     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6)
191     {
192         return f_(a1, a2, a3, a4, a5, a6);
193     }
194 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6) const195     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const
196     {
197         return f_(a1, a2, a3, a4, a5, a6);
198     }
199 
200 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
201  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
202 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6)203     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6)
204     {
205         return f_(a1, a2, a3, a4, a5, a6);
206     }
207 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6) const208     template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const
209     {
210         return f_(a1, a2, a3, a4, a5, a6);
211     }
212 
213 #endif
214 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7)215     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7)
216     {
217         return f_(a1, a2, a3, a4, a5, a6, a7);
218     }
219 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7) const220     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const
221     {
222         return f_(a1, a2, a3, a4, a5, a6, a7);
223     }
224 
225 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
226  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
227 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7)228     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7)
229     {
230         return f_(a1, a2, a3, a4, a5, a6, a7);
231     }
232 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7) const233     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const
234     {
235         return f_(a1, a2, a3, a4, a5, a6, a7);
236     }
237 
238 #endif
239 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8)240     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8)
241     {
242         return f_(a1, a2, a3, a4, a5, a6, a7, a8);
243     }
244 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8) const245     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const
246     {
247         return f_(a1, a2, a3, a4, a5, a6, a7, a8);
248     }
249 
250 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
251  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
252 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7,A8 const & a8)253     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8)
254     {
255         return f_(a1, a2, a3, a4, a5, a6, a7, a8);
256     }
257 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7,A8 const & a8) const258     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const
259     {
260         return f_(a1, a2, a3, a4, a5, a6, a7, a8);
261     }
262 
263 #endif
264 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8,A9 & a9)265     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
266     {
267         return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
268     }
269 
operator ()(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8,A9 & a9) const270     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
271     {
272         return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
273     }
274 
275 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
276  && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
277 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7,A8 const & a8,A9 const & a9)278     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
279     {
280         return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
281     }
282 
operator ()(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7,A8 const & a8,A9 const & a9) const283     template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
284     {
285         return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
286     }
287 
288 #endif
289 
290 private:
291 
292     F f_;
293 };
294 
295 } // namespace _bi
296 
protect(F f)297 template<class F> _bi::protected_bind_t<F> protect(F f)
298 {
299     return _bi::protected_bind_t<F>(f);
300 }
301 
302 } // namespace boost
303 
304 #endif // #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
305