1    	// Functor implementations -*- C++ -*-
2    	
3    	// Copyright (C) 2001-2013 Free Software Foundation, Inc.
4    	//
5    	// This file is part of the GNU ISO C++ Library.  This library is free
6    	// software; you can redistribute it and/or modify it under the
7    	// terms of the GNU General Public License as published by the
8    	// Free Software Foundation; either version 3, or (at your option)
9    	// any later version.
10   	
11   	// This library is distributed in the hope that it will be useful,
12   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   	// GNU General Public License for more details.
15   	
16   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/*
26   	 *
27   	 * Copyright (c) 1994
28   	 * Hewlett-Packard Company
29   	 *
30   	 * Permission to use, copy, modify, distribute and sell this software
31   	 * and its documentation for any purpose is hereby granted without fee,
32   	 * provided that the above copyright notice appear in all copies and
33   	 * that both that copyright notice and this permission notice appear
34   	 * in supporting documentation.  Hewlett-Packard Company makes no
35   	 * representations about the suitability of this software for any
36   	 * purpose.  It is provided "as is" without express or implied warranty.
37   	 *
38   	 *
39   	 * Copyright (c) 1996-1998
40   	 * Silicon Graphics Computer Systems, Inc.
41   	 *
42   	 * Permission to use, copy, modify, distribute and sell this software
43   	 * and its documentation for any purpose is hereby granted without fee,
44   	 * provided that the above copyright notice appear in all copies and
45   	 * that both that copyright notice and this permission notice appear
46   	 * in supporting documentation.  Silicon Graphics makes no
47   	 * representations about the suitability of this software for any
48   	 * purpose.  It is provided "as is" without express or implied warranty.
49   	 */
50   	
51   	/** @file bits/stl_function.h
52   	 *  This is an internal header file, included by other library headers.
53   	 *  Do not attempt to use it directly. @headername{functional}
54   	 */
55   	
56   	#ifndef _STL_FUNCTION_H
57   	#define _STL_FUNCTION_H 1
58   	
59   	namespace std _GLIBCXX_VISIBILITY(default)
60   	{
61   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
62   	
63   	  // 20.3.1 base classes
64   	  /** @defgroup functors Function Objects
65   	   * @ingroup utilities
66   	   *
67   	   *  Function objects, or @e functors, are objects with an @c operator()
68   	   *  defined and accessible.  They can be passed as arguments to algorithm
69   	   *  templates and used in place of a function pointer.  Not only is the
70   	   *  resulting expressiveness of the library increased, but the generated
71   	   *  code can be more efficient than what you might write by hand.  When we
72   	   *  refer to @a functors, then, generally we include function pointers in
73   	   *  the description as well.
74   	   *
75   	   *  Often, functors are only created as temporaries passed to algorithm
76   	   *  calls, rather than being created as named variables.
77   	   *
78   	   *  Two examples taken from the standard itself follow.  To perform a
79   	   *  by-element addition of two vectors @c a and @c b containing @c double,
80   	   *  and put the result in @c a, use
81   	   *  \code
82   	   *  transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
83   	   *  \endcode
84   	   *  To negate every element in @c a, use
85   	   *  \code
86   	   *  transform(a.begin(), a.end(), a.begin(), negate<double>());
87   	   *  \endcode
88   	   *  The addition and negation functions will be inlined directly.
89   	   *
90   	   *  The standard functors are derived from structs named @c unary_function
91   	   *  and @c binary_function.  These two classes contain nothing but typedefs,
92   	   *  to aid in generic (template) programming.  If you write your own
93   	   *  functors, you might consider doing the same.
94   	   *
95   	   *  @{
96   	   */
97   	  /**
98   	   *  This is one of the @link functors functor base classes@endlink.
99   	   */
100  	  template<typename _Arg, typename _Result>
101  	    struct unary_function
102  	    {
103  	      /// @c argument_type is the type of the argument
104  	      typedef _Arg 	argument_type;   
105  	
106  	      /// @c result_type is the return type
107  	      typedef _Result 	result_type;  
108  	    };
109  	
110  	  /**
111  	   *  This is one of the @link functors functor base classes@endlink.
112  	   */
113  	  template<typename _Arg1, typename _Arg2, typename _Result>
114  	    struct binary_function
115  	    {
116  	      /// @c first_argument_type is the type of the first argument
117  	      typedef _Arg1 	first_argument_type; 
118  	
119  	      /// @c second_argument_type is the type of the second argument
120  	      typedef _Arg2 	second_argument_type;
121  	
122  	      /// @c result_type is the return type
123  	      typedef _Result 	result_type;
124  	    };
125  	  /** @}  */
126  	
127  	  // 20.3.2 arithmetic
128  	  /** @defgroup arithmetic_functors Arithmetic Classes
129  	   * @ingroup functors
130  	   *
131  	   *  Because basic math often needs to be done during an algorithm,
132  	   *  the library provides functors for those operations.  See the
133  	   *  documentation for @link functors the base classes@endlink
134  	   *  for examples of their use.
135  	   *
136  	   *  @{
137  	   */
138  	  /// One of the @link arithmetic_functors math functors@endlink.
139  	  template<typename _Tp>
140  	    struct plus : public binary_function<_Tp, _Tp, _Tp>
141  	    {
142  	      _Tp
143  	      operator()(const _Tp& __x, const _Tp& __y) const
144  	      { return __x + __y; }
145  	    };
146  	
147  	  /// One of the @link arithmetic_functors math functors@endlink.
148  	  template<typename _Tp>
149  	    struct minus : public binary_function<_Tp, _Tp, _Tp>
150  	    {
151  	      _Tp
152  	      operator()(const _Tp& __x, const _Tp& __y) const
153  	      { return __x - __y; }
154  	    };
155  	
156  	  /// One of the @link arithmetic_functors math functors@endlink.
157  	  template<typename _Tp>
158  	    struct multiplies : public binary_function<_Tp, _Tp, _Tp>
159  	    {
160  	      _Tp
161  	      operator()(const _Tp& __x, const _Tp& __y) const
162  	      { return __x * __y; }
163  	    };
164  	
165  	  /// One of the @link arithmetic_functors math functors@endlink.
166  	  template<typename _Tp>
167  	    struct divides : public binary_function<_Tp, _Tp, _Tp>
168  	    {
169  	      _Tp
170  	      operator()(const _Tp& __x, const _Tp& __y) const
171  	      { return __x / __y; }
172  	    };
173  	
174  	  /// One of the @link arithmetic_functors math functors@endlink.
175  	  template<typename _Tp>
176  	    struct modulus : public binary_function<_Tp, _Tp, _Tp>
177  	    {
178  	      _Tp
179  	      operator()(const _Tp& __x, const _Tp& __y) const
180  	      { return __x % __y; }
181  	    };
182  	
183  	  /// One of the @link arithmetic_functors math functors@endlink.
184  	  template<typename _Tp>
185  	    struct negate : public unary_function<_Tp, _Tp>
186  	    {
187  	      _Tp
188  	      operator()(const _Tp& __x) const
189  	      { return -__x; }
190  	    };
191  	  /** @}  */
192  	
193  	  // 20.3.3 comparisons
194  	  /** @defgroup comparison_functors Comparison Classes
195  	   * @ingroup functors
196  	   *
197  	   *  The library provides six wrapper functors for all the basic comparisons
198  	   *  in C++, like @c <.
199  	   *
200  	   *  @{
201  	   */
202  	  /// One of the @link comparison_functors comparison functors@endlink.
203  	  template<typename _Tp>
204  	    struct equal_to : public binary_function<_Tp, _Tp, bool>
205  	    {
206  	      bool
207  	      operator()(const _Tp& __x, const _Tp& __y) const
208  	      { return __x == __y; }
209  	    };
210  	
211  	  /// One of the @link comparison_functors comparison functors@endlink.
212  	  template<typename _Tp>
213  	    struct not_equal_to : public binary_function<_Tp, _Tp, bool>
214  	    {
215  	      bool
216  	      operator()(const _Tp& __x, const _Tp& __y) const
217  	      { return __x != __y; }
218  	    };
219  	
220  	  /// One of the @link comparison_functors comparison functors@endlink.
221  	  template<typename _Tp>
222  	    struct greater : public binary_function<_Tp, _Tp, bool>
223  	    {
224  	      bool
225  	      operator()(const _Tp& __x, const _Tp& __y) const
226  	      { return __x > __y; }
227  	    };
228  	
229  	  /// One of the @link comparison_functors comparison functors@endlink.
230  	  template<typename _Tp>
231  	    struct less : public binary_function<_Tp, _Tp, bool>
232  	    {
233  	      bool
234  	      operator()(const _Tp& __x, const _Tp& __y) const
235  	      { return __x < __y; }
236  	    };
237  	
238  	  /// One of the @link comparison_functors comparison functors@endlink.
239  	  template<typename _Tp>
240  	    struct greater_equal : public binary_function<_Tp, _Tp, bool>
241  	    {
242  	      bool
243  	      operator()(const _Tp& __x, const _Tp& __y) const
244  	      { return __x >= __y; }
245  	    };
246  	
247  	  /// One of the @link comparison_functors comparison functors@endlink.
248  	  template<typename _Tp>
249  	    struct less_equal : public binary_function<_Tp, _Tp, bool>
250  	    {
251  	      bool
252  	      operator()(const _Tp& __x, const _Tp& __y) const
253  	      { return __x <= __y; }
254  	    };
255  	  /** @}  */
256  	
257  	  // 20.3.4 logical operations
258  	  /** @defgroup logical_functors Boolean Operations Classes
259  	   * @ingroup functors
260  	   *
261  	   *  Here are wrapper functors for Boolean operations: @c &&, @c ||,
262  	   *  and @c !.
263  	   *
264  	   *  @{
265  	   */
266  	  /// One of the @link logical_functors Boolean operations functors@endlink.
267  	  template<typename _Tp>
268  	    struct logical_and : public binary_function<_Tp, _Tp, bool>
269  	    {
270  	      bool
271  	      operator()(const _Tp& __x, const _Tp& __y) const
272  	      { return __x && __y; }
273  	    };
274  	
275  	  /// One of the @link logical_functors Boolean operations functors@endlink.
276  	  template<typename _Tp>
277  	    struct logical_or : public binary_function<_Tp, _Tp, bool>
278  	    {
279  	      bool
280  	      operator()(const _Tp& __x, const _Tp& __y) const
281  	      { return __x || __y; }
282  	    };
283  	
284  	  /// One of the @link logical_functors Boolean operations functors@endlink.
285  	  template<typename _Tp>
286  	    struct logical_not : public unary_function<_Tp, bool>
287  	    {
288  	      bool
289  	      operator()(const _Tp& __x) const
290  	      { return !__x; }
291  	    };
292  	  /** @}  */
293  	
294  	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
295  	  // DR 660. Missing Bitwise Operations.
296  	  template<typename _Tp>
297  	    struct bit_and : public binary_function<_Tp, _Tp, _Tp>
298  	    {
299  	      _Tp
300  	      operator()(const _Tp& __x, const _Tp& __y) const
301  	      { return __x & __y; }
302  	    };
303  	
304  	  template<typename _Tp>
305  	    struct bit_or : public binary_function<_Tp, _Tp, _Tp>
306  	    {
307  	      _Tp
308  	      operator()(const _Tp& __x, const _Tp& __y) const
309  	      { return __x | __y; }
310  	    };
311  	
312  	  template<typename _Tp>
313  	    struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
314  	    {
315  	      _Tp
316  	      operator()(const _Tp& __x, const _Tp& __y) const
317  	      { return __x ^ __y; }
318  	    };
319  	
320  	  // 20.3.5 negators
321  	  /** @defgroup negators Negators
322  	   * @ingroup functors
323  	   *
324  	   *  The functions @c not1 and @c not2 each take a predicate functor
325  	   *  and return an instance of @c unary_negate or
326  	   *  @c binary_negate, respectively.  These classes are functors whose
327  	   *  @c operator() performs the stored predicate function and then returns
328  	   *  the negation of the result.
329  	   *
330  	   *  For example, given a vector of integers and a trivial predicate,
331  	   *  \code
332  	   *  struct IntGreaterThanThree
333  	   *    : public std::unary_function<int, bool>
334  	   *  {
335  	   *      bool operator() (int x) { return x > 3; }
336  	   *  };
337  	   *
338  	   *  std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
339  	   *  \endcode
340  	   *  The call to @c find_if will locate the first index (i) of @c v for which
341  	   *  <code>!(v[i] > 3)</code> is true.
342  	   *
343  	   *  The not1/unary_negate combination works on predicates taking a single
344  	   *  argument.  The not2/binary_negate combination works on predicates which
345  	   *  take two arguments.
346  	   *
347  	   *  @{
348  	   */
349  	  /// One of the @link negators negation functors@endlink.
350  	  template<typename _Predicate>
351  	    class unary_negate
352  	    : public unary_function<typename _Predicate::argument_type, bool>
353  	    {
354  	    protected:
355  	      _Predicate _M_pred;
356  	
357  	    public:
358  	      explicit
359  	      unary_negate(const _Predicate& __x) : _M_pred(__x) { }
360  	
361  	      bool
362  	      operator()(const typename _Predicate::argument_type& __x) const
363  	      { return !_M_pred(__x); }
364  	    };
365  	
366  	  /// One of the @link negators negation functors@endlink.
367  	  template<typename _Predicate>
368  	    inline unary_negate<_Predicate>
369  	    not1(const _Predicate& __pred)
370  	    { return unary_negate<_Predicate>(__pred); }
371  	
372  	  /// One of the @link negators negation functors@endlink.
373  	  template<typename _Predicate>
374  	    class binary_negate
375  	    : public binary_function<typename _Predicate::first_argument_type,
376  				     typename _Predicate::second_argument_type, bool>
377  	    {
378  	    protected:
379  	      _Predicate _M_pred;
380  	
381  	    public:
382  	      explicit
383  	      binary_negate(const _Predicate& __x) : _M_pred(__x) { }
384  	
385  	      bool
386  	      operator()(const typename _Predicate::first_argument_type& __x,
387  			 const typename _Predicate::second_argument_type& __y) const
388  	      { return !_M_pred(__x, __y); }
389  	    };
390  	
391  	  /// One of the @link negators negation functors@endlink.
392  	  template<typename _Predicate>
393  	    inline binary_negate<_Predicate>
394  	    not2(const _Predicate& __pred)
395  	    { return binary_negate<_Predicate>(__pred); }
396  	  /** @}  */
397  	
398  	  // 20.3.7 adaptors pointers functions
399  	  /** @defgroup pointer_adaptors Adaptors for pointers to functions
400  	   * @ingroup functors
401  	   *
402  	   *  The advantage of function objects over pointers to functions is that
403  	   *  the objects in the standard library declare nested typedefs describing
404  	   *  their argument and result types with uniform names (e.g., @c result_type
405  	   *  from the base classes @c unary_function and @c binary_function).
406  	   *  Sometimes those typedefs are required, not just optional.
407  	   *
408  	   *  Adaptors are provided to turn pointers to unary (single-argument) and
409  	   *  binary (double-argument) functions into function objects.  The
410  	   *  long-winded functor @c pointer_to_unary_function is constructed with a
411  	   *  function pointer @c f, and its @c operator() called with argument @c x
412  	   *  returns @c f(x).  The functor @c pointer_to_binary_function does the same
413  	   *  thing, but with a double-argument @c f and @c operator().
414  	   *
415  	   *  The function @c ptr_fun takes a pointer-to-function @c f and constructs
416  	   *  an instance of the appropriate functor.
417  	   *
418  	   *  @{
419  	   */
420  	  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
421  	  template<typename _Arg, typename _Result>
422  	    class pointer_to_unary_function : public unary_function<_Arg, _Result>
423  	    {
424  	    protected:
425  	      _Result (*_M_ptr)(_Arg);
426  	
427  	    public:
428  	      pointer_to_unary_function() { }
429  	
430  	      explicit
431  	      pointer_to_unary_function(_Result (*__x)(_Arg))
432  	      : _M_ptr(__x) { }
433  	
434  	      _Result
435  	      operator()(_Arg __x) const
436  	      { return _M_ptr(__x); }
437  	    };
438  	
439  	  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
440  	  template<typename _Arg, typename _Result>
441  	    inline pointer_to_unary_function<_Arg, _Result>
442  	    ptr_fun(_Result (*__x)(_Arg))
443  	    { return pointer_to_unary_function<_Arg, _Result>(__x); }
444  	
445  	  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
446  	  template<typename _Arg1, typename _Arg2, typename _Result>
447  	    class pointer_to_binary_function
448  	    : public binary_function<_Arg1, _Arg2, _Result>
449  	    {
450  	    protected:
451  	      _Result (*_M_ptr)(_Arg1, _Arg2);
452  	
453  	    public:
454  	      pointer_to_binary_function() { }
455  	
456  	      explicit
457  	      pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
458  	      : _M_ptr(__x) { }
459  	
460  	      _Result
461  	      operator()(_Arg1 __x, _Arg2 __y) const
462  	      { return _M_ptr(__x, __y); }
463  	    };
464  	
465  	  /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
466  	  template<typename _Arg1, typename _Arg2, typename _Result>
467  	    inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
468  	    ptr_fun(_Result (*__x)(_Arg1, _Arg2))
469  	    { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
470  	  /** @}  */
471  	
472  	  template<typename _Tp>
473  	    struct _Identity
474  	    : public unary_function<_Tp,_Tp>
475  	    {
476  	      _Tp&
477  	      operator()(_Tp& __x) const
478  	      { return __x; }
479  	
480  	      const _Tp&
481  	      operator()(const _Tp& __x) const
482  	      { return __x; }
483  	    };
484  	
485  	  template<typename _Pair>
486  	    struct _Select1st
487  	    : public unary_function<_Pair, typename _Pair::first_type>
488  	    {
489  	      typename _Pair::first_type&
490  	      operator()(_Pair& __x) const
491  	      { return __x.first; }
492  	
493  	      const typename _Pair::first_type&
494  	      operator()(const _Pair& __x) const
495  	      { return __x.first; }
496  	
497  	#if __cplusplus >= 201103L
498  	      template<typename _Pair2>
499  	        typename _Pair2::first_type&
500  	        operator()(_Pair2& __x) const
501  	        { return __x.first; }
502  	
503  	      template<typename _Pair2>
504  	        const typename _Pair2::first_type&
505  	        operator()(const _Pair2& __x) const
506  	        { return __x.first; }
507  	#endif
508  	    };
509  	
510  	  template<typename _Pair>
511  	    struct _Select2nd
512  	    : public unary_function<_Pair, typename _Pair::second_type>
513  	    {
514  	      typename _Pair::second_type&
515  	      operator()(_Pair& __x) const
516  	      { return __x.second; }
517  	
518  	      const typename _Pair::second_type&
519  	      operator()(const _Pair& __x) const
520  	      { return __x.second; }
521  	    };
522  	
523  	  // 20.3.8 adaptors pointers members
524  	  /** @defgroup memory_adaptors Adaptors for pointers to members
525  	   * @ingroup functors
526  	   *
527  	   *  There are a total of 8 = 2^3 function objects in this family.
528  	   *   (1) Member functions taking no arguments vs member functions taking
529  	   *        one argument.
530  	   *   (2) Call through pointer vs call through reference.
531  	   *   (3) Const vs non-const member function.
532  	   *
533  	   *  All of this complexity is in the function objects themselves.  You can
534  	   *   ignore it by using the helper function mem_fun and mem_fun_ref,
535  	   *   which create whichever type of adaptor is appropriate.
536  	   *
537  	   *  @{
538  	   */
539  	  /// One of the @link memory_adaptors adaptors for member
540  	  /// pointers@endlink.
541  	  template<typename _Ret, typename _Tp>
542  	    class mem_fun_t : public unary_function<_Tp*, _Ret>
543  	    {
544  	    public:
545  	      explicit
546  	      mem_fun_t(_Ret (_Tp::*__pf)())
547  	      : _M_f(__pf) { }
548  	
549  	      _Ret
550  	      operator()(_Tp* __p) const
551  	      { return (__p->*_M_f)(); }
552  	
553  	    private:
554  	      _Ret (_Tp::*_M_f)();
555  	    };
556  	
557  	  /// One of the @link memory_adaptors adaptors for member
558  	  /// pointers@endlink.
559  	  template<typename _Ret, typename _Tp>
560  	    class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
561  	    {
562  	    public:
563  	      explicit
564  	      const_mem_fun_t(_Ret (_Tp::*__pf)() const)
565  	      : _M_f(__pf) { }
566  	
567  	      _Ret
568  	      operator()(const _Tp* __p) const
569  	      { return (__p->*_M_f)(); }
570  	
571  	    private:
572  	      _Ret (_Tp::*_M_f)() const;
573  	    };
574  	
575  	  /// One of the @link memory_adaptors adaptors for member
576  	  /// pointers@endlink.
577  	  template<typename _Ret, typename _Tp>
578  	    class mem_fun_ref_t : public unary_function<_Tp, _Ret>
579  	    {
580  	    public:
581  	      explicit
582  	      mem_fun_ref_t(_Ret (_Tp::*__pf)())
583  	      : _M_f(__pf) { }
584  	
585  	      _Ret
586  	      operator()(_Tp& __r) const
587  	      { return (__r.*_M_f)(); }
588  	
589  	    private:
590  	      _Ret (_Tp::*_M_f)();
591  	  };
592  	
593  	  /// One of the @link memory_adaptors adaptors for member
594  	  /// pointers@endlink.
595  	  template<typename _Ret, typename _Tp>
596  	    class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
597  	    {
598  	    public:
599  	      explicit
600  	      const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
601  	      : _M_f(__pf) { }
602  	
603  	      _Ret
604  	      operator()(const _Tp& __r) const
605  	      { return (__r.*_M_f)(); }
606  	
607  	    private:
608  	      _Ret (_Tp::*_M_f)() const;
609  	    };
610  	
611  	  /// One of the @link memory_adaptors adaptors for member
612  	  /// pointers@endlink.
613  	  template<typename _Ret, typename _Tp, typename _Arg>
614  	    class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
615  	    {
616  	    public:
617  	      explicit
618  	      mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
619  	      : _M_f(__pf) { }
620  	
621  	      _Ret
622  	      operator()(_Tp* __p, _Arg __x) const
623  	      { return (__p->*_M_f)(__x); }
624  	
625  	    private:
626  	      _Ret (_Tp::*_M_f)(_Arg);
627  	    };
628  	
629  	  /// One of the @link memory_adaptors adaptors for member
630  	  /// pointers@endlink.
631  	  template<typename _Ret, typename _Tp, typename _Arg>
632  	    class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
633  	    {
634  	    public:
635  	      explicit
636  	      const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
637  	      : _M_f(__pf) { }
638  	
639  	      _Ret
640  	      operator()(const _Tp* __p, _Arg __x) const
641  	      { return (__p->*_M_f)(__x); }
642  	
643  	    private:
644  	      _Ret (_Tp::*_M_f)(_Arg) const;
645  	    };
646  	
647  	  /// One of the @link memory_adaptors adaptors for member
648  	  /// pointers@endlink.
649  	  template<typename _Ret, typename _Tp, typename _Arg>
650  	    class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
651  	    {
652  	    public:
653  	      explicit
654  	      mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
655  	      : _M_f(__pf) { }
656  	
657  	      _Ret
658  	      operator()(_Tp& __r, _Arg __x) const
659  	      { return (__r.*_M_f)(__x); }
660  	
661  	    private:
662  	      _Ret (_Tp::*_M_f)(_Arg);
663  	    };
664  	
665  	  /// One of the @link memory_adaptors adaptors for member
666  	  /// pointers@endlink.
667  	  template<typename _Ret, typename _Tp, typename _Arg>
668  	    class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
669  	    {
670  	    public:
671  	      explicit
672  	      const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
673  	      : _M_f(__pf) { }
674  	
675  	      _Ret
676  	      operator()(const _Tp& __r, _Arg __x) const
677  	      { return (__r.*_M_f)(__x); }
678  	
679  	    private:
680  	      _Ret (_Tp::*_M_f)(_Arg) const;
681  	    };
682  	
683  	  // Mem_fun adaptor helper functions.  There are only two:
684  	  // mem_fun and mem_fun_ref.
685  	  template<typename _Ret, typename _Tp>
686  	    inline mem_fun_t<_Ret, _Tp>
687  	    mem_fun(_Ret (_Tp::*__f)())
688  	    { return mem_fun_t<_Ret, _Tp>(__f); }
689  	
690  	  template<typename _Ret, typename _Tp>
691  	    inline const_mem_fun_t<_Ret, _Tp>
692  	    mem_fun(_Ret (_Tp::*__f)() const)
693  	    { return const_mem_fun_t<_Ret, _Tp>(__f); }
694  	
695  	  template<typename _Ret, typename _Tp>
696  	    inline mem_fun_ref_t<_Ret, _Tp>
697  	    mem_fun_ref(_Ret (_Tp::*__f)())
698  	    { return mem_fun_ref_t<_Ret, _Tp>(__f); }
699  	
700  	  template<typename _Ret, typename _Tp>
701  	    inline const_mem_fun_ref_t<_Ret, _Tp>
702  	    mem_fun_ref(_Ret (_Tp::*__f)() const)
703  	    { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
704  	
705  	  template<typename _Ret, typename _Tp, typename _Arg>
706  	    inline mem_fun1_t<_Ret, _Tp, _Arg>
707  	    mem_fun(_Ret (_Tp::*__f)(_Arg))
708  	    { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
709  	
710  	  template<typename _Ret, typename _Tp, typename _Arg>
711  	    inline const_mem_fun1_t<_Ret, _Tp, _Arg>
712  	    mem_fun(_Ret (_Tp::*__f)(_Arg) const)
713  	    { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
714  	
715  	  template<typename _Ret, typename _Tp, typename _Arg>
716  	    inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
717  	    mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
718  	    { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
719  	
720  	  template<typename _Ret, typename _Tp, typename _Arg>
721  	    inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
722  	    mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
723  	    { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
724  	
725  	  /** @}  */
726  	
727  	_GLIBCXX_END_NAMESPACE_VERSION
728  	} // namespace
729  	
730  	#if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
731  	# include <backward/binders.h>
732  	#endif
733  	
734  	#endif /* _STL_FUNCTION_H */
735