Chris@16
|
1 #ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
|
Chris@16
|
2 #define BOOST_BIND_MEM_FN_HPP_INCLUDED
|
Chris@16
|
3
|
Chris@16
|
4 // MS compatible compilers support #pragma once
|
Chris@16
|
5
|
Chris@16
|
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
Chris@16
|
7 # pragma once
|
Chris@16
|
8 #endif
|
Chris@16
|
9
|
Chris@16
|
10 //
|
Chris@16
|
11 // mem_fn.hpp - a generalization of std::mem_fun[_ref]
|
Chris@16
|
12 //
|
Chris@16
|
13 // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
|
Chris@16
|
14 // Copyright (c) 2001 David Abrahams
|
Chris@16
|
15 // Copyright (c) 2003-2005 Peter Dimov
|
Chris@16
|
16 //
|
Chris@16
|
17 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
18 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
19 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
20 //
|
Chris@16
|
21 // See http://www.boost.org/libs/bind/mem_fn.html for documentation.
|
Chris@16
|
22 //
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/config.hpp>
|
Chris@16
|
25 #include <boost/get_pointer.hpp>
|
Chris@16
|
26 #include <boost/detail/workaround.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 namespace boost
|
Chris@16
|
29 {
|
Chris@16
|
30
|
Chris@16
|
31 #if defined(BOOST_NO_VOID_RETURNS)
|
Chris@16
|
32
|
Chris@16
|
33 #define BOOST_MEM_FN_CLASS_F , class F
|
Chris@16
|
34 #define BOOST_MEM_FN_TYPEDEF(X)
|
Chris@16
|
35
|
Chris@16
|
36 namespace _mfi // mem_fun_impl
|
Chris@16
|
37 {
|
Chris@16
|
38
|
Chris@16
|
39 template<class V> struct mf
|
Chris@16
|
40 {
|
Chris@16
|
41
|
Chris@16
|
42 #define BOOST_MEM_FN_RETURN return
|
Chris@16
|
43
|
Chris@16
|
44 #define BOOST_MEM_FN_NAME(X) inner_##X
|
Chris@16
|
45 #define BOOST_MEM_FN_CC
|
Chris@16
|
46
|
Chris@16
|
47 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
48
|
Chris@16
|
49 #undef BOOST_MEM_FN_CC
|
Chris@16
|
50 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
51
|
Chris@16
|
52 #ifdef BOOST_MEM_FN_ENABLE_CDECL
|
Chris@16
|
53
|
Chris@16
|
54 #define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl
|
Chris@16
|
55 #define BOOST_MEM_FN_CC __cdecl
|
Chris@16
|
56
|
Chris@16
|
57 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
58
|
Chris@16
|
59 #undef BOOST_MEM_FN_CC
|
Chris@16
|
60 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
61
|
Chris@16
|
62 #endif
|
Chris@16
|
63
|
Chris@16
|
64 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
Chris@16
|
65
|
Chris@16
|
66 #define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall
|
Chris@16
|
67 #define BOOST_MEM_FN_CC __stdcall
|
Chris@16
|
68
|
Chris@16
|
69 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
70
|
Chris@16
|
71 #undef BOOST_MEM_FN_CC
|
Chris@16
|
72 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
73
|
Chris@16
|
74 #endif
|
Chris@16
|
75
|
Chris@16
|
76 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
Chris@16
|
77
|
Chris@16
|
78 #define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall
|
Chris@16
|
79 #define BOOST_MEM_FN_CC __fastcall
|
Chris@16
|
80
|
Chris@16
|
81 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
82
|
Chris@16
|
83 #undef BOOST_MEM_FN_CC
|
Chris@16
|
84 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
85
|
Chris@16
|
86 #endif
|
Chris@16
|
87
|
Chris@16
|
88 #undef BOOST_MEM_FN_RETURN
|
Chris@16
|
89
|
Chris@16
|
90 }; // struct mf<V>
|
Chris@16
|
91
|
Chris@16
|
92 template<> struct mf<void>
|
Chris@16
|
93 {
|
Chris@16
|
94
|
Chris@16
|
95 #define BOOST_MEM_FN_RETURN
|
Chris@16
|
96
|
Chris@16
|
97 #define BOOST_MEM_FN_NAME(X) inner_##X
|
Chris@16
|
98 #define BOOST_MEM_FN_CC
|
Chris@16
|
99
|
Chris@16
|
100 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
101
|
Chris@16
|
102 #undef BOOST_MEM_FN_CC
|
Chris@16
|
103 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
104
|
Chris@16
|
105 #ifdef BOOST_MEM_FN_ENABLE_CDECL
|
Chris@16
|
106
|
Chris@16
|
107 #define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl
|
Chris@16
|
108 #define BOOST_MEM_FN_CC __cdecl
|
Chris@16
|
109
|
Chris@16
|
110 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
111
|
Chris@16
|
112 #undef BOOST_MEM_FN_CC
|
Chris@16
|
113 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
114
|
Chris@16
|
115 #endif
|
Chris@16
|
116
|
Chris@16
|
117 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
Chris@16
|
118
|
Chris@16
|
119 #define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall
|
Chris@16
|
120 #define BOOST_MEM_FN_CC __stdcall
|
Chris@16
|
121
|
Chris@16
|
122 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
123
|
Chris@16
|
124 #undef BOOST_MEM_FN_CC
|
Chris@16
|
125 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
126
|
Chris@16
|
127 #endif
|
Chris@16
|
128
|
Chris@16
|
129 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
Chris@16
|
130
|
Chris@16
|
131 #define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall
|
Chris@16
|
132 #define BOOST_MEM_FN_CC __fastcall
|
Chris@16
|
133
|
Chris@16
|
134 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
135
|
Chris@16
|
136 #undef BOOST_MEM_FN_CC
|
Chris@16
|
137 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
138
|
Chris@16
|
139 #endif
|
Chris@16
|
140
|
Chris@16
|
141 #undef BOOST_MEM_FN_RETURN
|
Chris@16
|
142
|
Chris@16
|
143 }; // struct mf<void>
|
Chris@16
|
144
|
Chris@16
|
145 #undef BOOST_MEM_FN_CLASS_F
|
Chris@16
|
146 #undef BOOST_MEM_FN_TYPEDEF_F
|
Chris@16
|
147
|
Chris@16
|
148 #define BOOST_MEM_FN_NAME(X) X
|
Chris@16
|
149 #define BOOST_MEM_FN_NAME2(X) inner_##X
|
Chris@16
|
150 #define BOOST_MEM_FN_CC
|
Chris@16
|
151
|
Chris@16
|
152 #include <boost/bind/mem_fn_vw.hpp>
|
Chris@16
|
153
|
Chris@16
|
154 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
155 #undef BOOST_MEM_FN_NAME2
|
Chris@16
|
156 #undef BOOST_MEM_FN_CC
|
Chris@16
|
157
|
Chris@16
|
158 #ifdef BOOST_MEM_FN_ENABLE_CDECL
|
Chris@16
|
159
|
Chris@16
|
160 #define BOOST_MEM_FN_NAME(X) X##_cdecl
|
Chris@16
|
161 #define BOOST_MEM_FN_NAME2(X) inner_##X##_cdecl
|
Chris@16
|
162 #define BOOST_MEM_FN_CC __cdecl
|
Chris@16
|
163
|
Chris@16
|
164 #include <boost/bind/mem_fn_vw.hpp>
|
Chris@16
|
165
|
Chris@16
|
166 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
167 #undef BOOST_MEM_FN_NAME2
|
Chris@16
|
168 #undef BOOST_MEM_FN_CC
|
Chris@16
|
169
|
Chris@16
|
170 #endif
|
Chris@16
|
171
|
Chris@16
|
172 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
Chris@16
|
173
|
Chris@16
|
174 #define BOOST_MEM_FN_NAME(X) X##_stdcall
|
Chris@16
|
175 #define BOOST_MEM_FN_NAME2(X) inner_##X##_stdcall
|
Chris@16
|
176 #define BOOST_MEM_FN_CC __stdcall
|
Chris@16
|
177
|
Chris@16
|
178 #include <boost/bind/mem_fn_vw.hpp>
|
Chris@16
|
179
|
Chris@16
|
180 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
181 #undef BOOST_MEM_FN_NAME2
|
Chris@16
|
182 #undef BOOST_MEM_FN_CC
|
Chris@16
|
183
|
Chris@16
|
184 #endif
|
Chris@16
|
185
|
Chris@16
|
186 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
Chris@16
|
187
|
Chris@16
|
188 #define BOOST_MEM_FN_NAME(X) X##_fastcall
|
Chris@16
|
189 #define BOOST_MEM_FN_NAME2(X) inner_##X##_fastcall
|
Chris@16
|
190 #define BOOST_MEM_FN_CC __fastcall
|
Chris@16
|
191
|
Chris@16
|
192 #include <boost/bind/mem_fn_vw.hpp>
|
Chris@16
|
193
|
Chris@16
|
194 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
195 #undef BOOST_MEM_FN_NAME2
|
Chris@16
|
196 #undef BOOST_MEM_FN_CC
|
Chris@16
|
197
|
Chris@16
|
198 #endif
|
Chris@16
|
199
|
Chris@16
|
200 } // namespace _mfi
|
Chris@16
|
201
|
Chris@16
|
202 #else // #ifdef BOOST_NO_VOID_RETURNS
|
Chris@16
|
203
|
Chris@16
|
204 #define BOOST_MEM_FN_CLASS_F
|
Chris@16
|
205 #define BOOST_MEM_FN_TYPEDEF(X) typedef X;
|
Chris@16
|
206
|
Chris@16
|
207 namespace _mfi
|
Chris@16
|
208 {
|
Chris@16
|
209
|
Chris@16
|
210 #define BOOST_MEM_FN_RETURN return
|
Chris@16
|
211
|
Chris@16
|
212 #define BOOST_MEM_FN_NAME(X) X
|
Chris@16
|
213 #define BOOST_MEM_FN_CC
|
Chris@16
|
214
|
Chris@16
|
215 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
216
|
Chris@16
|
217 #undef BOOST_MEM_FN_CC
|
Chris@16
|
218 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
219
|
Chris@16
|
220 #ifdef BOOST_MEM_FN_ENABLE_CDECL
|
Chris@16
|
221
|
Chris@16
|
222 #define BOOST_MEM_FN_NAME(X) X##_cdecl
|
Chris@16
|
223 #define BOOST_MEM_FN_CC __cdecl
|
Chris@16
|
224
|
Chris@16
|
225 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
226
|
Chris@16
|
227 #undef BOOST_MEM_FN_CC
|
Chris@16
|
228 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
229
|
Chris@16
|
230 #endif
|
Chris@16
|
231
|
Chris@16
|
232 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
Chris@16
|
233
|
Chris@16
|
234 #define BOOST_MEM_FN_NAME(X) X##_stdcall
|
Chris@16
|
235 #define BOOST_MEM_FN_CC __stdcall
|
Chris@16
|
236
|
Chris@16
|
237 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
238
|
Chris@16
|
239 #undef BOOST_MEM_FN_CC
|
Chris@16
|
240 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
241
|
Chris@16
|
242 #endif
|
Chris@16
|
243
|
Chris@16
|
244 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
Chris@16
|
245
|
Chris@16
|
246 #define BOOST_MEM_FN_NAME(X) X##_fastcall
|
Chris@16
|
247 #define BOOST_MEM_FN_CC __fastcall
|
Chris@16
|
248
|
Chris@16
|
249 #include <boost/bind/mem_fn_template.hpp>
|
Chris@16
|
250
|
Chris@16
|
251 #undef BOOST_MEM_FN_CC
|
Chris@16
|
252 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
253
|
Chris@16
|
254 #endif
|
Chris@16
|
255
|
Chris@16
|
256 #undef BOOST_MEM_FN_RETURN
|
Chris@16
|
257
|
Chris@16
|
258 } // namespace _mfi
|
Chris@16
|
259
|
Chris@16
|
260 #undef BOOST_MEM_FN_CLASS_F
|
Chris@16
|
261 #undef BOOST_MEM_FN_TYPEDEF
|
Chris@16
|
262
|
Chris@16
|
263 #endif // #ifdef BOOST_NO_VOID_RETURNS
|
Chris@16
|
264
|
Chris@16
|
265 #define BOOST_MEM_FN_NAME(X) X
|
Chris@16
|
266 #define BOOST_MEM_FN_CC
|
Chris@16
|
267
|
Chris@16
|
268 #include <boost/bind/mem_fn_cc.hpp>
|
Chris@16
|
269
|
Chris@16
|
270 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
271 #undef BOOST_MEM_FN_CC
|
Chris@16
|
272
|
Chris@16
|
273 #ifdef BOOST_MEM_FN_ENABLE_CDECL
|
Chris@16
|
274
|
Chris@16
|
275 #define BOOST_MEM_FN_NAME(X) X##_cdecl
|
Chris@16
|
276 #define BOOST_MEM_FN_CC __cdecl
|
Chris@16
|
277
|
Chris@16
|
278 #include <boost/bind/mem_fn_cc.hpp>
|
Chris@16
|
279
|
Chris@16
|
280 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
281 #undef BOOST_MEM_FN_CC
|
Chris@16
|
282
|
Chris@16
|
283 #endif
|
Chris@16
|
284
|
Chris@16
|
285 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
|
Chris@16
|
286
|
Chris@16
|
287 #define BOOST_MEM_FN_NAME(X) X##_stdcall
|
Chris@16
|
288 #define BOOST_MEM_FN_CC __stdcall
|
Chris@16
|
289
|
Chris@16
|
290 #include <boost/bind/mem_fn_cc.hpp>
|
Chris@16
|
291
|
Chris@16
|
292 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
293 #undef BOOST_MEM_FN_CC
|
Chris@16
|
294
|
Chris@16
|
295 #endif
|
Chris@16
|
296
|
Chris@16
|
297 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
|
Chris@16
|
298
|
Chris@16
|
299 #define BOOST_MEM_FN_NAME(X) X##_fastcall
|
Chris@16
|
300 #define BOOST_MEM_FN_CC __fastcall
|
Chris@16
|
301
|
Chris@16
|
302 #include <boost/bind/mem_fn_cc.hpp>
|
Chris@16
|
303
|
Chris@16
|
304 #undef BOOST_MEM_FN_NAME
|
Chris@16
|
305 #undef BOOST_MEM_FN_CC
|
Chris@16
|
306
|
Chris@16
|
307 #endif
|
Chris@16
|
308
|
Chris@16
|
309 // data member support
|
Chris@16
|
310
|
Chris@16
|
311 namespace _mfi
|
Chris@16
|
312 {
|
Chris@16
|
313
|
Chris@16
|
314 template<class R, class T> class dm
|
Chris@16
|
315 {
|
Chris@16
|
316 public:
|
Chris@16
|
317
|
Chris@16
|
318 typedef R const & result_type;
|
Chris@16
|
319 typedef T const * argument_type;
|
Chris@16
|
320
|
Chris@16
|
321 private:
|
Chris@16
|
322
|
Chris@16
|
323 typedef R (T::*F);
|
Chris@16
|
324 F f_;
|
Chris@16
|
325
|
Chris@16
|
326 template<class U> R const & call(U & u, T const *) const
|
Chris@16
|
327 {
|
Chris@16
|
328 return (u.*f_);
|
Chris@16
|
329 }
|
Chris@16
|
330
|
Chris@16
|
331 template<class U> R const & call(U & u, void const *) const
|
Chris@16
|
332 {
|
Chris@16
|
333 return (get_pointer(u)->*f_);
|
Chris@16
|
334 }
|
Chris@16
|
335
|
Chris@16
|
336 public:
|
Chris@16
|
337
|
Chris@16
|
338 explicit dm(F f): f_(f) {}
|
Chris@16
|
339
|
Chris@16
|
340 R & operator()(T * p) const
|
Chris@16
|
341 {
|
Chris@16
|
342 return (p->*f_);
|
Chris@16
|
343 }
|
Chris@16
|
344
|
Chris@16
|
345 R const & operator()(T const * p) const
|
Chris@16
|
346 {
|
Chris@16
|
347 return (p->*f_);
|
Chris@16
|
348 }
|
Chris@16
|
349
|
Chris@16
|
350 template<class U> R const & operator()(U const & u) const
|
Chris@16
|
351 {
|
Chris@16
|
352 return call(u, &u);
|
Chris@16
|
353 }
|
Chris@16
|
354
|
Chris@16
|
355 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__MWERKS__, < 0x3200)
|
Chris@16
|
356
|
Chris@16
|
357 R & operator()(T & t) const
|
Chris@16
|
358 {
|
Chris@16
|
359 return (t.*f_);
|
Chris@16
|
360 }
|
Chris@16
|
361
|
Chris@16
|
362 R const & operator()(T const & t) const
|
Chris@16
|
363 {
|
Chris@16
|
364 return (t.*f_);
|
Chris@16
|
365 }
|
Chris@16
|
366
|
Chris@16
|
367 #endif
|
Chris@16
|
368
|
Chris@16
|
369 bool operator==(dm const & rhs) const
|
Chris@16
|
370 {
|
Chris@16
|
371 return f_ == rhs.f_;
|
Chris@16
|
372 }
|
Chris@16
|
373
|
Chris@16
|
374 bool operator!=(dm const & rhs) const
|
Chris@16
|
375 {
|
Chris@16
|
376 return f_ != rhs.f_;
|
Chris@16
|
377 }
|
Chris@16
|
378 };
|
Chris@16
|
379
|
Chris@16
|
380 } // namespace _mfi
|
Chris@16
|
381
|
Chris@16
|
382 template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f)
|
Chris@16
|
383 {
|
Chris@16
|
384 return _mfi::dm<R, T>(f);
|
Chris@16
|
385 }
|
Chris@16
|
386
|
Chris@16
|
387 } // namespace boost
|
Chris@16
|
388
|
Chris@16
|
389 #endif // #ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
|