]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libstdc++-v3/contrib/libstdc++-v3-4.8/include/bits/stl_function.h
update
[l4.git] / l4 / pkg / libstdc++-v3 / contrib / libstdc++-v3-4.8 / include / bits / stl_function.h
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 */