// rak - Rakshasa's toolbox // Copyright (C) 2005, 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 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 _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 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); } // Creates a functor for accessing a member. template struct mem_ptr_ref_t : public std::unary_function { mem_ptr_ref_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_ref_t mem_ptr_ref(Member Class::*m) { return mem_ptr_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 { protected: typedef typename reference_fix::type value_type; typedef typename reference_fix::type argument_type; Operation m_op; value_type m_value; public: 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); } }; template inline bind1st_t bind1st(const Operation& op, const Type& val) { return bind1st_t(op, val); } template class bind2nd_t : public std::unary_function { protected: typedef typename reference_fix::type argument_type; typedef typename reference_fix::type value_type; Operation m_op; value_type m_value; public: bind2nd_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(arg, 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 mem_fun0 { public: 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 (Object::*Function)() const; const_mem_fun0() : m_object(NULL) {} const_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 mem_fun1 { public: 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 (Object::*Function)(Arg1) const; const_mem_fun1() : m_object(NULL) {} const_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 mem_fun2 : public std::binary_function { public: typedef Ret (Object::*Function)(Arg1, Arg2); mem_fun2() : m_object(NULL) {} mem_fun2(Object* o, Function f) : m_object(o), m_function(f) {} bool is_valid() 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 (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 mem_fun0 make_mem_fun(Object* o, Ret (Object::*f)()) { return mem_fun0(o, f); } template inline const_mem_fun0 make_mem_fun(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(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