ossrv_pub/boost_apis/boost/mem_fn.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 #ifndef BOOST_MEM_FN_HPP_INCLUDED
       
     2 #define BOOST_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_MEM_FN_HPP_INCLUDED