1 : // Functor implementations -*- C++ -*-
2 :
3 : // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
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 bits/stl_function.h
53 : * This is an internal header file, included by other library headers.
54 : * Do not attempt to use it directly. @headername{functional}
55 : */
56 :
57 : #ifndef _STL_FUNCTION_H
58 : #define _STL_FUNCTION_H 1
59 :
60 : namespace std _GLIBCXX_VISIBILITY(default)
61 : {
62 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
63 :
64 : // 20.3.1 base classes
65 : /** @defgroup functors Function Objects
66 : * @ingroup utilities
67 : *
68 : * Function objects, or @e functors, are objects with an @c operator()
69 : * defined and accessible. They can be passed as arguments to algorithm
70 : * templates and used in place of a function pointer. Not only is the
71 : * resulting expressiveness of the library increased, but the generated
72 : * code can be more efficient than what you might write by hand. When we
73 : * refer to @a functors, then, generally we include function pointers in
74 : * the description as well.
75 : *
76 : * Often, functors are only created as temporaries passed to algorithm
77 : * calls, rather than being created as named variables.
78 : *
79 : * Two examples taken from the standard itself follow. To perform a
80 : * by-element addition of two vectors @c a and @c b containing @c double,
81 : * and put the result in @c a, use
82 : * \code
83 : * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
84 : * \endcode
85 : * To negate every element in @c a, use
86 : * \code
87 : * transform(a.begin(), a.end(), a.begin(), negate<double>());
88 : * \endcode
89 : * The addition and negation functions will be inlined directly.
90 : *
91 : * The standard functors are derived from structs named @c unary_function
92 : * and @c binary_function. These two classes contain nothing but typedefs,
93 : * to aid in generic (template) programming. If you write your own
94 : * functors, you might consider doing the same.
95 : *
96 : * @{
97 : */
98 : /**
99 : * This is one of the @link functors functor base classes@endlink.
100 : */
101 : template<typename _Arg, typename _Result>
102 : struct unary_function
103 : {
104 : /// @c argument_type is the type of the argument
105 : typedef _Arg argument_type;
106 :
107 : /// @c result_type is the return type
108 : typedef _Result result_type;
109 : };
110 :
111 : /**
112 : * This is one of the @link functors functor base classes@endlink.
113 : */
114 : template<typename _Arg1, typename _Arg2, typename _Result>
115 : struct binary_function
116 : {
117 : /// @c first_argument_type is the type of the first argument
118 : typedef _Arg1 first_argument_type;
119 :
120 : /// @c second_argument_type is the type of the second argument
121 : typedef _Arg2 second_argument_type;
122 :
123 : /// @c result_type is the return type
124 : typedef _Result result_type;
125 : };
126 : /** @} */
127 :
128 : // 20.3.2 arithmetic
129 : /** @defgroup arithmetic_functors Arithmetic Classes
130 : * @ingroup functors
131 : *
132 : * Because basic math often needs to be done during an algorithm,
133 : * the library provides functors for those operations. See the
134 : * documentation for @link functors the base classes@endlink
135 : * for examples of their use.
136 : *
137 : * @{
138 : */
139 : /// One of the @link arithmetic_functors math functors@endlink.
140 : template<typename _Tp>
141 : struct plus : public binary_function<_Tp, _Tp, _Tp>
142 : {
143 : _Tp
144 : operator()(const _Tp& __x, const _Tp& __y) const
145 : { return __x + __y; }
146 : };
147 :
148 : /// One of the @link arithmetic_functors math functors@endlink.
149 : template<typename _Tp>
150 : struct minus : public binary_function<_Tp, _Tp, _Tp>
151 : {
152 : _Tp
153 : operator()(const _Tp& __x, const _Tp& __y) const
154 : { return __x - __y; }
155 : };
156 :
157 : /// One of the @link arithmetic_functors math functors@endlink.
158 : template<typename _Tp>
159 : struct multiplies : public binary_function<_Tp, _Tp, _Tp>
160 : {
161 : _Tp
162 : operator()(const _Tp& __x, const _Tp& __y) const
163 : { return __x * __y; }
164 : };
165 :
166 : /// One of the @link arithmetic_functors math functors@endlink.
167 : template<typename _Tp>
168 : struct divides : public binary_function<_Tp, _Tp, _Tp>
169 : {
170 : _Tp
171 : operator()(const _Tp& __x, const _Tp& __y) const
172 : { return __x / __y; }
173 : };
174 :
175 : /// One of the @link arithmetic_functors math functors@endlink.
176 : template<typename _Tp>
177 : struct modulus : public binary_function<_Tp, _Tp, _Tp>
178 : {
179 : _Tp
180 : operator()(const _Tp& __x, const _Tp& __y) const
181 : { return __x % __y; }
182 : };
183 :
184 : /// One of the @link arithmetic_functors math functors@endlink.
185 : template<typename _Tp>
186 : struct negate : public unary_function<_Tp, _Tp>
187 : {
188 : _Tp
189 : operator()(const _Tp& __x) const
190 : { return -__x; }
191 : };
192 : /** @} */
193 :
194 : // 20.3.3 comparisons
195 : /** @defgroup comparison_functors Comparison Classes
196 : * @ingroup functors
197 : *
198 : * The library provides six wrapper functors for all the basic comparisons
199 : * in C++, like @c <.
200 : *
201 : * @{
202 : */
203 : /// One of the @link comparison_functors comparison functors@endlink.
204 : template<typename _Tp>
205 : struct equal_to : public binary_function<_Tp, _Tp, bool>
206 : {
207 : bool
208 : operator()(const _Tp& __x, const _Tp& __y) const
209 : { return __x == __y; }
210 : };
211 :
212 : /// One of the @link comparison_functors comparison functors@endlink.
213 : template<typename _Tp>
214 : struct not_equal_to : public binary_function<_Tp, _Tp, bool>
215 : {
216 : bool
217 : operator()(const _Tp& __x, const _Tp& __y) const
218 : { return __x != __y; }
219 : };
220 :
221 : /// One of the @link comparison_functors comparison functors@endlink.
222 : template<typename _Tp>
223 : struct greater : public binary_function<_Tp, _Tp, bool>
224 : {
225 : bool
226 : operator()(const _Tp& __x, const _Tp& __y) const
227 : { return __x > __y; }
228 : };
229 :
230 : /// One of the @link comparison_functors comparison functors@endlink.
231 : template<typename _Tp>
232 : struct less : public binary_function<_Tp, _Tp, bool>
233 : {
234 : bool
235 11455 : operator()(const _Tp& __x, const _Tp& __y) const
236 11455 : { return __x < __y; }
237 : };
238 :
239 : /// One of the @link comparison_functors comparison functors@endlink.
240 : template<typename _Tp>
241 : struct greater_equal : public binary_function<_Tp, _Tp, bool>
242 : {
243 : bool
244 : operator()(const _Tp& __x, const _Tp& __y) const
245 : { return __x >= __y; }
246 : };
247 :
248 : /// One of the @link comparison_functors comparison functors@endlink.
249 : template<typename _Tp>
250 : struct less_equal : public binary_function<_Tp, _Tp, bool>
251 : {
252 : bool
253 : operator()(const _Tp& __x, const _Tp& __y) const
254 : { return __x <= __y; }
255 : };
256 : /** @} */
257 :
258 : // 20.3.4 logical operations
259 : /** @defgroup logical_functors Boolean Operations Classes
260 : * @ingroup functors
261 : *
262 : * Here are wrapper functors for Boolean operations: @c &&, @c ||,
263 : * and @c !.
264 : *
265 : * @{
266 : */
267 : /// One of the @link logical_functors Boolean operations functors@endlink.
268 : template<typename _Tp>
269 : struct logical_and : public binary_function<_Tp, _Tp, bool>
270 : {
271 : bool
272 : operator()(const _Tp& __x, const _Tp& __y) const
273 : { return __x && __y; }
274 : };
275 :
276 : /// One of the @link logical_functors Boolean operations functors@endlink.
277 : template<typename _Tp>
278 : struct logical_or : public binary_function<_Tp, _Tp, bool>
279 : {
280 : bool
281 : operator()(const _Tp& __x, const _Tp& __y) const
282 : { return __x || __y; }
283 : };
284 :
285 : /// One of the @link logical_functors Boolean operations functors@endlink.
286 : template<typename _Tp>
287 : struct logical_not : public unary_function<_Tp, bool>
288 : {
289 : bool
290 : operator()(const _Tp& __x) const
291 : { return !__x; }
292 : };
293 : /** @} */
294 :
295 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
296 : // DR 660. Missing Bitwise Operations.
297 : template<typename _Tp>
298 : struct bit_and : public binary_function<_Tp, _Tp, _Tp>
299 : {
300 : _Tp
301 : operator()(const _Tp& __x, const _Tp& __y) const
302 : { return __x & __y; }
303 : };
304 :
305 : template<typename _Tp>
306 : struct bit_or : public binary_function<_Tp, _Tp, _Tp>
307 : {
308 : _Tp
309 : operator()(const _Tp& __x, const _Tp& __y) const
310 : { return __x | __y; }
311 : };
312 :
313 : template<typename _Tp>
314 : struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
315 : {
316 : _Tp
317 : operator()(const _Tp& __x, const _Tp& __y) const
318 : { return __x ^ __y; }
319 : };
320 :
321 : // 20.3.5 negators
322 : /** @defgroup negators Negators
323 : * @ingroup functors
324 : *
325 : * The functions @c not1 and @c not2 each take a predicate functor
326 : * and return an instance of @c unary_negate or
327 : * @c binary_negate, respectively. These classes are functors whose
328 : * @c operator() performs the stored predicate function and then returns
329 : * the negation of the result.
330 : *
331 : * For example, given a vector of integers and a trivial predicate,
332 : * \code
333 : * struct IntGreaterThanThree
334 : * : public std::unary_function<int, bool>
335 : * {
336 : * bool operator() (int x) { return x > 3; }
337 : * };
338 : *
339 : * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
340 : * \endcode
341 : * The call to @c find_if will locate the first index (i) of @c v for which
342 : * <code>!(v[i] > 3)</code> is true.
343 : *
344 : * The not1/unary_negate combination works on predicates taking a single
345 : * argument. The not2/binary_negate combination works on predicates which
346 : * take two arguments.
347 : *
348 : * @{
349 : */
350 : /// One of the @link negators negation functors@endlink.
351 : template<typename _Predicate>
352 : class unary_negate
353 : : public unary_function<typename _Predicate::argument_type, bool>
354 : {
355 : protected:
356 : _Predicate _M_pred;
357 :
358 : public:
359 : explicit
360 : unary_negate(const _Predicate& __x) : _M_pred(__x) { }
361 :
362 : bool
363 : operator()(const typename _Predicate::argument_type& __x) const
364 : { return !_M_pred(__x); }
365 : };
366 :
367 : /// One of the @link negators negation functors@endlink.
368 : template<typename _Predicate>
369 : inline unary_negate<_Predicate>
370 : not1(const _Predicate& __pred)
371 : { return unary_negate<_Predicate>(__pred); }
372 :
373 : /// One of the @link negators negation functors@endlink.
374 : template<typename _Predicate>
375 : class binary_negate
376 : : public binary_function<typename _Predicate::first_argument_type,
377 : typename _Predicate::second_argument_type, bool>
378 : {
379 : protected:
380 : _Predicate _M_pred;
381 :
382 : public:
383 : explicit
384 : binary_negate(const _Predicate& __x) : _M_pred(__x) { }
385 :
386 : bool
387 : operator()(const typename _Predicate::first_argument_type& __x,
388 : const typename _Predicate::second_argument_type& __y) const
389 : { return !_M_pred(__x, __y); }
390 : };
391 :
392 : /// One of the @link negators negation functors@endlink.
393 : template<typename _Predicate>
394 : inline binary_negate<_Predicate>
395 : not2(const _Predicate& __pred)
396 : { return binary_negate<_Predicate>(__pred); }
397 : /** @} */
398 :
399 : // 20.3.7 adaptors pointers functions
400 : /** @defgroup pointer_adaptors Adaptors for pointers to functions
401 : * @ingroup functors
402 : *
403 : * The advantage of function objects over pointers to functions is that
404 : * the objects in the standard library declare nested typedefs describing
405 : * their argument and result types with uniform names (e.g., @c result_type
406 : * from the base classes @c unary_function and @c binary_function).
407 : * Sometimes those typedefs are required, not just optional.
408 : *
409 : * Adaptors are provided to turn pointers to unary (single-argument) and
410 : * binary (double-argument) functions into function objects. The
411 : * long-winded functor @c pointer_to_unary_function is constructed with a
412 : * function pointer @c f, and its @c operator() called with argument @c x
413 : * returns @c f(x). The functor @c pointer_to_binary_function does the same
414 : * thing, but with a double-argument @c f and @c operator().
415 : *
416 : * The function @c ptr_fun takes a pointer-to-function @c f and constructs
417 : * an instance of the appropriate functor.
418 : *
419 : * @{
420 : */
421 : /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
422 : template<typename _Arg, typename _Result>
423 : class pointer_to_unary_function : public unary_function<_Arg, _Result>
424 : {
425 : protected:
426 : _Result (*_M_ptr)(_Arg);
427 :
428 : public:
429 : pointer_to_unary_function() { }
430 :
431 : explicit
432 : pointer_to_unary_function(_Result (*__x)(_Arg))
433 : : _M_ptr(__x) { }
434 :
435 : _Result
436 : operator()(_Arg __x) const
437 : { return _M_ptr(__x); }
438 : };
439 :
440 : /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
441 : template<typename _Arg, typename _Result>
442 : inline pointer_to_unary_function<_Arg, _Result>
443 : ptr_fun(_Result (*__x)(_Arg))
444 : { return pointer_to_unary_function<_Arg, _Result>(__x); }
445 :
446 : /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
447 : template<typename _Arg1, typename _Arg2, typename _Result>
448 : class pointer_to_binary_function
449 : : public binary_function<_Arg1, _Arg2, _Result>
450 : {
451 : protected:
452 : _Result (*_M_ptr)(_Arg1, _Arg2);
453 :
454 : public:
455 : pointer_to_binary_function() { }
456 :
457 : explicit
458 : pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
459 : : _M_ptr(__x) { }
460 :
461 : _Result
462 : operator()(_Arg1 __x, _Arg2 __y) const
463 : { return _M_ptr(__x, __y); }
464 : };
465 :
466 : /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
467 : template<typename _Arg1, typename _Arg2, typename _Result>
468 : inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
469 : ptr_fun(_Result (*__x)(_Arg1, _Arg2))
470 : { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
471 : /** @} */
472 :
473 : template<typename _Tp>
474 : struct _Identity : public unary_function<_Tp,_Tp>
475 : {
476 : _Tp&
477 : operator()(_Tp& __x) const
478 : { return __x; }
479 :
480 : const _Tp&
481 2754 : operator()(const _Tp& __x) const
482 2754 : { return __x; }
483 : };
484 :
485 : template<typename _Pair>
486 : struct _Select1st : public unary_function<_Pair,
487 : 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 9141 : operator()(const _Pair& __x) const
495 9141 : { return __x.first; }
496 :
497 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
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 : public unary_function<_Pair,
512 : 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 !defined(__GXX_EXPERIMENTAL_CXX0X__) || _GLIBCXX_USE_DEPRECATED
731 : # include <backward/binders.h>
732 : #endif
733 :
734 : #endif /* _STL_FUNCTION_H */
|