56 #ifndef _STL_FUNCTION_H
57 #define _STL_FUNCTION_H 1
61 _GLIBCXX_BEGIN_NAMESPACE_VERSION
100 template<
typename _Arg,
typename _Result>
101 struct unary_function
104 typedef _Arg argument_type;
107 typedef _Result result_type;
113 template<
typename _Arg1,
typename _Arg2,
typename _Result>
114 struct binary_function
117 typedef _Arg1 first_argument_type;
120 typedef _Arg2 second_argument_type;
123 typedef _Result result_type;
138 template<
typename _Tp>
140 struct plus :
public binary_function<_Tp, _Tp, _Tp>
143 operator()(
const _Tp& __x,
const _Tp& __y)
const
144 {
return __x + __y; }
148 template<
typename _Tp>
149 struct minus :
public binary_function<_Tp, _Tp, _Tp>
152 operator()(
const _Tp& __x,
const _Tp& __y)
const
153 {
return __x - __y; }
157 template<
typename _Tp>
158 struct multiplies :
public binary_function<_Tp, _Tp, _Tp>
161 operator()(
const _Tp& __x,
const _Tp& __y)
const
162 {
return __x * __y; }
166 template<
typename _Tp>
167 struct divides :
public binary_function<_Tp, _Tp, _Tp>
170 operator()(
const _Tp& __x,
const _Tp& __y)
const
171 {
return __x / __y; }
175 template<
typename _Tp>
176 struct modulus :
public binary_function<_Tp, _Tp, _Tp>
179 operator()(
const _Tp& __x,
const _Tp& __y)
const
180 {
return __x % __y; }
184 template<
typename _Tp>
185 struct negate :
public unary_function<_Tp, _Tp>
188 operator()(
const _Tp& __x)
const
202 template<
typename _Tp>
204 struct equal_to :
public binary_function<_Tp, _Tp, bool>
207 operator()(
const _Tp& __x,
const _Tp& __y)
const
208 {
return __x == __y; }
212 template<
typename _Tp>
213 struct not_equal_to :
public binary_function<_Tp, _Tp, bool>
216 operator()(
const _Tp& __x,
const _Tp& __y)
const
217 {
return __x != __y; }
221 template<
typename _Tp>
222 struct greater :
public binary_function<_Tp, _Tp, bool>
225 operator()(
const _Tp& __x,
const _Tp& __y)
const
226 {
return __x > __y; }
230 template<
typename _Tp>
231 struct less :
public binary_function<_Tp, _Tp, bool>
234 operator()(
const _Tp& __x,
const _Tp& __y)
const
235 {
return __x < __y; }
239 template<
typename _Tp>
240 struct greater_equal :
public binary_function<_Tp, _Tp, bool>
243 operator()(
const _Tp& __x,
const _Tp& __y)
const
244 {
return __x >= __y; }
248 template<
typename _Tp>
249 struct less_equal :
public binary_function<_Tp, _Tp, bool>
252 operator()(
const _Tp& __x,
const _Tp& __y)
const
253 {
return __x <= __y; }
266 template<
typename _Tp>
268 struct logical_and :
public binary_function<_Tp, _Tp, bool>
271 operator()(
const _Tp& __x,
const _Tp& __y)
const
272 {
return __x && __y; }
276 template<
typename _Tp>
277 struct logical_or :
public binary_function<_Tp, _Tp, bool>
280 operator()(
const _Tp& __x,
const _Tp& __y)
const
281 {
return __x || __y; }
285 template<
typename _Tp>
286 struct logical_not :
public unary_function<_Tp, bool>
289 operator()(
const _Tp& __x)
const
296 template<
typename _Tp>
297 struct bit_and :
public binary_function<_Tp, _Tp, _Tp>
300 operator()(
const _Tp& __x,
const _Tp& __y)
const
301 {
return __x & __y; }
304 template<
typename _Tp>
305 struct bit_or :
public binary_function<_Tp, _Tp, _Tp>
308 operator()(
const _Tp& __x,
const _Tp& __y)
const
309 {
return __x | __y; }
312 template<
typename _Tp>
313 struct bit_xor :
public binary_function<_Tp, _Tp, _Tp>
316 operator()(
const _Tp& __x,
const _Tp& __y)
const
317 {
return __x ^ __y; }
349 template<
typename _Predicate>
352 :
public unary_function<typename _Predicate::argument_type, bool>
359 unary_negate(
const _Predicate& __x) : _M_pred(__x) { }
362 operator()(
const typename _Predicate::argument_type& __x)
const
363 {
return !_M_pred(__x); }
367 template<
typename _Predicate>
368 inline unary_negate<_Predicate>
369 not1(
const _Predicate& __pred)
370 {
return unary_negate<_Predicate>(__pred); }
373 template<
typename _Predicate>
375 :
public binary_function<typename _Predicate::first_argument_type,
376 typename _Predicate::second_argument_type, bool>
383 binary_negate(
const _Predicate& __x) : _M_pred(__x) { }
386 operator()(
const typename _Predicate::first_argument_type& __x,
387 const typename _Predicate::second_argument_type& __y)
const
388 {
return !_M_pred(__x, __y); }
392 template<
typename _Predicate>
393 inline binary_negate<_Predicate>
394 not2(
const _Predicate& __pred)
395 {
return binary_negate<_Predicate>(__pred); }
420 template<
typename _Arg,
typename _Result>
422 class pointer_to_unary_function :
public unary_function<_Arg, _Result>
425 _Result (*_M_ptr)(_Arg);
428 pointer_to_unary_function() { }
431 pointer_to_unary_function(_Result (*__x)(_Arg))
435 operator()(_Arg __x)
const
436 {
return _M_ptr(__x); }
440 template<
typename _Arg,
typename _Result>
441 inline pointer_to_unary_function<_Arg, _Result>
442 ptr_fun(_Result (*__x)(_Arg))
443 {
return pointer_to_unary_function<_Arg, _Result>(__x); }
446 template<
typename _Arg1,
typename _Arg2,
typename _Result>
447 class pointer_to_binary_function
448 :
public binary_function<_Arg1, _Arg2, _Result>
451 _Result (*_M_ptr)(_Arg1, _Arg2);
454 pointer_to_binary_function() { }
457 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
461 operator()(_Arg1 __x, _Arg2 __y)
const
462 {
return _M_ptr(__x, __y); }
466 template<
typename _Arg1,
typename _Arg2,
typename _Result>
467 inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
468 ptr_fun(_Result (*__x)(_Arg1, _Arg2))
469 {
return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
472 template<
typename _Tp>
474 :
public unary_function<_Tp,_Tp>
477 operator()(_Tp& __x)
const
481 operator()(
const _Tp& __x)
const
485 template<
typename _Pair>
487 :
public unary_function<_Pair, typename _Pair::first_type>
489 typename _Pair::first_type&
490 operator()(_Pair& __x)
const
491 {
return __x.first; }
493 const typename _Pair::first_type&
494 operator()(
const _Pair& __x)
const
495 {
return __x.first; }
497 #if __cplusplus >= 201103L
498 template<
typename _Pair2>
499 typename _Pair2::first_type&
500 operator()(_Pair2& __x)
const
501 {
return __x.first; }
503 template<
typename _Pair2>
504 const typename _Pair2::first_type&
505 operator()(
const _Pair2& __x)
const
506 {
return __x.first; }
510 template<
typename _Pair>
512 :
public unary_function<_Pair, typename _Pair::second_type>
514 typename _Pair::second_type&
515 operator()(_Pair& __x)
const
516 {
return __x.second; }
518 const typename _Pair::second_type&
519 operator()(
const _Pair& __x)
const
520 {
return __x.second; }
539 template<
typename _Ret,
typename _Tp>
542 class mem_fun_t :
public unary_function<_Tp*, _Ret>
546 mem_fun_t(_Ret (_Tp::*__pf)())
550 operator()(_Tp* __p)
const
551 {
return (__p->*_M_f)(); }
559 template<
typename _Ret,
typename _Tp>
560 class const_mem_fun_t :
public unary_function<const _Tp*, _Ret>
564 const_mem_fun_t(_Ret (_Tp::*__pf)()
const)
568 operator()(
const _Tp* __p)
const
569 {
return (__p->*_M_f)(); }
572 _Ret (_Tp::*_M_f)()
const;
577 template<
typename _Ret,
typename _Tp>
578 class mem_fun_ref_t :
public unary_function<_Tp, _Ret>
582 mem_fun_ref_t(_Ret (_Tp::*__pf)())
586 operator()(_Tp& __r)
const
587 {
return (__r.*_M_f)(); }
595 template<
typename _Ret,
typename _Tp>
596 class const_mem_fun_ref_t :
public unary_function<_Tp, _Ret>
600 const_mem_fun_ref_t(_Ret (_Tp::*__pf)()
const)
604 operator()(
const _Tp& __r)
const
605 {
return (__r.*_M_f)(); }
608 _Ret (_Tp::*_M_f)()
const;
613 template<
typename _Ret,
typename _Tp,
typename _Arg>
614 class mem_fun1_t :
public binary_function<_Tp*, _Arg, _Ret>
618 mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
622 operator()(_Tp* __p, _Arg __x)
const
623 {
return (__p->*_M_f)(__x); }
626 _Ret (_Tp::*_M_f)(_Arg);
631 template<
typename _Ret,
typename _Tp,
typename _Arg>
632 class const_mem_fun1_t :
public binary_function<const _Tp*, _Arg, _Ret>
636 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)
const)
640 operator()(
const _Tp* __p, _Arg __x)
const
641 {
return (__p->*_M_f)(__x); }
644 _Ret (_Tp::*_M_f)(_Arg)
const;
649 template<
typename _Ret,
typename _Tp,
typename _Arg>
650 class mem_fun1_ref_t :
public binary_function<_Tp, _Arg, _Ret>
654 mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
658 operator()(_Tp& __r, _Arg __x)
const
659 {
return (__r.*_M_f)(__x); }
662 _Ret (_Tp::*_M_f)(_Arg);
667 template<
typename _Ret,
typename _Tp,
typename _Arg>
668 class const_mem_fun1_ref_t :
public binary_function<_Tp, _Arg, _Ret>
672 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)
const)
676 operator()(
const _Tp& __r, _Arg __x)
const
677 {
return (__r.*_M_f)(__x); }
680 _Ret (_Tp::*_M_f)(_Arg)
const;
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
727 _GLIBCXX_END_NAMESPACE_VERSION
730 #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
namespace std _GLIBCXX_VISIBILITY(default)
Definition: auto_ptr.h:36