/** -*- C++ -*- ** ** KAI C++ Compiler ** ** Copyright (C) 1996-2001 Intel Corp. All rights reserved. **/ /** ** Lib++ : The Modena C++ Standard Library, ** Version 2.4, October 1997 ** ** Copyright (c) 1995-1997 Modena Software Inc. **/ #ifndef __KAI_FUNCTIONAL #define __KAI_FUNCTIONAL #include namespace std { // Subclause 20.3 // Section 20.3.1 -- Base template struct unary_function { typedef Arg argument_type; typedef Result result_type; }; template struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; // Section 20.3.2 -- Arithmetic operations template struct plus : binary_function { inline T operator()(const T& x, const T& y) const { return x + y; } }; template struct minus : binary_function { inline T operator()(const T& x, const T& y) const { return x - y; } }; template struct multiplies : binary_function { inline T operator()(const T& x, const T& y) const { return x * y; } }; template struct divides : binary_function { inline T operator()(const T& x, const T& y) const { return x / y; } }; template struct modulus : binary_function { inline T operator()(const T& x, const T& y) const { return x % y; } }; template struct negate : unary_function { inline T operator()(const T& x) const { return -x; } }; // Section 20.3.3 -- Comparisons template struct equal_to : binary_function { inline bool operator()(const T& x, const T& y) const { return x == y; } }; template struct not_equal_to : binary_function { inline bool operator()(const T& x, const T& y) const { return x != y; } }; template struct greater : binary_function { inline bool operator()(const T& x, const T& y) const { return x > y; } }; template struct less : binary_function { inline bool operator()(const T& x, const T& y) const { return x < y; } }; template struct greater_equal : binary_function { inline bool operator()(const T& x, const T& y) const { return x >= y; } }; template struct less_equal : binary_function { inline bool operator()(const T& x, const T& y) const { return x <= y; } }; // Section 20.3.4 -- Logical operations template struct logical_and : binary_function { inline bool operator()(const T& x, const T& y) const { return x && y; } }; template struct logical_or : binary_function { inline bool operator()(const T& x, const T& y) const { return x || y; } }; template struct logical_not : unary_function { inline bool operator()(const T& x) const { return !x; } }; // Section 20.3.5 -- Negators template class unary_negate : public unary_function { protected: Predicate pred; public: inline explicit unary_negate(const Predicate& x) : pred(x) {} inline bool operator()(const typename Predicate::argument_type& x) const { return !pred(x); } }; template inline unary_negate not1(const Predicate& pred) { return unary_negate(pred); } template class binary_negate : public binary_function { protected: Predicate pred; public: inline explicit binary_negate(const Predicate& x) : pred(x) {} inline bool operator()(const typename Predicate::first_argument_type& x, const typename Predicate::second_argument_type& y) const { return !pred(x, y); } }; template inline binary_negate not2(const Predicate& pred) { return binary_negate(pred); } // Section 20.3.6 -- Binders // Section 20.3.6.1 -- binder1st template class binder1st : public unary_function { protected: Operation op; typename Operation::first_argument_type value; public: inline binder1st(const Operation& x, const typename Operation::first_argument_type& y) : op(x), value(y) {} inline typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const { return op(value, x); } }; // Section 20.3.6.2 -- bind1st template inline binder1st bind1st(const Operation& op, const T& x) { return binder1st(op, typename Operation::first_argument_type(x)); } // Section 20.3.6.3 -- binder2nd template class binder2nd : public unary_function { protected: Operation op; typename Operation::second_argument_type value; public: inline binder2nd(const Operation& x, const typename Operation::second_argument_type& y) : op(x), value(y) {} inline typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const { return op(x, value); } }; // Section 20.3.6.4 -- bind2nd template inline binder2nd bind2nd(const Operation& op, const T& x) { return binder2nd(op, Operation::second_argument_type(x)); } // Section 20.3.7 -- Adaptors for pointers to functions template class pointer_to_unary_function : public unary_function { protected: Result (*ptr)(Arg); public: inline explicit pointer_to_unary_function(Result (*x)(Arg)) : ptr(x) {} inline Result operator()(Arg x) const { return ptr(x); } }; template inline pointer_to_unary_function ptr_fun(Result (*x)(Arg)) { return pointer_to_unary_function(x); } template class pointer_to_binary_function : public binary_function { protected: Result (*ptr)(Arg1, Arg2); public: inline explicit pointer_to_binary_function(Result (*x)(Arg1, Arg2)) : ptr(x) {} inline Result operator()(Arg1 x, Arg2 y) const { return ptr(x, y); } }; template inline pointer_to_binary_function ptr_fun(Result (*x)(Arg1, Arg2)) { return pointer_to_binary_function(x); } // 20.3.8 adaptors for pointers to members: template class mem_fun_t : public unary_function { protected: S (T::*ptr)(); public: // mem_fun_t(){} inline explicit mem_fun_t(S (T::*p)()): ptr(p) { }; inline S operator()(T* p) const { return (p->*ptr)(); } }; template class mem_fun1_t : public binary_function { protected: S (T::*ptr)(A); public: // mem_fun1_t(){} inline explicit mem_fun1_t (S (T::*p)(A)): ptr(p) { }; inline S operator()(T* p, A x) const { return (p->*ptr)(x); } }; template inline mem_fun_t mem_fun(S (T::*f)()) { return mem_fun_t(f); } template inline mem_fun1_t mem_fun(S (T::*f)(A)) { return mem_fun1_t(f); } #ifdef KAI_NONSTD_FUNCTIONAL // Use mem_fun instead. template inline mem_fun1_t mem_fun1(S (T::*f)(A)) { return mem_fun1_t(f); } #endif /* KAI_NONSTD_FUNCTIONAL */ template class mem_fun_ref_t : public unary_function { protected: S (T::*ptr)(); public: // mem_fun_ref_t() {} inline explicit mem_fun_ref_t (S (T::*p)()): ptr(p) { }; inline S operator()(T& r) const { return (r.*ptr)(); } }; template class mem_fun1_ref_t : public binary_function { protected: S (T::*ptr) (A); public: // mem_fun1_ref_t () {} inline explicit mem_fun1_ref_t (S (T::*p)(A)): ptr(p) { }; inline S operator()(T& r, A x) const { return (r.*ptr)(x); } }; template inline mem_fun_ref_t mem_fun_ref(S (T::*f)()) { return mem_fun_ref_t(f); } template inline mem_fun1_ref_t mem_fun_ref(S (T::*f)(A)) { return mem_fun1_ref_t(f); } #ifdef KAI_NONSTD_FUNCTIONAL // Use mem_fun_ref instead. template inline mem_fun1_ref_t mem_fun1_ref(S (T::*f)(A)) { return mem_fun1_ref_t (f); } #endif /* KAI_NONSTD_FUNCTIONAL */ template class const_mem_fun_t : public unary_function { // const_mem_fun_t(); // Deny access. protected: S (T::*ptr)() const; public: inline explicit const_mem_fun_t(S (T::*p)() const) : ptr(p) {} inline S operator()(const T* p) const { return (p->*ptr)(); } }; template class const_mem_fun1_t : public binary_function { // const_mem_fun1_t(); // Deny access. protected: S (T::*ptr)(A) const; public: inline explicit const_mem_fun1_t(S (T::*p)(A) const): ptr(p) { }; inline S operator()(const T* p, A x) const { return (p->*ptr)(x); } }; template inline const_mem_fun_t mem_fun(S (T::*f)() const) { return const_mem_fun_t(f); } template inline const_mem_fun1_t mem_fun(S (T::*f)(A) const) { return const_mem_fun1_t(f); } #ifdef KAI_NONSTD_FUNCTIONAL // Use mem_fun instead. template inline const_mem_fun1_t mem_fun1(S (T::*f)(A) const) { return const_mem_fun1_t(f); } #endif /* KAI_NONSTD_FUNCTIONAL */ template class const_mem_fun_ref_t : public unary_function { // const_mem_fun_ref_t(); // Deny access. protected: S (T::*ptr)() const; public: inline explicit const_mem_fun_ref_t(S (T::*p)() const) : ptr(p) { }; inline S operator()(const T& r) const { return (r.*ptr)(); } }; template class const_mem_fun1_ref_t : public binary_function { const_mem_fun1_ref_t(); // Deny access. protected: S (T::*ptr)(A) const; public: inline explicit const_mem_fun1_ref_t(S (T::*p)(A) const): ptr(p) { }; inline S operator()(const T& r, A x) const { return (r.*ptr)(x); } }; template inline const_mem_fun_ref_t mem_fun_ref(S (T::*f)() const) { return const_mem_fun_ref_t(f); } template inline const_mem_fun1_ref_t mem_fun_ref(S (T::*f)(A) const) { return const_mem_fun1_ref_t(f); } #ifdef KAI_NONSTD_FUNCTIONAL // use mem_fun_ref instead. template inline const_mem_fun1_ref_t mem_fun1_ref(S (T::*f)(A) const) { return const_mem_fun1_ref_t(f); } #endif /* KAI_NONSTD_FUNCTIONAL */ #ifdef KAI_NONSTD_FUNCTIONAL // // The following is not a part of the C++ standard. // Extensions inherited from HP's STL. // template class unary_compose : public unary_function { protected: Operation1 op1; Operation2 op2; public: inline unary_compose (const Operation1& x, const Operation2& y) : op1 (x), op2 (y) {} inline result_type operator()(const argument_type& x) const { return op1(op2(x)); } }; template inline unary_compose compose1(const Operation1& op1, const Operation2& op2) { return unary_compose(op1, op2); } template class binary_compose : public unary_function { protected: Operation1 op1; Operation2 op2; Operation3 op3; public: inline binary_compose(const Operation1& x, const Operation2& y, const Operation3& z) : op1(x), op2(y), op3(z) { } inline result_type operator()(const argument_type& x) const { return op1(op2(x), op3(x)); } }; template inline binary_compose compose2(const Operation1& op1, const Operation2& op2, const Operation3& op3) { return binary_compose (op1, op2, op3); } template struct select1st : public unary_function { inline const U& operator()(const T& x) const { return x.first; } }; template struct select2nd : public unary_function { inline const U& operator()(const T& x) const { return x.second; } }; template struct ident : public unary_function { inline const U& operator()(const T& x) const { return x; } }; #endif /* KAI_NONSTD_FUNCTIONAL */ } // namespace std #endif /* __KAI_FUNCTIONAL */