// rak - Rakshasa's toolbox // Copyright (C) 2005-2007, Jari Sundell // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // In addition, as a special exception, the copyright holders give // permission to link the code of portions of this program with the // OpenSSL library under certain conditions as described in each // individual source file, and distribute linked combinations // including the two. // // You must obey the GNU General Public License in all respects for // all of the code used other than OpenSSL. If you modify file(s) // with this exception, you may extend this exception to your version // of the file(s), but you are not obligated to do so. If you do not // wish to do so, delete this exception statement from your version. // If you delete this exception statement from all source files in the // program, then also delete it here. // // Contact: Jari Sundell // // Skomakerveien 33 // 3185 Skoppum, NORWAY #ifndef RAK_FUNCTIONAL_H #define RAK_FUNCTIONAL_H #include namespace rak { template struct reference_fix { typedef Type type; }; template struct reference_fix { typedef Type type; }; template struct value_t { value_t(Type v) : m_v(v) {} Type operator () () const { return m_v; } Type m_v; }; template inline value_t value(Type v) { return value_t(v); } template struct accumulate_t { accumulate_t(Type t, Ftor f) : result(t), m_f(f) {} template void operator () (const Arg& a) { result += m_f(a); } Type result; Ftor m_f; }; template inline accumulate_t accumulate(Type t, Ftor f) { return accumulate_t(t, f); } // Operators: template struct equal_t { typedef bool result_type; equal_t(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t == m_f(a); } Type m_t; Ftor m_f; }; template inline equal_t equal(Type t, Ftor f) { return equal_t(t, f); } template struct equal_ptr_t { typedef bool result_type; equal_ptr_t(Type* t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (const Arg& a) { return *m_t == *m_f(a); } Type* m_t; Ftor m_f; }; template inline equal_ptr_t equal_ptr(Type* t, Ftor f) { return equal_ptr_t(t, f); } template struct not_equal_t { typedef bool result_type; not_equal_t(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t != m_f(a); } Type m_t; Ftor m_f; }; template inline not_equal_t not_equal(Type t, Ftor f) { return not_equal_t(t, f); } template struct less_t { typedef bool result_type; less_t(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t < m_f(a); } Type m_t; Ftor m_f; }; template inline less_t less(Type t, Ftor f) { return less_t(t, f); } template struct less2_t : public std::binary_function { less2_t(FtorA f_a, FtorB f_b) : m_f_a(f_a), m_f_b(f_b) {} bool operator () (typename FtorA::argument_type a, typename FtorB::argument_type b) { return m_f_a(a) < m_f_b(b); } FtorA m_f_a; FtorB m_f_b; }; template inline less2_t less2(FtorA f_a, FtorB f_b) { return less2_t(f_a,f_b); } template struct _greater { typedef bool result_type; _greater(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t > m_f(a); } Type m_t; Ftor m_f; }; template inline _greater greater(Type t, Ftor f) { return _greater(t, f); } template struct greater2_t : public std::binary_function { greater2_t(FtorA f_a, FtorB f_b) : m_f_a(f_a), m_f_b(f_b) {} bool operator () (typename FtorA::argument_type a, typename FtorB::argument_type b) { return m_f_a(a) > m_f_b(b); } FtorA m_f_a; FtorB m_f_b; }; template inline greater2_t greater2(FtorA f_a, FtorB f_b) { return greater2_t(f_a,f_b); } template struct less_equal_t { typedef bool result_type; less_equal_t(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t <= m_f(a); } Type m_t; Ftor m_f; }; template inline less_equal_t less_equal(Type t, Ftor f) { return less_equal_t(t, f); } template struct greater_equal_t { typedef bool result_type; greater_equal_t(Type t, Ftor f) : m_t(t), m_f(f) {} template bool operator () (Arg& a) { return m_t >= m_f(a); } Type m_t; Ftor m_f; }; template inline greater_equal_t greater_equal(Type t, Ftor f) { return greater_equal_t(t, f); } template struct invert : public std::unary_function { Tp operator () (const Tp& x) const { return ~x; } }; template struct on_t : public std::unary_function { typedef typename Dest::result_type result_type; on_t(Src s, Dest d) : m_dest(d), m_src(s) {} result_type operator () (typename reference_fix::type arg) { return m_dest(m_src(arg)); } Dest m_dest; Src m_src; }; template inline on_t on(Src s, Dest d) { return on_t(s, d); } template struct on2_t : public std::binary_function { typedef typename Dest::result_type result_type; on2_t(Src s, Dest d) : m_dest(d), m_src(s) {} result_type operator () (typename reference_fix::type first, typename reference_fix::type second) { return m_dest(m_src(first), second); } Dest m_dest; Src m_src; }; template inline on2_t on2(Src s, Dest d) { return on2_t(s, d); } // Creates a functor for accessing a member. template struct mem_ptr_t : public std::unary_function { mem_ptr_t(Member Class::*m) : m_member(m) {} Member& operator () (Class* c) { return c->*m_member; } const Member& operator () (const Class* c) { return c->*m_member; } Member Class::*m_member; }; template inline mem_ptr_t mem_ptr(Member Class::*m) { return mem_ptr_t(m); } template struct mem_ref_t : public std::unary_function { mem_ref_t(Member Class::*m) : m_member(m) {} Member& operator () (Class& c) { return c.*m_member; } Member Class::*m_member; }; template struct const_mem_ref_t : public std::unary_function { const_mem_ref_t(const Member Class::*m) : m_member(m) {} const Member& operator () (const Class& c) { return c.*m_member; } const Member Class::*m_member; }; template inline mem_ref_t mem_ref(Member Class::*m) { return mem_ref_t(m); } template inline const_mem_ref_t const_mem_ref(const Member Class::*m) { return const_mem_ref_t(m); } template struct if_then_t { if_then_t(Cond c, Then t) : m_cond(c), m_then(t) {} template void operator () (Arg& a) { if (m_cond(a)) m_then(a); } Cond m_cond; Then m_then; }; template inline if_then_t if_then(Cond c, Then t) { return if_then_t(c, t); } template struct call_delete : public std::unary_function { void operator () (T* t) { delete t; } }; template inline void call_delete_func(T* t) { delete t; } template class bind1st_t : public std::unary_function { public: typedef typename reference_fix::type value_type; typedef typename reference_fix::type argument_type; bind1st_t(const Operation& op, const value_type v) : m_op(op), m_value(v) {} typename Operation::result_type operator () (const argument_type arg) { return m_op(m_value, arg); } protected: Operation m_op; value_type m_value; }; template inline bind1st_t bind1st(const Operation& op, const Type& val) { return bind1st_t(op, val); } template class bind2nd_t : public std::unary_function { public: typedef typename reference_fix::type argument_type; typedef typename reference_fix::type value_type; bind2nd_t(const Operation& op, const value_type v) : m_op(op), m_value(v) {} typename Operation::result_type operator () (argument_type arg) { return m_op(arg, m_value); } protected: Operation m_op; value_type m_value; }; template inline bind2nd_t bind2nd(const Operation& op, const Type& val) { return bind2nd_t(op, val); } // Lightweight callback function including pointer to object. Should // be replaced by TR1 stuff later. Requires an object to bind, instead // of using a seperate functor for that. template class ptr_fun0 { public: typedef Ret result_type; typedef Ret (*Function)(); ptr_fun0() {} ptr_fun0(Function f) : m_function(f) {} bool is_valid() const { return m_function; } Ret operator () () { return m_function(); } private: Function m_function; }; template class mem_fun0 { public: typedef Ret result_type; typedef Ret (Object::*Function)(); mem_fun0() : m_object(NULL) {} mem_fun0(Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } Ret operator () () { return (m_object->*m_function)(); } private: Object* m_object; Function m_function; }; template class const_mem_fun0 { public: typedef Ret result_type; typedef Ret (Object::*Function)() const; const_mem_fun0() : m_object(NULL) {} const_mem_fun0(const Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } Ret operator () () const { return (m_object->*m_function)(); } private: const Object* m_object; Function m_function; }; template class mem_fun1 { public: typedef Ret result_type; typedef Ret (Object::*Function)(Arg1); mem_fun1() : m_object(NULL) {} mem_fun1(Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } Ret operator () (Arg1 a1) { return (m_object->*m_function)(a1); } private: Object* m_object; Function m_function; }; template class const_mem_fun1 { public: typedef Ret result_type; typedef Ret (Object::*Function)(Arg1) const; const_mem_fun1() : m_object(NULL) {} const_mem_fun1(const Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } Ret operator () (Arg1 a1) const { return (m_object->*m_function)(a1); } private: const Object* m_object; Function m_function; }; template class mem_fun2 : public std::binary_function { public: typedef Ret result_type; typedef Ret (Object::*Function)(Arg1, Arg2); typedef Object object_type; mem_fun2() : m_object(NULL) {} mem_fun2(Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } object_type* object() { return m_object; } const object_type* object() const { return m_object; } Ret operator () (Arg1 a1, Arg2 a2) { return (m_object->*m_function)(a1, a2); } private: Object* m_object; Function m_function; }; template class mem_fun3 { public: typedef Ret result_type; typedef Ret (Object::*Function)(Arg1, Arg2, Arg3); mem_fun3() : m_object(NULL) {} mem_fun3(Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() const { return m_object; } Ret operator () (Arg1 a1, Arg2 a2, Arg3 a3) { return (m_object->*m_function)(a1, a2, a3); } private: Object* m_object; Function m_function; }; template inline ptr_fun0 ptr_fun(Ret (*f)()) { return ptr_fun0(f); } template inline mem_fun0 make_mem_fun(Object* o, Ret (Object::*f)()) { return mem_fun0(o, f); } template inline const_mem_fun0 make_mem_fun(const Object* o, Ret (Object::*f)() const) { return const_mem_fun0(o, f); } template inline mem_fun1 make_mem_fun(Object* o, Ret (Object::*f)(Arg1)) { return mem_fun1(o, f); } template inline const_mem_fun1 make_mem_fun(const Object* o, Ret (Object::*f)(Arg1) const) { return const_mem_fun1(o, f); } template inline mem_fun2 make_mem_fun(Object* o, Ret (Object::*f)(Arg1, Arg2)) { return mem_fun2(o, f); } template inline mem_fun3 make_mem_fun(Object* o, Ret (Object::*f)(Arg1, Arg2, Arg3)) { return mem_fun3(o, f); } } #endif