
https://svn.lrde.epita.fr/svn/oln/prototypes/proto-1.0 ChangeLog | 7 +++ oln/funobj/compose.hh | 93 +++++++++++++++++++++++++++++++++++++++++++++ tests/funobj/tests/compose | 14 ++++++ 3 files changed, 114 insertions(+) Index: olena/ChangeLog from Roland Levillain <roland@lrde.epita.fr> Add composition of two unary functors. * oln/funobj/compose.hh: New file. * tests/funobj/tests/compose: New test. 2005-06-09 Roland Levillain <roland@lrde.epita.fr> Index: olena/tests/funobj/tests/compose --- olena/tests/funobj/tests/compose (revision 0) +++ olena/tests/funobj/tests/compose (revision 0) @@ -0,0 +1,14 @@ + // -*- C++ -*- +#include <oln/funobj/arith.hh> +#include <oln/funobj/compose.hh> + +using namespace oln; + +bool check() +{ + f_::uminus_<int> negate; + if (compose_uu(negate, negate)(1) != 1) + return true; + + return false; +} Index: olena/oln/funobj/compose.hh --- olena/oln/funobj/compose.hh (revision 0) +++ olena/oln/funobj/compose.hh (revision 0) @@ -0,0 +1,93 @@ +// Copyright (C) 2005 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library 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 library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef OLENA_CORE_FUNOBJ_CONVERSION_HH +# define OLENA_CORE_FUNOBJ_CONVERSION_HH + +# include <oln/funobj/abstract/unary.hh> +# include <oln/funobj/abstract/binary.hh> + +namespace oln +{ + + namespace f_ { + template <typename F1, typename F2> struct compose_uu_; + } // end of namespace oln::f_ + + template <typename F1, typename F2> + struct set_super_type < f_::compose_uu_<F1, F2> > { typedef f_::abstract::unary< f_::compose_uu_<F1, F2> > ret; }; + + template <typename F1, typename F2> + struct set_props < category::fun1, f_::compose_uu_<F1, F2> > + { + typedef oln_fun1_type_of(F1, res) res_type; + typedef oln_fun1_type_of(F2, arg) arg_type; + }; + + namespace f_ + { + + /*! \class compose_uu_ + ** + ** This functor performs a composition between two unary functors. + */ + template <typename F1, typename F2> + struct compose_uu_ : public oln_super2_of_(f_::compose_uu_<F1, F2>) + { + typedef compose_uu_<F1, F2> self_type; + typedef oln_fun1_type_of(self_type, res) res_type; + typedef oln_fun1_type_of(self_type, arg) arg_type; + + compose_uu_(const F1& f1, const F2& f2) : + f1_(f1.exact()), f2_(f2.exact()) + { + } + + const res_type impl_unop(const arg_type& arg) const + { + return f1_(f2_(arg)); + } + + private: + const F1 f1_; + const F2 f2_; + }; + + } // end of namespace oln::f_ + + /// Compose two unary functors. + template<class UF1, class UF2> + f_::compose_uu_<UF1, UF2> + compose_uu(const UF1& f1, const UF2& f2) + { + return f_::compose_uu_<UF1, UF2>(f1, f2); + } + +} // end of namespace oln + +#endif // ! OLENA_CORE_FUNOBJ_CONVERSION_HH +