4 * Hewlett-Packard Company
6 * Copyright (c) 1996-1998
7 * Silicon Graphics Computer Systems, Inc.
10 * Moscow Center for SPARC Technology
21 * This material is provided "as is", with absolutely no warranty expressed
22 * or implied. Any use is at your own risk.
24 * Permission to use or copy this software for any purpose is hereby granted
25 * without fee, provided the above notices are retained on all copies.
26 * Permission to modify the code and to distribute modified code is granted,
27 * provided the above notices are retained, and a notice that the code was
28 * modified is included with the above copyright notice.
32 /* NOTE: This is an internal header file, included by other STL headers.
33 * You should not attempt to use it directly.
36 // This file has noo macro protection as it is meant to be included several times
38 // Adaptor function objects: pointers to member functions.
40 // There are a total of 16 = 2^4 function objects in this family.
41 // (1) Member functions taking no arguments vs member functions taking
43 // (2) Call through pointer vs call through reference.
44 // (3) Member function with void return type vs member function with
45 // non-void return type.
46 // (4) Const vs non-const member function.
48 // Note that choice (3) is nothing more than a workaround: according
49 // to the draft, compilers should handle void and non-void the same way.
50 // This feature is not yet widely implemented, though. You can only use
51 // member functions returning void if your compiler supports partial
54 // All of this complexity is in the function objects themselves. You can
55 // ignore it by using the helper function mem_fun and mem_fun_ref,
56 // which create whichever type of adaptor is appropriate.
60 //This implementation will only be used if needed, that is to say when there is the return void bug
61 //and when there is no partial template specialization
62 #if defined (_STLP_DONT_RETURN_VOID) && defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) && defined (_STLP_MEMBER_TEMPLATE_CLASSES)
64 template<class _Result
, class _Tp
>
65 class _Mem_fun0_ptr
: public unary_function
<_Tp
*, _Result
> {
67 typedef _Result (_Tp::*__fun_type
) ();
68 explicit _Mem_fun0_ptr(__fun_type __f
) : _M_f(__f
) {}
71 _Result
operator ()(_Tp
* __p
) const { return (__p
->*_M_f
)(); }
77 template<class _Result
, class _Tp
, class _Arg
>
78 class _Mem_fun1_ptr
: public binary_function
<_Tp
*,_Arg
,_Result
> {
80 typedef _Result (_Tp::*__fun_type
) (_Arg
);
81 explicit _Mem_fun1_ptr(__fun_type __f
) : _M_f(__f
) {}
84 _Result
operator ()(_Tp
* __p
, _Arg __x
) const { return (__p
->*_M_f
)(__x
); }
90 template<class _Result
, class _Tp
>
91 class _Const_mem_fun0_ptr
: public unary_function
<const _Tp
*,_Result
> {
93 typedef _Result (_Tp::*__fun_type
) () const;
94 explicit _Const_mem_fun0_ptr(__fun_type __f
) : _M_f(__f
) {}
97 _Result
operator ()(const _Tp
* __p
) const { return (__p
->*_M_f
)(); }
103 template<class _Result
, class _Tp
, class _Arg
>
104 class _Const_mem_fun1_ptr
: public binary_function
<const _Tp
*,_Arg
,_Result
> {
106 typedef _Result (_Tp::*__fun_type
) (_Arg
) const;
107 explicit _Const_mem_fun1_ptr(__fun_type __f
) : _M_f(__f
) {}
110 _Result
operator ()(const _Tp
* __p
, _Arg __x
) const {
111 return (__p
->*_M_f
)(__x
); }
117 template<class _Result
, class _Tp
>
118 class _Mem_fun0_ref
: public unary_function
<_Tp
,_Result
> {
120 typedef _Result (_Tp::*__fun_type
) ();
121 explicit _Mem_fun0_ref(__fun_type __f
) : _M_f(__f
) {}
124 _Result
operator ()(_Tp
& __p
) const { return (__p
.*_M_f
)(); }
130 template<class _Result
, class _Tp
, class _Arg
>
131 class _Mem_fun1_ref
: public binary_function
<_Tp
,_Arg
,_Result
> {
133 typedef _Result (_Tp::*__fun_type
) (_Arg
);
134 explicit _Mem_fun1_ref(__fun_type __f
) : _M_f(__f
) {}
137 _Result
operator ()(_Tp
& __p
, _Arg __x
) const { return (__p
.*_M_f
)(__x
); }
143 template<class _Result
, class _Tp
>
144 class _Const_mem_fun0_ref
: public unary_function
<_Tp
,_Result
> {
146 typedef _Result (_Tp::*__fun_type
) () const;
147 explicit _Const_mem_fun0_ref(__fun_type __f
) : _M_f(__f
) {}
150 _Result
operator ()(const _Tp
& __p
) const { return (__p
.*_M_f
)(); }
156 template<class _Result
, class _Tp
, class _Arg
>
157 class _Const_mem_fun1_ref
: public binary_function
<_Tp
,_Arg
,_Result
> {
159 typedef _Result (_Tp::*__fun_type
) (_Arg
) const;
160 explicit _Const_mem_fun1_ref(__fun_type __f
) : _M_f(__f
) {}
163 _Result
operator ()(const _Tp
& __p
, _Arg __x
) const { return (__p
.*_M_f
)(__x
); }
169 template<class _Result
>
170 struct _Mem_fun_traits
{
173 typedef _Mem_fun0_ptr
<_Result
,_Tp
> _Ptr
;
174 typedef _Const_mem_fun0_ptr
<_Result
,_Tp
> _Ptr_const
;
175 typedef _Mem_fun0_ref
<_Result
,_Tp
> _Ref
;
176 typedef _Const_mem_fun0_ref
<_Result
,_Tp
> _Ref_const
;
179 template<class _Tp
, class _Arg
>
181 typedef _Mem_fun1_ptr
<_Result
,_Tp
,_Arg
> _Ptr
;
182 typedef _Const_mem_fun1_ptr
<_Result
,_Tp
,_Arg
> _Ptr_const
;
183 typedef _Mem_fun1_ref
<_Result
,_Tp
,_Arg
> _Ref
;
184 typedef _Const_mem_fun1_ref
<_Result
,_Tp
,_Arg
> _Ref_const
;
188 template<class _Arg
, class _Result
>
189 class _Ptr_fun1_base
: public unary_function
<_Arg
, _Result
> {
191 typedef _Result (*__fun_type
) (_Arg
);
192 explicit _Ptr_fun1_base(__fun_type __f
) : _M_f(__f
) {}
195 _Result
operator()(_Arg __x
) const { return _M_f(__x
); }
201 template <class _Arg1
, class _Arg2
, class _Result
>
202 class _Ptr_fun2_base
: public binary_function
<_Arg1
,_Arg2
,_Result
> {
204 typedef _Result (*__fun_type
) (_Arg1
, _Arg2
);
205 explicit _Ptr_fun2_base(__fun_type __f
) : _M_f(__f
) {}
208 _Result
operator()(_Arg1 __x
, _Arg2 __y
) const { return _M_f(__x
, __y
); }
214 template<class _Result
>
215 struct _Ptr_fun_traits
{
216 template<class _Arg
> struct _Args1
{
217 typedef _Ptr_fun1_base
<_Arg
,_Result
> _Fun
;
220 template<class _Arg1
, class _Arg2
> struct _Args2
{
221 typedef _Ptr_fun2_base
<_Arg1
,_Arg2
,_Result
> _Fun
;
225 /* Specializations for void return type */
227 class _Void_mem_fun0_ptr
: public unary_function
<_Tp
*,void> {
229 typedef void (_Tp::*__fun_type
) ();
230 explicit _Void_mem_fun0_ptr(__fun_type __f
) : _M_f(__f
) {}
233 void operator ()(_Tp
* __p
) const { (__p
->*_M_f
)(); }
239 template<class _Tp
, class _Arg
>
240 class _Void_mem_fun1_ptr
: public binary_function
<_Tp
*,_Arg
,void> {
242 typedef void (_Tp::*__fun_type
) (_Arg
);
243 explicit _Void_mem_fun1_ptr(__fun_type __f
) : _M_f(__f
) {}
246 void operator ()(_Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
253 class _Void_const_mem_fun0_ptr
: public unary_function
<const _Tp
*,void> {
255 typedef void (_Tp::*__fun_type
) () const;
256 explicit _Void_const_mem_fun0_ptr(__fun_type __f
) : _M_f(__f
) {}
259 void operator ()(const _Tp
* __p
) const { (__p
->*_M_f
)(); }
265 template<class _Tp
, class _Arg
>
266 class _Void_const_mem_fun1_ptr
: public binary_function
<const _Tp
*,_Arg
,void> {
268 typedef void (_Tp::*__fun_type
) (_Arg
) const;
269 explicit _Void_const_mem_fun1_ptr(__fun_type __f
) : _M_f(__f
) {}
272 void operator ()(const _Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
279 class _Void_mem_fun0_ref
: public unary_function
<_Tp
,void> {
281 typedef void (_Tp::*__fun_type
) ();
282 explicit _Void_mem_fun0_ref(__fun_type __f
) : _M_f(__f
) {}
285 void operator ()(_Tp
& __p
) const { (__p
.*_M_f
)(); }
291 template<class _Tp
, class _Arg
>
292 class _Void_mem_fun1_ref
: public binary_function
<_Tp
,_Arg
,void> {
294 typedef void (_Tp::*__fun_type
) (_Arg
);
295 explicit _Void_mem_fun1_ref(__fun_type __f
) : _M_f(__f
) {}
298 void operator ()(_Tp
& __p
, _Arg __x
) const { (__p
.*_M_f
)(__x
); }
305 class _Void_const_mem_fun0_ref
: public unary_function
<_Tp
,void> {
307 typedef void (_Tp::*__fun_type
) () const;
308 explicit _Void_const_mem_fun0_ref(__fun_type __f
) : _M_f(__f
) {}
311 void operator ()(const _Tp
& __p
) const { (__p
.*_M_f
)(); }
317 template<class _Tp
, class _Arg
>
318 class _Void_const_mem_fun1_ref
: public binary_function
<_Tp
,_Arg
,void> {
320 typedef void (_Tp::*__fun_type
) (_Arg
) const;
321 explicit _Void_const_mem_fun1_ref(__fun_type __f
) : _M_f(__f
) {}
324 void operator ()(const _Tp
& __p
, _Arg __x
) const { (__p
.*_M_f
)(__x
); }
331 struct _Mem_fun_traits
<void> {
332 template<class _Tp
> struct _Args0
{
333 typedef _Void_mem_fun0_ptr
<_Tp
> _Ptr
;
334 typedef _Void_const_mem_fun0_ptr
<_Tp
> _Ptr_const
;
335 typedef _Void_mem_fun0_ref
<_Tp
> _Ref
;
336 typedef _Void_const_mem_fun0_ref
<_Tp
> _Ref_const
;
339 template<class _Tp
, class _Arg
> struct _Args1
{
340 typedef _Void_mem_fun1_ptr
<_Tp
,_Arg
> _Ptr
;
341 typedef _Void_const_mem_fun1_ptr
<_Tp
,_Arg
> _Ptr_const
;
342 typedef _Void_mem_fun1_ref
<_Tp
,_Arg
> _Ref
;
343 typedef _Void_const_mem_fun1_ref
<_Tp
,_Arg
> _Ref_const
;
348 class _Ptr_void_fun1_base
: public unary_function
<_Arg
, void> {
350 typedef void (*__fun_type
) (_Arg
);
351 explicit _Ptr_void_fun1_base(__fun_type __f
) : _M_f(__f
) {}
354 void operator()(_Arg __x
) const { _M_f(__x
); }
360 template <class _Arg1
, class _Arg2
>
361 class _Ptr_void_fun2_base
: public binary_function
<_Arg1
,_Arg2
,void> {
363 typedef void (*__fun_type
) (_Arg1
, _Arg2
);
364 explicit _Ptr_void_fun2_base(__fun_type __f
) : _M_f(__f
) {}
367 void operator()(_Arg1 __x
, _Arg2 __y
) const { _M_f(__x
, __y
); }
374 struct _Ptr_fun_traits
<void> {
375 template<class _Arg
> struct _Args1
{
376 typedef _Ptr_void_fun1_base
<_Arg
> _Fun
;
379 template<class _Arg1
, class _Arg2
> struct _Args2
{
380 typedef _Ptr_void_fun2_base
<_Arg1
,_Arg2
> _Fun
;
384 // pavel: need extra level of inheritance here since MSVC++ does not
385 // accept traits-based fake partial specialization for template
386 // arguments other than first
388 template<class _Result
, class _Arg
>
390 public _Ptr_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Arg
>::_Fun
{
392 typedef typename _Ptr_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Arg
>::_Fun _Base
;
393 explicit _Ptr_fun1(typename
_Base::__fun_type __f
) : _Base(__f
) {}
396 template<class _Result
, class _Arg1
, class _Arg2
>
398 public _Ptr_fun_traits
<_Result
>::_STLP_TEMPLATE _Args2
<_Arg1
,_Arg2
>::_Fun
{
400 typedef typename _Ptr_fun_traits
<_Result
>::_STLP_TEMPLATE _Args2
<_Arg1
,_Arg2
>::_Fun _Base
;
401 explicit _Ptr_fun2(typename
_Base::__fun_type __f
) : _Base(__f
) {}
404 template <class _Result
, class _Tp
>
406 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ptr
{
408 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ptr _Base
;
410 explicit mem_fun_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
413 template <class _Result
, class _Tp
>
414 class const_mem_fun_t
:
415 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ptr_const
{
417 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ptr_const _Base
;
419 explicit const_mem_fun_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
422 template <class _Result
, class _Tp
>
423 class mem_fun_ref_t
:
424 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ref
{
426 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ref _Base
;
428 explicit mem_fun_ref_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
431 template <class _Result
, class _Tp
>
432 class const_mem_fun_ref_t
:
433 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ref_const
{
435 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args0
<_Tp
>::_Ref_const _Base
;
437 explicit const_mem_fun_ref_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
440 template <class _Result
, class _Tp
, class _Arg
>
442 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ptr
{
444 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ptr _Base
;
446 explicit mem_fun1_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
449 template <class _Result
, class _Tp
, class _Arg
>
450 class const_mem_fun1_t
:
451 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ptr_const
{
453 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ptr_const _Base
;
455 explicit const_mem_fun1_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
458 template <class _Result
, class _Tp
, class _Arg
>
459 class mem_fun1_ref_t
:
460 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ref
{
462 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ref _Base
;
464 explicit mem_fun1_ref_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
467 template <class _Result
, class _Tp
, class _Arg
>
468 class const_mem_fun1_ref_t
:
469 public _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ref_const
{
471 _Mem_fun_traits
<_Result
>::_STLP_TEMPLATE _Args1
<_Tp
,_Arg
>::_Ref_const _Base
;
473 explicit const_mem_fun1_ref_t(typename
_Base::__fun_type __f
) : _Base(__f
) {}
476 template <class _Arg
, class _Result
>
477 class pointer_to_unary_function
:
478 public _Ptr_fun1
<_Result
,_Arg
> {
480 _Ptr_fun1
<_Result
,_Arg
>::__fun_type __fun_type
;
482 explicit pointer_to_unary_function(__fun_type __f
)
483 : _Ptr_fun1
<_Result
,_Arg
>(__f
) {}
486 template <class _Arg1
, class _Arg2
, class _Result
>
487 class pointer_to_binary_function
:
488 public _Ptr_fun2
<_Result
,_Arg1
,_Arg2
> {
490 _Ptr_fun2
<_Result
,_Arg1
,_Arg2
>::__fun_type __fun_type
;
492 explicit pointer_to_binary_function(__fun_type __f
)
493 : _Ptr_fun2
<_Result
,_Arg1
,_Arg2
>(__f
) {}
498 template <class _Ret
, class _Tp
>
499 class mem_fun_t
: public unary_function
<_Tp
*,_Ret
> {
500 typedef _Ret (_Tp::*__fun_type
)(void);
502 explicit mem_fun_t(__fun_type __pf
) : _M_f(__pf
) {}
503 _Ret
operator()(_Tp
* __p
) const { return (__p
->*_M_f
)(); }
508 template <class _Ret
, class _Tp
>
509 class const_mem_fun_t
: public unary_function
<const _Tp
*,_Ret
> {
510 typedef _Ret (_Tp::*__fun_type
)(void) const;
512 explicit const_mem_fun_t(__fun_type __pf
) : _M_f(__pf
) {}
513 _Ret
operator()(const _Tp
* __p
) const { return (__p
->*_M_f
)(); }
518 template <class _Ret
, class _Tp
>
519 class mem_fun_ref_t
: public unary_function
<_Tp
,_Ret
> {
520 typedef _Ret (_Tp::*__fun_type
)(void);
522 explicit mem_fun_ref_t(__fun_type __pf
) : _M_f(__pf
) {}
523 _Ret
operator()(_Tp
& __r
) const { return (__r
.*_M_f
)(); }
528 template <class _Ret
, class _Tp
>
529 class const_mem_fun_ref_t
: public unary_function
<_Tp
,_Ret
> {
530 typedef _Ret (_Tp::*__fun_type
)(void) const;
532 explicit const_mem_fun_ref_t(__fun_type __pf
) : _M_f(__pf
) {}
533 _Ret
operator()(const _Tp
& __r
) const { return (__r
.*_M_f
)(); }
538 template <class _Ret
, class _Tp
, class _Arg
>
539 class mem_fun1_t
: public binary_function
<_Tp
*,_Arg
,_Ret
> {
540 typedef _Ret (_Tp::*__fun_type
)(_Arg
);
542 explicit mem_fun1_t(__fun_type __pf
) : _M_f(__pf
) {}
543 _Ret
operator()(_Tp
* __p
, _Arg __x
) const { return (__p
->*_M_f
)(__x
); }
548 template <class _Ret
, class _Tp
, class _Arg
>
549 class const_mem_fun1_t
: public binary_function
<const _Tp
*,_Arg
,_Ret
> {
550 typedef _Ret (_Tp::*__fun_type
)(_Arg
) const;
552 explicit const_mem_fun1_t(__fun_type __pf
) : _M_f(__pf
) {}
553 _Ret
operator()(const _Tp
* __p
, _Arg __x
) const
554 { return (__p
->*_M_f
)(__x
); }
559 template <class _Ret
, class _Tp
, class _Arg
>
560 class mem_fun1_ref_t
: public binary_function
<_Tp
,_Arg
,_Ret
> {
561 typedef _Ret (_Tp::*__fun_type
)(_Arg
);
563 explicit mem_fun1_ref_t(__fun_type __pf
) : _M_f(__pf
) {}
564 _Ret
operator()(_Tp
& __r
, _Arg __x
) const { return (__r
.*_M_f
)(__x
); }
569 template <class _Ret
, class _Tp
, class _Arg
>
570 class const_mem_fun1_ref_t
: public binary_function
<_Tp
,_Arg
,_Ret
> {
571 typedef _Ret (_Tp::*__fun_type
)(_Arg
) const;
573 explicit const_mem_fun1_ref_t(__fun_type __pf
) : _M_f(__pf
) {}
574 _Ret
operator()(const _Tp
& __r
, _Arg __x
) const { return (__r
.*_M_f
)(__x
); }
579 template <class _Arg
, class _Result
>
580 class pointer_to_unary_function
: public unary_function
<_Arg
, _Result
> {
582 _Result (*_M_ptr
)(_Arg
);
584 pointer_to_unary_function() {}
585 explicit pointer_to_unary_function(_Result (*__x
)(_Arg
)) : _M_ptr(__x
) {}
586 _Result
operator()(_Arg __x
) const { return _M_ptr(__x
); }
589 template <class _Arg1
, class _Arg2
, class _Result
>
590 class pointer_to_binary_function
:
591 public binary_function
<_Arg1
,_Arg2
,_Result
> {
593 _Result (*_M_ptr
)(_Arg1
, _Arg2
);
595 pointer_to_binary_function() {}
596 explicit pointer_to_binary_function(_Result (*__x
)(_Arg1
, _Arg2
))
598 _Result
operator()(_Arg1 __x
, _Arg2 __y
) const {
599 return _M_ptr(__x
, __y
);
603 # if defined (_STLP_DONT_RETURN_VOID) && !defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION)
604 //Partial specializations for the void type
606 class mem_fun_t
<void, _Tp
> : public unary_function
<_Tp
*,void> {
607 typedef void (_Tp::*__fun_type
)(void);
609 explicit mem_fun_t
_STLP_PSPEC2(void,_Tp
) (__fun_type __pf
) : _M_f(__pf
) {}
610 void operator()(_Tp
* __p
) const { (__p
->*_M_f
)(); }
616 class const_mem_fun_t
<void, _Tp
> : public unary_function
<const _Tp
*,void> {
617 typedef void (_Tp::*__fun_type
)(void) const;
619 explicit const_mem_fun_t
_STLP_PSPEC2(void,_Tp
) (__fun_type __pf
) : _M_f(__pf
) {}
620 void operator()(const _Tp
* __p
) const { (__p
->*_M_f
)(); }
626 class mem_fun_ref_t
<void, _Tp
> : public unary_function
<_Tp
,void> {
627 typedef void (_Tp::*__fun_type
)(void);
629 explicit mem_fun_ref_t
_STLP_PSPEC2(void,_Tp
) (__fun_type __pf
) : _M_f(__pf
) {}
630 void operator()(_Tp
& __r
) const { (__r
.*_M_f
)(); }
636 class const_mem_fun_ref_t
<void, _Tp
> : public unary_function
<_Tp
,void> {
637 typedef void (_Tp::*__fun_type
)(void) const;
639 explicit const_mem_fun_ref_t
_STLP_PSPEC2(void,_Tp
) (__fun_type __pf
) : _M_f(__pf
) {}
640 void operator()(const _Tp
& __r
) const { (__r
.*_M_f
)(); }
645 template <class _Tp
, class _Arg
>
646 class mem_fun1_t
<void, _Tp
, _Arg
> : public binary_function
<_Tp
*,_Arg
,void> {
647 typedef void (_Tp::*__fun_type
)(_Arg
);
649 explicit mem_fun1_t
_STLP_PSPEC3(void,_Tp
,_Arg
) (__fun_type __pf
) : _M_f(__pf
) {}
650 void operator()(_Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
655 template <class _Tp
, class _Arg
>
656 class const_mem_fun1_t
<void, _Tp
, _Arg
>
657 : public binary_function
<const _Tp
*,_Arg
,void> {
658 typedef void (_Tp::*__fun_type
)(_Arg
) const;
660 explicit const_mem_fun1_t
_STLP_PSPEC3(void,_Tp
,_Arg
) (__fun_type __pf
) : _M_f(__pf
) {}
661 void operator()(const _Tp
* __p
, _Arg __x
) const { (__p
->*_M_f
)(__x
); }
666 template <class _Tp
, class _Arg
>
667 class mem_fun1_ref_t
<void, _Tp
, _Arg
>
668 : public binary_function
<_Tp
,_Arg
,void> {
669 typedef void (_Tp::*__fun_type
)(_Arg
);
671 explicit mem_fun1_ref_t
_STLP_PSPEC3(void,_Tp
,_Arg
) (__fun_type __pf
) : _M_f(__pf
) {}
672 void operator()(_Tp
& __r
, _Arg __x
) const { (__r
.*_M_f
)(__x
); }
677 template <class _Tp
, class _Arg
>
678 class const_mem_fun1_ref_t
<void, _Tp
, _Arg
>
679 : public binary_function
<_Tp
,_Arg
,void> {
680 typedef void (_Tp::*__fun_type
)(_Arg
) const;
682 explicit const_mem_fun1_ref_t
_STLP_PSPEC3(void,_Tp
,_Arg
) (__fun_type __pf
) : _M_f(__pf
) {}
683 void operator()(const _Tp
& __r
, _Arg __x
) const { (__r
.*_M_f
)(__x
); }
688 template <class _Arg
>
689 class pointer_to_unary_function
<_Arg
, void> : public unary_function
<_Arg
, void> {
690 typedef void (*__fun_type
)(_Arg
);
693 pointer_to_unary_function() {}
694 explicit pointer_to_unary_function(__fun_type __x
) : _M_ptr(__x
) {}
695 void operator()(_Arg __x
) const { _M_ptr(__x
); }
698 template <class _Arg1
, class _Arg2
>
699 class pointer_to_binary_function
<_Arg1
, _Arg2
, void> : public binary_function
<_Arg1
,_Arg2
,void> {
700 typedef void (*__fun_type
)(_Arg1
, _Arg2
);
703 pointer_to_binary_function() {}
704 explicit pointer_to_binary_function(__fun_type __x
) : _M_ptr(__x
) {}
705 void operator()(_Arg1 __x
, _Arg2 __y
) const { _M_ptr(__x
, __y
); }
712 #if !defined (_STLP_MEMBER_POINTER_PARAM_BUG)
713 // Mem_fun adaptor helper functions. There are only two:
714 // mem_fun and mem_fun_ref. (mem_fun1 and mem_fun1_ref
715 // are provided for backward compatibility, but they are no longer
716 // part of the C++ standard.)
718 template <class _Result
, class _Tp
>
719 inline mem_fun_t
<_Result
,_Tp
>
720 mem_fun(_Result (_Tp::*__f
)()) { return mem_fun_t
<_Result
,_Tp
>(__f
); }
722 template <class _Result
, class _Tp
>
723 inline const_mem_fun_t
<_Result
,_Tp
>
724 mem_fun(_Result (_Tp::*__f
)() const) { return const_mem_fun_t
<_Result
,_Tp
>(__f
); }
726 template <class _Result
, class _Tp
>
727 inline mem_fun_ref_t
<_Result
,_Tp
>
728 mem_fun_ref(_Result (_Tp::*__f
)()) { return mem_fun_ref_t
<_Result
,_Tp
>(__f
); }
730 template <class _Result
, class _Tp
>
731 inline const_mem_fun_ref_t
<_Result
,_Tp
>
732 mem_fun_ref(_Result (_Tp::*__f
)() const) { return const_mem_fun_ref_t
<_Result
,_Tp
>(__f
); }
734 template <class _Result
, class _Tp
, class _Arg
>
735 inline mem_fun1_t
<_Result
,_Tp
,_Arg
>
736 mem_fun(_Result (_Tp::*__f
)(_Arg
)) { return mem_fun1_t
<_Result
,_Tp
,_Arg
>(__f
); }
738 template <class _Result
, class _Tp
, class _Arg
>
739 inline const_mem_fun1_t
<_Result
,_Tp
,_Arg
>
740 mem_fun(_Result (_Tp::*__f
)(_Arg
) const) { return const_mem_fun1_t
<_Result
,_Tp
,_Arg
>(__f
); }
742 template <class _Result
, class _Tp
, class _Arg
>
743 inline mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>
744 mem_fun_ref(_Result (_Tp::*__f
)(_Arg
)) { return mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>(__f
); }
746 template <class _Result
, class _Tp
, class _Arg
>
747 inline const_mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>
748 mem_fun_ref(_Result (_Tp::*__f
)(_Arg
) const) { return const_mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>(__f
); }
750 # if !(defined (_STLP_NO_EXTENSIONS) || defined (_STLP_NO_ANACHRONISMS))
751 // mem_fun1 and mem_fun1_ref are no longer part of the C++ standard,
752 // but they are provided for backward compatibility.
753 template <class _Result
, class _Tp
, class _Arg
>
754 inline mem_fun1_t
<_Result
,_Tp
,_Arg
>
755 mem_fun1(_Result (_Tp::*__f
)(_Arg
)) { return mem_fun1_t
<_Result
,_Tp
,_Arg
>(__f
); }
757 template <class _Result
, class _Tp
, class _Arg
>
758 inline const_mem_fun1_t
<_Result
,_Tp
,_Arg
>
759 mem_fun1(_Result (_Tp::*__f
)(_Arg
) const) { return const_mem_fun1_t
<_Result
,_Tp
,_Arg
>(__f
); }
761 template <class _Result
, class _Tp
, class _Arg
>
762 inline mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>
763 mem_fun1_ref(_Result (_Tp::*__f
)(_Arg
)) { return mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>(__f
); }
765 template <class _Result
, class _Tp
, class _Arg
>
766 inline const_mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>
767 mem_fun1_ref(_Result (_Tp::*__f
)(_Arg
) const) { return const_mem_fun1_ref_t
<_Result
,_Tp
,_Arg
>(__f
); }
773 template <class _Arg
, class _Result
>
774 inline pointer_to_unary_function
<_Arg
, _Result
>
775 ptr_fun(_Result (*__f
)(_Arg
))
776 { return pointer_to_unary_function
<_Arg
, _Result
>(__f
); }
778 template <class _Arg1
, class _Arg2
, class _Result
>
779 inline pointer_to_binary_function
<_Arg1
,_Arg2
,_Result
>
780 ptr_fun(_Result (*__f
)(_Arg1
, _Arg2
))
781 { return pointer_to_binary_function
<_Arg1
,_Arg2
,_Result
>(__f
); }