Advertisement
Guest User

Untitled

a guest
May 15th, 2014
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.26 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement