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 326 template<class U> R const & call(U & u, T const *) const 327 { 328 return (u.*f_); 329 } 330 331 template<class U> R const & call(U & u, void const *) const 332 { 333 return (get_pointer(u)->*f_); 334 } 335 336 public: 337 338 explicit dm(F f): f_(f) {} 339 340 R & operator()(T * p) const 341 { 342 return (p->*f_); 343 } 344 345 R const & operator()(T const * p) const 346 { 347 return (p->*f_); 348 } 349 350 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 357 R & operator()(T & t) const 358 { 359 return (t.*f_); 360 } 361 362 R const & operator()(T const & t) const 363 { 364 return (t.*f_); 365 } 366 367 #endif 368 369 bool operator==(dm const & rhs) const 370 { 371 return f_ == rhs.f_; 372 } 373 374 bool operator!=(dm const & rhs) const 375 { 376 return f_ != rhs.f_; 377 } 378 }; 379 380 } // namespace _mfi 381 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