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