stl_function.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:21k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996-1998
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_FUNCTION_H
  30. #define __SGI_STL_INTERNAL_FUNCTION_H
  31. __STL_BEGIN_NAMESPACE
  32. template <class _Arg, class _Result>
  33. struct unary_function {
  34.     typedef _Arg argument_type;
  35.     typedef _Result result_type;
  36. };
  37. template <class _Arg1, class _Arg2, class _Result>
  38. struct binary_function {
  39.     typedef _Arg1 first_argument_type;
  40.     typedef _Arg2 second_argument_type;
  41.     typedef _Result result_type;
  42. };      
  43. template <class _T>
  44. struct plus : public binary_function<_T,_T,_T> {
  45.     _T operator()(const _T& __x, const _T& __y) const { return __x + __y; }
  46. };
  47. template <class _T>
  48. struct minus : public binary_function<_T,_T,_T> {
  49.     _T operator()(const _T& __x, const _T& __y) const { return __x - __y; }
  50. };
  51. template <class _T>
  52. struct multiplies : public binary_function<_T,_T,_T> {
  53.     _T operator()(const _T& __x, const _T& __y) const { return __x * __y; }
  54. };
  55. template <class _T>
  56. struct divides : public binary_function<_T,_T,_T> {
  57.     _T operator()(const _T& __x, const _T& __y) const { return __x / __y; }
  58. };
  59. // identity_element (not part of the C++ standard).
  60. template <class _T> inline _T identity_element(plus<_T>) {
  61.   return _T(0);
  62. }
  63. template <class _T> inline _T identity_element(multiplies<_T>) {
  64.   return _T(1);
  65. }
  66. template <class _T>
  67. struct modulus : public binary_function<_T,_T,_T> 
  68. {
  69.     _T operator()(const _T& __x, const _T& __y) const { return __x % __y; }
  70. };
  71. template <class _T>
  72. struct negate : public unary_function<_T,_T> 
  73. {
  74.     _T operator()(const _T& __x) const { return -__x; }
  75. };
  76. template <class _T>
  77. struct equal_to : public binary_function<_T,_T,bool> 
  78. {
  79.     bool operator()(const _T& __x, const _T& __y) const { return __x == __y; }
  80. };
  81. template <class _T>
  82. struct not_equal_to : public binary_function<_T,_T,bool> 
  83. {
  84.     bool operator()(const _T& __x, const _T& __y) const { return __x != __y; }
  85. };
  86. template <class _T>
  87. struct greater : public binary_function<_T,_T,bool> 
  88. {
  89.     bool operator()(const _T& __x, const _T& __y) const { return __x > __y; }
  90. };
  91. template <class _T>
  92. struct less : public binary_function<_T,_T,bool> 
  93. {
  94.     bool operator()(const _T& __x, const _T& __y) const { return __x < __y; }
  95. };
  96. template <class _T>
  97. struct greater_equal : public binary_function<_T,_T,bool>
  98. {
  99.     bool operator()(const _T& __x, const _T& __y) const { return __x >= __y; }
  100. };
  101. template <class _T>
  102. struct less_equal : public binary_function<_T,_T,bool> 
  103. {
  104.     bool operator()(const _T& __x, const _T& __y) const { return __x <= __y; }
  105. };
  106. template <class _T>
  107. struct logical_and : public binary_function<_T,_T,bool>
  108. {
  109.     bool operator()(const _T& __x, const _T& __y) const { return __x && __y; }
  110. };
  111. template <class _T>
  112. struct logical_or : public binary_function<_T,_T,bool>
  113. {
  114.     bool operator()(const _T& __x, const _T& __y) const { return __x || __y; }
  115. };
  116. template <class _T>
  117. struct logical_not : public unary_function<_T,bool>
  118. {
  119.     bool operator()(const _T& __x) const { return !__x; }
  120. };
  121. template <class _Predicate>
  122. class unary_negate
  123.   : public unary_function<typename _Predicate::argument_type, bool> {
  124. protected:
  125.   _Predicate _M_pred;
  126. public:
  127.   explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {}
  128.   bool operator()(const typename _Predicate::argument_type& __x) const {
  129.     return !_M_pred(__x);
  130.   }
  131. };
  132. template <class _Predicate>
  133. inline unary_negate<_Predicate> 
  134. not1(const _Predicate& __pred)
  135. {
  136.   return unary_negate<_Predicate>(__pred);
  137. }
  138. template <class _Predicate> 
  139. class binary_negate 
  140.   : public binary_function<typename _Predicate::first_argument_type,
  141.                            typename _Predicate::second_argument_type,
  142.                            bool> {
  143. protected:
  144.   _Predicate _M_pred;
  145. public:
  146.   explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {}
  147.   bool operator()(const typename _Predicate::first_argument_type& __x, 
  148.                   const typename _Predicate::second_argument_type& __y) const
  149.   {
  150.     return !_M_pred(__x, __y); 
  151.   }
  152. };
  153. template <class _Predicate>
  154. inline binary_negate<_Predicate> 
  155. not2(const _Predicate& __pred)
  156. {
  157.   return binary_negate<_Predicate>(__pred);
  158. }
  159. template <class _Operation> 
  160. class binder1st
  161.   : public unary_function<typename _Operation::second_argument_type,
  162.                           typename _Operation::result_type> {
  163. protected:
  164.   _Operation op;
  165.   typename _Operation::first_argument_type value;
  166. public:
  167.   binder1st(const _Operation& __x,
  168.             const typename _Operation::first_argument_type& __y)
  169.       : op(__x), value(__y) {}
  170.   typename _Operation::result_type
  171.   operator()(const typename _Operation::second_argument_type& __x) const {
  172.     return op(value, __x); 
  173.   }
  174. };
  175. template <class _Operation, class _T>
  176. inline binder1st<_Operation> 
  177. bind1st(const _Operation& __opr, const _T& __x) 
  178. {
  179.   typedef typename _Operation::first_argument_type _Arg1_type;
  180.   return binder1st<_Operation>(__opr, _Arg1_type(__x));
  181. }
  182. template <class _Operation> 
  183. class binder2nd
  184.   : public unary_function<typename _Operation::first_argument_type,
  185.                           typename _Operation::result_type> {
  186. protected:
  187.   _Operation op;
  188.   typename _Operation::second_argument_type value;
  189. public:
  190.   binder2nd(const _Operation& __x,
  191.             const typename _Operation::second_argument_type& __y) 
  192.       : op(__x), value(__y) {}
  193.   typename _Operation::result_type
  194.   operator()(const typename _Operation::first_argument_type& __x) const {
  195.     return op(__x, value); 
  196.   }
  197. };
  198. template <class _Operation, class _T>
  199. inline binder2nd<_Operation> 
  200. bind2nd(const _Operation& __opr, const _T& __x) 
  201. {
  202.   typedef typename _Operation::second_argument_type _Arg2_type;
  203.   return binder2nd<_Operation>(__opr, _Arg2_type(__x));
  204. }
  205. // unary_compose and binary_compose (extensions, not part of the standard).
  206. template <class _Operation1, class _Operation2>
  207. class unary_compose
  208.   : public unary_function<typename _Operation2::argument_type,
  209.                           typename _Operation1::result_type> 
  210. {
  211. protected:
  212.   _Operation1 __op1;
  213.   _Operation2 __op2;
  214. public:
  215.   unary_compose(const _Operation1& __x, const _Operation2& __y) 
  216.     : __op1(__x), __op2(__y) {}
  217.   typename _Operation1::result_type
  218.   operator()(const typename _Operation2::argument_type& __x) const {
  219.     return __op1(__op2(__x));
  220.   }
  221. };
  222. template <class _Operation1, class _Operation2>
  223. inline unary_compose<_Operation1,_Operation2> 
  224. compose1(const _Operation1& __op1, const _Operation2& __op2)
  225. {
  226.   return unary_compose<_Operation1,_Operation2>(__op1, __op2);
  227. }
  228. template <class _Operation1, class _Operation2, class _Operation3>
  229. class binary_compose
  230.   : public unary_function<typename _Operation2::argument_type,
  231.                           typename _Operation1::result_type> {
  232. protected:
  233.   _Operation1 _M_op1;
  234.   _Operation2 _M_op2;
  235.   _Operation3 _M_op3;
  236. public:
  237.   binary_compose(const _Operation1& __x, const _Operation2& __y, 
  238.                  const _Operation3& __z) 
  239.     : _M_op1(__x), _M_op2(__y), _M_op3(__z) { }
  240.   typename _Operation1::result_type
  241.   operator()(const typename _Operation2::argument_type& __x) const {
  242.     return _M_op1(_M_op2(__x), _M_op3(__x));
  243.   }
  244. };
  245. template <class _Operation1, class _Operation2, class _Operation3>
  246. inline binary_compose<_Operation1, _Operation2, _Operation3> 
  247. compose2(const _Operation1& __op1, const _Operation2& __op2, 
  248.          const _Operation3& __op3)
  249. {
  250.   return binary_compose<_Operation1,_Operation2,_Operation3>
  251.     (__op1, __op2, __op3);
  252. }
  253. template <class _Arg, class _Result>
  254. class pointer_to_unary_function : public unary_function<_Arg, _Result> {
  255. protected:
  256.   _Result (*_M_ptr)(_Arg);
  257. public:
  258.   pointer_to_unary_function() {}
  259.   explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {}
  260.   _Result operator()(_Arg __x) const { return _M_ptr(__x); }
  261. };
  262. template <class _Arg, class _Result>
  263. inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (*__x)(_Arg))
  264. {
  265.   return pointer_to_unary_function<_Arg, _Result>(__x);
  266. }
  267. template <class _Arg1, class _Arg2, class _Result>
  268. class pointer_to_binary_function : 
  269.   public binary_function<_Arg1,_Arg2,_Result> {
  270. protected:
  271.     _Result (*_M_ptr)(_Arg1, _Arg2);
  272. public:
  273.     pointer_to_binary_function() {}
  274.     explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) 
  275.       : _M_ptr(__x) {}
  276.     _Result operator()(_Arg1 __x, _Arg2 __y) const {
  277.       return _M_ptr(__x, __y);
  278.     }
  279. };
  280. template <class _Arg1, class _Arg2, class _Result>
  281. inline pointer_to_binary_function<_Arg1,_Arg2,_Result> 
  282. ptr_fun(_Result (*__x)(_Arg1, _Arg2)) {
  283.   return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__x);
  284. }
  285. // identity is an extensions: it is not part of the standard.
  286. template <class _T>
  287. struct _Identity : public unary_function<_T,_T> {
  288.   const _T& operator()(const _T& __x) const { return __x; }
  289. };
  290. template <class _T> struct identity : public _Identity<_T> {};
  291. // select1st and select2nd are extensions: they are not part of the standard.
  292. template <class _Pair>
  293. struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
  294.   const typename _Pair::first_type& operator()(const _Pair& __x) const {
  295.     return __x.first;
  296.   }
  297. };
  298. template <class _Pair>
  299. struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> {
  300.   const typename _Pair::second_type& operator()(const _Pair& __x) const {
  301.     return __x.second;
  302.   }
  303. };
  304. template <class _Pair> struct select1st : public _Select1st<_Pair> {};
  305. template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};
  306. // project1st and project2nd are extensions: they are not part of the standard
  307. template <class _Arg1, class _Arg2>
  308. struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> {
  309.   _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }
  310. };
  311. template <class _Arg1, class _Arg2>
  312. struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> {
  313.   _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }
  314. };
  315. template <class _Arg1, class _Arg2> 
  316. struct project1st : public _Project1st<_Arg1, _Arg2> {};
  317. template <class _Arg1, class _Arg2>
  318. struct project2nd : public _Project2nd<_Arg1, _Arg2> {};
  319. // constant_void_fun, constant_unary_fun, and constant_binary_fun are
  320. // extensions: they are not part of the standard.  (The same, of course,
  321. // is true of the helper functions constant0, constant1, and constant2.)
  322. template <class _Result>
  323. struct constant_void_fun
  324. {
  325.   typedef _Result result_type;
  326.   result_type __val;
  327.   constant_void_fun(const result_type& __v) : __val(__v) {}
  328.   const result_type& operator()() const { return __val; }
  329. };  
  330. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  331. template <class _Result, class _Argument = _Result>
  332. #else
  333. template <class _Result, class _Argument>
  334. #endif
  335. struct constant_unary_fun : public unary_function<_Argument, _Result> {
  336.   _Result _M_val;
  337.   constant_unary_fun(const _Result& __v) : _M_val(__v) {}
  338.   const _Result& operator()(const _Argument&) const { return _M_val; }
  339. };
  340. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  341. template <class _Result, class _Arg1 = _Result, class _Arg2 = _Arg1>
  342. #else
  343. template <class _Result, class _Arg1, class _Arg2>
  344. #endif
  345. struct constant_binary_fun : public binary_function<_Arg1, _Arg2, _Result> {
  346.   _Result _M_val;
  347.   constant_binary_fun(const _Result& __v) : _M_val(__v) {}
  348.   const _Result& operator()(const _Arg1&, const _Arg2&) const {
  349.     return _M_val;
  350.   }
  351. };
  352. template <class _Result>
  353. inline constant_void_fun<_Result> constant0(const _Result& __val)
  354. {
  355.   return constant_void_fun<_Result>(__val);
  356. }
  357. template <class _Result>
  358. inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val)
  359. {
  360.   return constant_unary_fun<_Result,_Result>(__val);
  361. }
  362. template <class _Result>
  363. inline constant_binary_fun<_Result,_Result,_Result> 
  364. constant2(const _Result& __val)
  365. {
  366.   return constant_binary_fun<_Result,_Result,_Result>(__val);
  367. }
  368. // subtractive_rng is an extension: it is not part of the standard.
  369. // Note: this code assumes that int is 32 bits.
  370. class subtractive_rng : public unary_function<unsigned int, unsigned int> {
  371. private:
  372.   unsigned int _M_table[55];
  373.   size_t _M_index1;
  374.   size_t _M_index2;
  375. public:
  376.   unsigned int operator()(unsigned int __limit) {
  377.     _M_index1 = (_M_index1 + 1) % 55;
  378.     _M_index2 = (_M_index2 + 1) % 55;
  379.     _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2];
  380.     return _M_table[_M_index1] % __limit;
  381.   }
  382.   void _M_initialize(unsigned int __seed)
  383.   {
  384.     unsigned int __k = 1;
  385.     _M_table[54] = __seed;
  386.     size_t __i;
  387.     for (__i = 0; __i < 54; __i++) {
  388.         size_t __ii = (21 * (__i + 1) % 55) - 1;
  389.         _M_table[__ii] = __k;
  390.         __k = __seed - __k;
  391.         __seed = _M_table[__ii];
  392.     }
  393.     for (int __loop = 0; __loop < 4; __loop++) {
  394.         for (__i = 0; __i < 55; __i++)
  395.             _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55];
  396.     }
  397.     _M_index1 = 0;
  398.     _M_index2 = 31;
  399.   }
  400.   subtractive_rng(unsigned int __seed) { _M_initialize(__seed); }
  401.   subtractive_rng() { _M_initialize(161803398u); }
  402. };
  403. // Adaptor function objects: pointers to member functions.
  404. // There are a total of 16 = 2^4 function objects in this family.
  405. //  (1) Member functions taking no arguments vs member functions taking
  406. //       one argument.
  407. //  (2) Call through pointer vs call through reference.
  408. //  (3) Member function with void return type vs member function with
  409. //      non-void return type.
  410. //  (4) Const vs non-const member function.
  411. // Note that choice (3) is nothing more than a workaround: according
  412. //  to the draft, compilers should handle void and non-void the same way.
  413. //  This feature is not yet widely implemented, though.  You can only use
  414. //  member functions returning void if your compiler supports partial
  415. //  specialization.
  416. // All of this complexity is in the function objects themselves.  You can
  417. //  ignore it by using the helper function mem_fun and mem_fun_ref,
  418. //  which create whichever type of adaptor is appropriate.
  419. //  (mem_fun1 and mem_fun1_ref are no longer part of the C++ standard,
  420. //  but they are provided for backward compatibility.)
  421. template <class _Ret, class _T>
  422. class mem_fun_t : public unary_function<_T*,_Ret> {
  423. public:
  424.   explicit mem_fun_t(_Ret (_T::*__pf)()) : _M_f(__pf) {}
  425.   _Ret operator()(_T* __p) const { return (__p->*_M_f)(); }
  426. private:
  427.   _Ret (_T::*_M_f)();
  428. };
  429. template <class _Ret, class _T>
  430. class const_mem_fun_t : public unary_function<const _T*,_Ret> {
  431. public:
  432.   explicit const_mem_fun_t(_Ret (_T::*__pf)() const) : _M_f(__pf) {}
  433.   _Ret operator()(const _T* __p) const { return (__p->*_M_f)(); }
  434. private:
  435.   _Ret (_T::*_M_f)() const;
  436. };
  437. template <class _Ret, class _T>
  438. class mem_fun_ref_t : public unary_function<_T,_Ret> {
  439. public:
  440.   explicit mem_fun_ref_t(_Ret (_T::*__pf)()) : _M_f(__pf) {}
  441.   _Ret operator()(_T& __r) const { return (__r.*_M_f)(); }
  442. private:
  443.   _Ret (_T::*_M_f)();
  444. };
  445. template <class _Ret, class _T>
  446. class const_mem_fun_ref_t : public unary_function<_T,_Ret> {
  447. public:
  448.   explicit const_mem_fun_ref_t(_Ret (_T::*__pf)() const) : _M_f(__pf) {}
  449.   _Ret operator()(const _T& __r) const { return (__r.*_M_f)(); }
  450. private:
  451.   _Ret (_T::*_M_f)() const;
  452. };
  453. template <class _Ret, class _T, class _Arg>
  454. class mem_fun1_t : public binary_function<_T*,_Arg,_Ret> {
  455. public:
  456.   explicit mem_fun1_t(_Ret (_T::*__pf)(_Arg)) : _M_f(__pf) {}
  457.   _Ret operator()(_T* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
  458. private:
  459.   _Ret (_T::*_M_f)(_Arg);
  460. };
  461. template <class _Ret, class _T, class _Arg>
  462. class const_mem_fun1_t : public binary_function<const _T*,_Arg,_Ret> {
  463. public:
  464.   explicit const_mem_fun1_t(_Ret (_T::*__pf)(_Arg) const) : _M_f(__pf) {}
  465.   _Ret operator()(const _T* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
  466. private:
  467.   _Ret (_T::*_M_f)(_Arg) const;
  468. };
  469. template <class _Ret, class _T, class _Arg>
  470. class mem_fun1_ref_t : public binary_function<_T,_Arg,_Ret> {
  471. public:
  472.   explicit mem_fun1_ref_t(_Ret (_T::*__pf)(_Arg)) : _M_f(__pf) {}
  473.   _Ret operator()(_T& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
  474. private:
  475.   _Ret (_T::*_M_f)(_Arg);
  476. };
  477. template <class _Ret, class _T, class _Arg>
  478. class const_mem_fun1_ref_t : public binary_function<_T,_Arg,_Ret> {
  479. public:
  480.   explicit const_mem_fun1_ref_t(_Ret (_T::*__pf)(_Arg) const) : _M_f(__pf) {}
  481.   _Ret operator()(const _T& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
  482. private:
  483.   _Ret (_T::*_M_f)(_Arg) const;
  484. };
  485. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  486. template <class _T>
  487. class mem_fun_t<void, _T> : public unary_function<_T*,void> {
  488. public:
  489.   explicit mem_fun_t(void (_T::*__pf)()) : _M_f(__pf) {}
  490.   void operator()(_T* __p) const { (__p->*_M_f)(); }
  491. private:
  492.   void (_T::*_M_f)();
  493. };
  494. template <class _T>
  495. class const_mem_fun_t<void, _T> : public unary_function<const _T*,void> {
  496. public:
  497.   explicit const_mem_fun_t(void (_T::*__pf)() const) : _M_f(__pf) {}
  498.   void operator()(const _T* __p) const { (__p->*_M_f)(); }
  499. private:
  500.   void (_T::*_M_f)() const;
  501. };
  502. template <class _T>
  503. class mem_fun_ref_t<void, _T> : public unary_function<_T,void> {
  504. public:
  505.   explicit mem_fun_ref_t(void (_T::*__pf)()) : _M_f(__pf) {}
  506.   void operator()(_T& __r) const { (__r.*_M_f)(); }
  507. private:
  508.   void (_T::*_M_f)();
  509. };
  510. template <class _T>
  511. class const_mem_fun_ref_t<void, _T> : public unary_function<_T,void> {
  512. public:
  513.   explicit const_mem_fun_ref_t(void (_T::*__pf)() const) : _M_f(__pf) {}
  514.   void operator()(const _T& __r) const { (__r.*_M_f)(); }
  515. private:
  516.   void (_T::*_M_f)() const;
  517. };
  518. template <class _T, class _Arg>
  519. class mem_fun1_t<void, _T, _Arg> : public binary_function<_T*,_Arg,void> {
  520. public:
  521.   explicit mem_fun1_t(void (_T::*__pf)(_Arg)) : _M_f(__pf) {}
  522.   void operator()(_T* __p, _Arg __x) const { (__p->*_M_f)(__x); }
  523. private:
  524.   void (_T::*_M_f)(_Arg);
  525. };
  526. template <class _T, class _Arg>
  527. class const_mem_fun1_t<void, _T, _Arg> 
  528.   : public binary_function<const _T*,_Arg,void> {
  529. public:
  530.   explicit const_mem_fun1_t(void (_T::*__pf)(_Arg) const) : _M_f(__pf) {}
  531.   void operator()(const _T* __p, _Arg __x) const { (__p->*_M_f)(__x); }
  532. private:
  533.   void (_T::*_M_f)(_Arg) const;
  534. };
  535. template <class _T, class _Arg>
  536. class mem_fun1_ref_t<void, _T, _Arg> : public binary_function<_T,_Arg,void> {
  537. public:
  538.   explicit mem_fun1_ref_t(void (_T::*__pf)(_Arg)) : _M_f(__pf) {}
  539.   void operator()(_T& __r, _Arg __x) const { (__r.*_M_f)(__x); }
  540. private:
  541.   void (_T::*_M_f)(_Arg);
  542. };
  543. template <class _T, class _Arg>
  544. class const_mem_fun1_ref_t<void, _T, _Arg>
  545.   : public binary_function<_T,_Arg,void> {
  546. public:
  547.   explicit const_mem_fun1_ref_t(void (_T::*__pf)(_Arg) const) : _M_f(__pf) {}
  548.   void operator()(const _T& __r, _Arg __x) const { (__r.*_M_f)(__x); }
  549. private:
  550.   void (_T::*_M_f)(_Arg) const;
  551. };
  552. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  553. // Mem_fun adaptor helper functions.  There are only two:
  554. //  mem_fun and mem_fun_ref.  (mem_fun1 and mem_fun1_ref 
  555. //  are provided for backward compatibility, but they are no longer
  556. //  part of the C++ standard.)
  557. template <class _Ret, class _T>
  558. inline mem_fun_t<_Ret,_T> mem_fun(_Ret (_T::*__f)())
  559.   { return mem_fun_t<_Ret,_T>(__f); }
  560. template <class _Ret, class _T>
  561. inline const_mem_fun_t<_Ret,_T> mem_fun(_Ret (_T::*__f)() const)
  562.   { return const_mem_fun_t<_Ret,_T>(__f); }
  563. template <class _Ret, class _T>
  564. inline mem_fun_ref_t<_Ret,_T> mem_fun_ref(_Ret (_T::*__f)()) 
  565.   { return mem_fun_ref_t<_Ret,_T>(__f); }
  566. template <class _Ret, class _T>
  567. inline const_mem_fun_ref_t<_Ret,_T> mem_fun_ref(_Ret (_T::*__f)() const)
  568.   { return const_mem_fun_ref_t<_Ret,_T>(__f); }
  569. template <class _Ret, class _T, class _Arg>
  570. inline mem_fun1_t<_Ret,_T,_Arg> mem_fun(_Ret (_T::*__f)(_Arg))
  571.   { return mem_fun1_t<_Ret,_T,_Arg>(__f); }
  572. template <class _Ret, class _T, class _Arg>
  573. inline const_mem_fun1_t<_Ret,_T,_Arg> mem_fun(_Ret (_T::*__f)(_Arg) const)
  574.   { return const_mem_fun1_t<_Ret,_T,_Arg>(__f); }
  575. template <class _Ret, class _T, class _Arg>
  576. inline mem_fun1_ref_t<_Ret,_T,_Arg> mem_fun_ref(_Ret (_T::*__f)(_Arg))
  577.   { return mem_fun1_ref_t<_Ret,_T,_Arg>(__f); }
  578. template <class _Ret, class _T, class _Arg>
  579. inline const_mem_fun1_ref_t<_Ret,_T,_Arg>
  580. mem_fun_ref(_Ret (_T::*__f)(_Arg) const)
  581.   { return const_mem_fun1_ref_t<_Ret,_T,_Arg>(__f); }
  582. template <class _Ret, class _T, class _Arg>
  583. inline mem_fun1_t<_Ret,_T,_Arg> mem_fun1(_Ret (_T::*__f)(_Arg))
  584.   { return mem_fun1_t<_Ret,_T,_Arg>(__f); }
  585. template <class _Ret, class _T, class _Arg>
  586. inline const_mem_fun1_t<_Ret,_T,_Arg> mem_fun1(_Ret (_T::*__f)(_Arg) const)
  587.   { return const_mem_fun1_t<_Ret,_T,_Arg>(__f); }
  588. template <class _Ret, class _T, class _Arg>
  589. inline mem_fun1_ref_t<_Ret,_T,_Arg> mem_fun1_ref(_Ret (_T::*__f)(_Arg))
  590.   { return mem_fun1_ref_t<_Ret,_T,_Arg>(__f); }
  591. template <class _Ret, class _T, class _Arg>
  592. inline const_mem_fun1_ref_t<_Ret,_T,_Arg>
  593. mem_fun1_ref(_Ret (_T::*__f)(_Arg) const)
  594.   { return const_mem_fun1_ref_t<_Ret,_T,_Arg>(__f); }
  595. __STL_END_NAMESPACE
  596. #endif /* __SGI_STL_INTERNAL_FUNCTION_H */
  597. // Local Variables:
  598. // mode:C++
  599. // End: