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