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