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