4 * Hewlett-Packard Company
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
15 * Copyright (c) 1996-1998
16 * Silicon Graphics Computer Systems, Inc.
18 * Permission to use, copy, modify, distribute and sell this software
19 * and its documentation for any purpose is hereby granted without fee,
20 * provided that the above copyright notice appear in all copies and
21 * that both that copyright notice and this permission notice appear
22 * in supporting documentation. Silicon Graphics makes no
23 * representations about the suitability of this software for any
24 * purpose. It is provided "as is" without express or implied warranty.
27 /* NOTE: This is an internal header file, included by other STL headers.
28 * You should not attempt to use it directly.
31 #ifndef __SGI_STL_INTERNAL_FUNCTION_H
32 #define __SGI_STL_INTERNAL_FUNCTION_H
36 template <class _Arg
, class _Result
>
37 struct unary_function
{
38 typedef _Arg argument_type
;
39 typedef _Result result_type
;
42 template <class _Arg1
, class _Arg2
, class _Result
>
43 struct binary_function
{
44 typedef _Arg1 first_argument_type
;
45 typedef _Arg2 second_argument_type
;
46 typedef _Result result_type
;
50 struct plus
: public binary_function
<_Tp
,_Tp
,_Tp
> {
51 _Tp
operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
+ __y
; }
55 struct minus
: public binary_function
<_Tp
,_Tp
,_Tp
> {
56 _Tp
operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
- __y
; }
60 struct multiplies
: public binary_function
<_Tp
,_Tp
,_Tp
> {
61 _Tp
operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
* __y
; }
65 struct divides
: public binary_function
<_Tp
,_Tp
,_Tp
> {
66 _Tp
operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
/ __y
; }
69 // identity_element (not part of the C++ standard).
71 template <class _Tp
> inline _Tp
identity_element(plus
<_Tp
>) {
74 template <class _Tp
> inline _Tp
identity_element(multiplies
<_Tp
>) {
79 struct modulus
: public binary_function
<_Tp
,_Tp
,_Tp
>
81 _Tp
operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
% __y
; }
85 struct negate
: public unary_function
<_Tp
,_Tp
>
87 _Tp
operator()(const _Tp
& __x
) const { return -__x
; }
91 struct equal_to
: public binary_function
<_Tp
,_Tp
,bool>
93 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
== __y
; }
97 struct not_equal_to
: public binary_function
<_Tp
,_Tp
,bool>
99 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
!= __y
; }
103 struct greater
: public binary_function
<_Tp
,_Tp
,bool>
105 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
> __y
; }
109 struct less
: public binary_function
<_Tp
,_Tp
,bool>
111 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
< __y
; }
115 struct greater_equal
: public binary_function
<_Tp
,_Tp
,bool>
117 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
>= __y
; }
121 struct less_equal
: public binary_function
<_Tp
,_Tp
,bool>
123 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
<= __y
; }
127 struct logical_and
: public binary_function
<_Tp
,_Tp
,bool>
129 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
&& __y
; }
133 struct logical_or
: public binary_function
<_Tp
,_Tp
,bool>
135 bool operator()(const _Tp
& __x
, const _Tp
& __y
) const { return __x
|| __y
; }
139 struct logical_not
: public unary_function
<_Tp
,bool>
141 bool operator()(const _Tp
& __x
) const { return !__x
; }
144 template <class _Predicate
>
146 : public unary_function
<typename
_Predicate::argument_type
, bool> {
150 explicit unary_negate(const _Predicate
& __x
) : _M_pred(__x
) {}
151 bool operator()(const typename
_Predicate::argument_type
& __x
) const {
152 return !_M_pred(__x
);
156 template <class _Predicate
>
157 inline unary_negate
<_Predicate
>
158 not1(const _Predicate
& __pred
)
160 return unary_negate
<_Predicate
>(__pred
);
163 template <class _Predicate
>
165 : public binary_function
<typename
_Predicate::first_argument_type
,
166 typename
_Predicate::second_argument_type
,
171 explicit binary_negate(const _Predicate
& __x
) : _M_pred(__x
) {}
172 bool operator()(const typename
_Predicate::first_argument_type
& __x
,
173 const typename
_Predicate::second_argument_type
& __y
) const
175 return !_M_pred(__x
, __y
);
179 template <class _Predicate
>
180 inline binary_negate
<_Predicate
>
181 not2(const _Predicate
& __pred
)
183 return binary_negate
<_Predicate
>(__pred
);
186 template <class _Operation
>
188 : public unary_function
<typename
_Operation::second_argument_type
,
189 typename
_Operation::result_type
> {
192 typename
_Operation::first_argument_type value
;
194 binder1st(const _Operation
& __x
,
195 const typename
_Operation::first_argument_type
& __y
)
196 : op(__x
), value(__y
) {}
197 typename
_Operation::result_type
198 operator()(const typename
_Operation::second_argument_type
& __x
) const {
199 return op(value
, __x
);
203 template <class _Operation
, class _Tp
>
204 inline binder1st
<_Operation
>
205 bind1st(const _Operation
& __oper
, const _Tp
& __x
)
207 typedef typename
_Operation::first_argument_type _Arg1_type
;
208 return binder1st
<_Operation
>(__oper
, _Arg1_type(__x
));
211 template <class _Operation
>
213 : public unary_function
<typename
_Operation::first_argument_type
,
214 typename
_Operation::result_type
> {
217 typename
_Operation::second_argument_type value
;
219 binder2nd(const _Operation
& __x
,
220 const typename
_Operation::second_argument_type
& __y
)
221 : op(__x
), value(__y
) {}
222 typename
_Operation::result_type
223 operator()(const typename
_Operation::first_argument_type
& __x
) const {
224 return op(__x
, value
);
228 template <class _Operation
, class _Tp
>
229 inline binder2nd
<_Operation
>
230 bind2nd(const _Operation
& __oper
, const _Tp
& __x
)
232 typedef typename
_Operation::second_argument_type _Arg2_type
;
233 return binder2nd
<_Operation
>(__oper
, _Arg2_type(__x
));
236 // unary_compose and binary_compose (extensions, not part of the standard).
238 template <class _Operation1
, class _Operation2
>
240 : public unary_function
<typename
_Operation2::argument_type
,
241 typename
_Operation1::result_type
>
247 unary_compose(const _Operation1
& __x
, const _Operation2
& __y
)
248 : __op1(__x
), __op2(__y
) {}
249 typename
_Operation1::result_type
250 operator()(const typename
_Operation2::argument_type
& __x
) const {
251 return __op1(__op2(__x
));
255 template <class _Operation1
, class _Operation2
>
256 inline unary_compose
<_Operation1
,_Operation2
>
257 compose1(const _Operation1
& __op1
, const _Operation2
& __op2
)
259 return unary_compose
<_Operation1
,_Operation2
>(__op1
, __op2
);
262 template <class _Operation1
, class _Operation2
, class _Operation3
>
264 : public unary_function
<typename
_Operation2::argument_type
,
265 typename
_Operation1::result_type
> {
271 binary_compose(const _Operation1
& __x
, const _Operation2
& __y
,
272 const _Operation3
& __z
)
273 : _M_op1(__x
), _M_op2(__y
), _M_op3(__z
) { }
274 typename
_Operation1::result_type
275 operator()(const typename
_Operation2::argument_type
& __x
) const {
276 return _M_op1(_M_op2(__x
), _M_op3(__x
));
280 template <class _Operation1
, class _Operation2
, class _Operation3
>
281 inline binary_compose
<_Operation1
, _Operation2
, _Operation3
>
282 compose2(const _Operation1
& __op1
, const _Operation2
& __op2
,
283 const _Operation3
& __op3
)
285 return binary_compose
<_Operation1
,_Operation2
,_Operation3
>
286 (__op1
, __op2
, __op3
);
289 template <class _Arg
, class _Result
>
290 class pointer_to_unary_function
: public unary_function
<_Arg
, _Result
> {
292 _Result (*_M_ptr
)(_Arg
);
294 pointer_to_unary_function() {}
295 explicit pointer_to_unary_function(_Result (*__x
)(_Arg
)) : _M_ptr(__x
) {}
296 _Result
operator()(_Arg __x
) const { return _M_ptr(__x
); }
299 template <class _Arg
, class _Result
>
300 inline pointer_to_unary_function
<_Arg
, _Result
> ptr_fun(_Result (*__x
)(_Arg
))
302 return pointer_to_unary_function
<_Arg
, _Result
>(__x
);
305 template <class _Arg1
, class _Arg2
, class _Result
>
306 class pointer_to_binary_function
:
307 public binary_function
<_Arg1
,_Arg2
,_Result
> {
309 _Result (*_M_ptr
)(_Arg1
, _Arg2
);
311 pointer_to_binary_function() {}
312 explicit pointer_to_binary_function(_Result (*__x
)(_Arg1
, _Arg2
))
314 _Result
operator()(_Arg1 __x
, _Arg2 __y
) const {
315 return _M_ptr(__x
, __y
);
319 template <class _Arg1
, class _Arg2
, class _Result
>
320 inline pointer_to_binary_function
<_Arg1
,_Arg2
,_Result
>
321 ptr_fun(_Result (*__x
)(_Arg1
, _Arg2
)) {
322 return pointer_to_binary_function
<_Arg1
,_Arg2
,_Result
>(__x
);
325 // identity is an extensions: it is not part of the standard.
327 struct _Identity
: public unary_function
<_Tp
,_Tp
> {
328 const _Tp
& operator()(const _Tp
& __x
) const { return __x
; }
331 template <class _Tp
> struct identity
: public _Identity
<_Tp
> {};
333 // select1st and select2nd are extensions: they are not part of the standard.
334 template <class _Pair
>
335 struct _Select1st
: public unary_function
<_Pair
, typename
_Pair::first_type
> {
336 const typename
_Pair::first_type
& operator()(const _Pair
& __x
) const {
341 template <class _Pair
>
342 struct _Select2nd
: public unary_function
<_Pair
, typename
_Pair::second_type
>
344 const typename
_Pair::second_type
& operator()(const _Pair
& __x
) const {
349 template <class _Pair
> struct select1st
: public _Select1st
<_Pair
> {};
350 template <class _Pair
> struct select2nd
: public _Select2nd
<_Pair
> {};
352 // project1st and project2nd are extensions: they are not part of the standard
353 template <class _Arg1
, class _Arg2
>
354 struct _Project1st
: public binary_function
<_Arg1
, _Arg2
, _Arg1
> {
355 _Arg1
operator()(const _Arg1
& __x
, const _Arg2
&) const { return __x
; }
358 template <class _Arg1
, class _Arg2
>
359 struct _Project2nd
: public binary_function
<_Arg1
, _Arg2
, _Arg2
> {
360 _Arg2
operator()(const _Arg1
&, const _Arg2
& __y
) const { return __y
; }
363 template <class _Arg1
, class _Arg2
>
364 struct project1st
: public _Project1st
<_Arg1
, _Arg2
> {};
366 template <class _Arg1
, class _Arg2
>
367 struct project2nd
: public _Project2nd
<_Arg1
, _Arg2
> {};
369 // constant_void_fun, constant_unary_fun, and constant_binary_fun are
370 // extensions: they are not part of the standard. (The same, of course,
371 // is true of the helper functions constant0, constant1, and constant2.)
372 template <class _Result
>
373 struct constant_void_fun
375 typedef _Result result_type
;
377 constant_void_fun(const result_type
& __v
) : __val(__v
) {}
378 const result_type
& operator()() const { return __val
; }
381 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
382 template <class _Result
, class _Argument
= _Result
>
384 template <class _Result
, class _Argument
>
386 struct constant_unary_fun
: public unary_function
<_Argument
, _Result
> {
388 constant_unary_fun(const _Result
& __v
) : _M_val(__v
) {}
389 const _Result
& operator()(const _Argument
&) const { return _M_val
; }
392 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
393 template <class _Result
, class _Arg1
= _Result
, class _Arg2
= _Arg1
>
395 template <class _Result
, class _Arg1
, class _Arg2
>
397 struct constant_binary_fun
: public binary_function
<_Arg1
, _Arg2
, _Result
> {
399 constant_binary_fun(const _Result
& __v
) : _M_val(__v
) {}
400 const _Result
& operator()(const _Arg1
&, const _Arg2
&) const {
405 template <class _Result
>
406 inline constant_void_fun
<_Result
> constant0(const _Result
& __val
)
408 return constant_void_fun
<_Result
>(__val
);
411 template <class _Result
>
412 inline constant_unary_fun
<_Result
,_Result
> constant1(const _Result
& __val
)
414 return constant_unary_fun
<_Result
,_Result
>(__val
);
417 template <class _Result
>
418 inline constant_binary_fun
<_Result
,_Result
,_Result
>
419 constant2(const _Result
& __val
)
421 return constant_binary_fun
<_Result
,_Result
,_Result
>(__val
);
424 // subtractive_rng is an extension: it is not part of the standard.
425 // Note: this code assumes that int is 32 bits.
426 class subtractive_rng
: public unary_function
<unsigned int, unsigned int> {
428 unsigned int _M_table
[55];
432 unsigned int operator()(unsigned int __limit
) {
433 _M_index1
= (_M_index1
+ 1) % 55;
434 _M_index2
= (_M_index2
+ 1) % 55;
435 _M_table
[_M_index1
] = _M_table
[_M_index1
] - _M_table
[_M_index2
];
436 return _M_table
[_M_index1
] % __limit
;
439 void _M_initialize(unsigned int __seed
)
441 unsigned int __k
= 1;
442 _M_table
[54] = __seed
;
444 for (__i
= 0; __i
< 54; __i
++) {
445 size_t __ii
= (21 * (__i
+ 1) % 55) - 1;
446 _M_table
[__ii
] = __k
;
448 __seed
= _M_table
[__ii
];
450 for (int __loop
= 0; __loop
< 4; __loop
++) {
451 for (__i
= 0; __i
< 55; __i
++)
452 _M_table
[__i
] = _M_table
[__i
] - _M_table
[(1 + __i
+ 30) % 55];
458 subtractive_rng(unsigned int __seed
) { _M_initialize(__seed
); }
459 subtractive_rng() { _M_initialize(161803398u); }
463 // Adaptor function objects: pointers to member functions.
465 // There are a total of 16 = 2^4 function objects in this family.
466 // (1) Member functions taking no arguments vs member functions taking
468 // (2) Call through pointer vs call through reference.
469 // (3) Member function with void return type vs member function with
470 // non-void return type.
471 // (4) Const vs non-const member function.
473 // Note that choice (3) is nothing more than a workaround: according
474 // to the draft, compilers should handle void and non-void the same way.
475 // This feature is not yet widely implemented, though. You can only use
476 // member functions returning void if your compiler supports partial
479 // All of this complexity is in the function objects themselves. You can
480 // ignore it by using the helper function mem_fun and mem_fun_ref,
481 // which create whichever type of adaptor is appropriate.
482 // (mem_fun1 and mem_fun1_ref are no longer part of the C++ standard,
483 // but they are provided for backward compatibility.)
486 template <class _Ret
, class _Tp
>
487 class mem_fun_t
: public unary_function
<_Tp
*,_Ret
> {
489 explicit mem_fun_t(_Ret (_Tp::*__pf
)()) : _M_f(__pf
) {}
490 _Ret
operator()(_Tp
* __p
) const { return (__p
->*_M_f
)(); }
495 template <class _Ret
, class _Tp
>
496 class const_mem_fun_t
: public unary_function
<const _Tp
*,_Ret
> {
498 explicit const_mem_fun_t(_Ret (_Tp::*__pf
)() const) : _M_f(__pf
) {}
499 _Ret
operator()(const _Tp
* __p
) const { return (__p
->*_M_f
)(); }
501 _Ret (_Tp::*_M_f
)() const;
505 template <class _Ret
, class _Tp
>
506 class mem_fun_ref_t
: public unary_function
<_Tp
,_Ret
> {
508 explicit mem_fun_ref_t(_Ret (_Tp::*__pf
)()) : _M_f(__pf
) {}
509 _Ret
operator()(_Tp
& __r
) const { return (__r
.*_M_f
)(); }
514 template <class _Ret
, class _Tp
>
515 class const_mem_fun_ref_t
: public unary_function
<_Tp
,_Ret
> {
517 explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf
)() const) : _M_f(__pf
) {}
518 _Ret
operator()(const _Tp
& __r
) const { return (__r
.*_M_f
)(); }
520 _Ret (_Tp::*_M_f
)() const;
523 template <class _Ret
, class _Tp
, class _Arg
>
524 class mem_fun1_t
: public binary_function
<_Tp
*,_Arg
,_Ret
> {
526 explicit mem_fun1_t(_Ret (_Tp::*__pf
)(_Arg
)) : _M_f(__pf
) {}
527 _Ret
operator()(_Tp
* __p
, _Arg __x
) const { return (__p
->*_M_f
)(__x
); }
529 _Ret (_Tp::*_M_f
)(_Arg
);
532 template <class _Ret
, class _Tp
, class _Arg
>
533 class const_mem_fun1_t
: public binary_function
<const _Tp
*,_Arg
,_Ret
> {
535 explicit const_mem_fun1_t(_Ret (_Tp::*__pf
)(_Arg
) const) : _M_f(__pf
) {}
536 _Ret
operator()(const _Tp
* __p
, _Arg __x
) const
537 { return (__p
->*_M_f
)(__x
); }
539 _Ret (_Tp::*_M_f
)(_Arg
) const;
542 template <class _Ret
, class _Tp
, class _Arg
>
543 class mem_fun1_ref_t
: public binary_function
<_Tp
,_Arg
,_Ret
> {
545 explicit mem_fun1_ref_t(_Ret (_Tp::*__pf
)(_Arg
)) : _M_f(__pf
) {}
546 _Ret
operator()(_Tp
& __r
, _Arg __x
) const { return (__r
.*_M_f
)(__x
); }
548 _Ret (_Tp::*_M_f
)(_Arg
);
551 template <class _Ret
, class _Tp
, class _Arg
>
552 class const_mem_fun1_ref_t
: public binary_function
<_Tp
,_Arg
,_Ret
> {
554 explicit const_mem_fun1_ref_t(_Ret (_Tp::*__pf
)(_Arg
) const) : _M_f(__pf
) {}
555 _Ret
operator()(const _Tp
& __r
, _Arg __x
) const { return (__r
.*_M_f
)(__x
); }
557 _Ret (_Tp::*_M_f
)(_Arg
) const;
560 #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
563 class mem_fun_t
<void, _Tp
> : public unary_function
<_Tp
*,void> {
565 explicit mem_fun_t(void (_Tp::*__pf
)()) : _M_f(__pf
) {}
566 void operator()(_Tp
* __p
) const { (__p
->*_M_f
)(); }
572 class const_mem_fun_t
<void, _Tp
> : public unary_function
<const _Tp
*,void> {
574 explicit const_mem_fun_t(void (_Tp::*__pf
)() const) : _M_f(__pf
) {}
575 void operator()(const _Tp
* __p
) const { (__p
->*_M_f
)(); }
577 void (_Tp::*_M_f
)() const;
581 class mem_fun_ref_t
<void, _Tp
> : public unary_function
<_Tp
,void> {
583 explicit mem_fun_ref_t(void (_Tp::*__pf
)()) : _M_f(__pf
) {}
584 void operator()(_Tp
& __r
) const { (__r
.*_M_f
)(); }
590 class const_mem_fun_ref_t
<void, _Tp
> : public unary_function
<_Tp
,void> {
592 explicit const_mem_fun_ref_t(void (_Tp::*__pf
)() const) : _M_f(__pf
) {}
593 void operator()(const _Tp
& __r
) const { (__r
.*_M_f
)(); }
595 void (_Tp::*_M_f
)() const;
598 template <class _Tp
, class _Arg
>
599 class mem_fun1_t
<void, _Tp
, _Arg
> : public binary_function
<_Tp
*,_Arg
,void> {
601 explicit mem_fun1_t(void (_Tp::*__pf
)(_Arg
)) : _M_f(__pf
) {}
602 void operator()(_Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
604 void (_Tp::*_M_f
)(_Arg
);
607 template <class _Tp
, class _Arg
>
608 class const_mem_fun1_t
<void, _Tp
, _Arg
>
609 : public binary_function
<const _Tp
*,_Arg
,void> {
611 explicit const_mem_fun1_t(void (_Tp::*__pf
)(_Arg
) const) : _M_f(__pf
) {}
612 void operator()(const _Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
614 void (_Tp::*_M_f
)(_Arg
) const;
617 template <class _Tp
, class _Arg
>
618 class mem_fun1_ref_t
<void, _Tp
, _Arg
>
619 : public binary_function
<_Tp
,_Arg
,void> {
621 explicit mem_fun1_ref_t(void (_Tp::*__pf
)(_Arg
)) : _M_f(__pf
) {}
622 void operator()(_Tp
& __r
, _Arg __x
) const { (__r
.*_M_f
)(__x
); }
624 void (_Tp::*_M_f
)(_Arg
);
627 template <class _Tp
, class _Arg
>
628 class const_mem_fun1_ref_t
<void, _Tp
, _Arg
>
629 : public binary_function
<_Tp
,_Arg
,void> {
631 explicit const_mem_fun1_ref_t(void (_Tp::*__pf
)(_Arg
) const) : _M_f(__pf
) {}
632 void operator()(const _Tp
& __r
, _Arg __x
) const { (__r
.*_M_f
)(__x
); }
634 void (_Tp::*_M_f
)(_Arg
) const;
637 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
639 // Mem_fun adaptor helper functions. There are only two:
640 // mem_fun and mem_fun_ref. (mem_fun1 and mem_fun1_ref
641 // are provided for backward compatibility, but they are no longer
642 // part of the C++ standard.)
644 template <class _Ret
, class _Tp
>
645 inline mem_fun_t
<_Ret
,_Tp
> mem_fun(_Ret (_Tp::*__f
)())
646 { return mem_fun_t
<_Ret
,_Tp
>(__f
); }
648 template <class _Ret
, class _Tp
>
649 inline const_mem_fun_t
<_Ret
,_Tp
> mem_fun(_Ret (_Tp::*__f
)() const)
650 { return const_mem_fun_t
<_Ret
,_Tp
>(__f
); }
652 template <class _Ret
, class _Tp
>
653 inline mem_fun_ref_t
<_Ret
,_Tp
> mem_fun_ref(_Ret (_Tp::*__f
)())
654 { return mem_fun_ref_t
<_Ret
,_Tp
>(__f
); }
656 template <class _Ret
, class _Tp
>
657 inline const_mem_fun_ref_t
<_Ret
,_Tp
> mem_fun_ref(_Ret (_Tp::*__f
)() const)
658 { return const_mem_fun_ref_t
<_Ret
,_Tp
>(__f
); }
660 template <class _Ret
, class _Tp
, class _Arg
>
661 inline mem_fun1_t
<_Ret
,_Tp
,_Arg
> mem_fun(_Ret (_Tp::*__f
)(_Arg
))
662 { return mem_fun1_t
<_Ret
,_Tp
,_Arg
>(__f
); }
664 template <class _Ret
, class _Tp
, class _Arg
>
665 inline const_mem_fun1_t
<_Ret
,_Tp
,_Arg
> mem_fun(_Ret (_Tp::*__f
)(_Arg
) const)
666 { return const_mem_fun1_t
<_Ret
,_Tp
,_Arg
>(__f
); }
668 template <class _Ret
, class _Tp
, class _Arg
>
669 inline mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
> mem_fun_ref(_Ret (_Tp::*__f
)(_Arg
))
670 { return mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>(__f
); }
672 template <class _Ret
, class _Tp
, class _Arg
>
673 inline const_mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>
674 mem_fun_ref(_Ret (_Tp::*__f
)(_Arg
) const)
675 { return const_mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>(__f
); }
677 template <class _Ret
, class _Tp
, class _Arg
>
678 inline mem_fun1_t
<_Ret
,_Tp
,_Arg
> mem_fun1(_Ret (_Tp::*__f
)(_Arg
))
679 { return mem_fun1_t
<_Ret
,_Tp
,_Arg
>(__f
); }
681 template <class _Ret
, class _Tp
, class _Arg
>
682 inline const_mem_fun1_t
<_Ret
,_Tp
,_Arg
> mem_fun1(_Ret (_Tp::*__f
)(_Arg
) const)
683 { return const_mem_fun1_t
<_Ret
,_Tp
,_Arg
>(__f
); }
685 template <class _Ret
, class _Tp
, class _Arg
>
686 inline mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
> mem_fun1_ref(_Ret (_Tp::*__f
)(_Arg
))
687 { return mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>(__f
); }
689 template <class _Ret
, class _Tp
, class _Arg
>
690 inline const_mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>
691 mem_fun1_ref(_Ret (_Tp::*__f
)(_Arg
) const)
692 { return const_mem_fun1_ref_t
<_Ret
,_Tp
,_Arg
>(__f
); }
696 #endif /* __SGI_STL_INTERNAL_FUNCTION_H */