
https://svn.lrde.epita.fr/svn/oln/trunk/milena Index: ChangeLog from Thierry Geraud <thierry.geraud@lrde.epita.fr> Add a resolve mechanism for use in meta functions. * mln/fun/internal/resolve.hh New. * mln/metal/is_a.hh (mlc_is_a__1comma): New macro. * mln/trait/solve_binary.hh: Upgrade file doc style. fun/internal/resolve.hh | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ metal/is_a.hh | 15 ++++++--- trait/solve_binary.hh | 13 +++----- 3 files changed, 93 insertions(+), 13 deletions(-) Index: mln/trait/solve_binary.hh --- mln/trait/solve_binary.hh (revision 3392) +++ mln/trait/solve_binary.hh (working copy) @@ -1,4 +1,5 @@ -// Copyright (C) 2006, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2006, 2008, 2009 EPITA Research and Development +// Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,13 +29,9 @@ #ifndef MLN_TRAIT_SOLVE_BINARY_HH # define MLN_TRAIT_SOLVE_BINARY_HH -/*! - * \file mln/trait/solve_binary.hh - * - * \brief FIXME - * - * - */ +/// \file mln/trait/solve_binary.hh +/// +/// FIXME # include <mln/core/category.hh> # include <mln/core/routine/exact.hh> Index: mln/metal/is_a.hh --- mln/metal/is_a.hh (revision 3392) +++ mln/metal/is_a.hh (working copy) @@ -1,4 +1,5 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2007, 2008, 2009 EPITA Research and Development +// Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,10 +29,9 @@ #ifndef MLN_METAL_IS_A_HH # define MLN_METAL_IS_A_HH -/*! \file mln/metal/is_a.hh - * - * \brief Definition of a type that means "is_a". - */ +/// \file mln/metal/is_a.hh +/// +/// \brief Definition of a type that means "is_a". # include <mln/metal/bool.hh> @@ -47,6 +47,11 @@ # define mlc_is_a(T, M) mln::metal::is_a<T, M> +// Allows to write somthing like "mlc_is_a(T<P1,P2>, M)" without +// getting trouble with the preprocessor due to the 1st comma. +# define mlc_is_a__1comma(Tleft, Tright, M) mln::metal::is_a< Tleft,Tright , M > + + namespace mln { Index: mln/fun/internal/resolve.hh --- mln/fun/internal/resolve.hh (revision 0) +++ mln/fun/internal/resolve.hh (revision 0) @@ -0,0 +1,78 @@ +// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE) +// +// 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, 51 Franklin Street, Fifth Floor, +// 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 MLN_FUN_INTERNAL_RESOLVE_HH +# define MLN_FUN_INTERNAL_RESOLVE_HH + +/// \file mln/fun/internal/resolve.hh +/// +/// \brief FIXME. + +# include <mln/core/concept/function.hh> +# include <mln/trait/solve.hh> +# include <mln/value/builtin/all.hh> + + +# define mln_fun_internal_resolve(F) typename fun::internal::resolve< F >::ret + + + +namespace mln +{ + + namespace fun + { + + namespace internal + { + + template <typename F> + struct resolve; + + template < template <class, class> class F, + typename L, + typename R > + struct resolve< F<L,R> > : public mln::trait::solve_binary< F, L, R >, + private mlc_is_a__1comma(F<L,R>, Function)::check_t + { + }; + + template < template <class> class F, + typename T > + struct resolve< F<T> > : public mln::trait::solve_unary< F, T >, + private mlc_is_a(F<T>, Function)::check_t + { + }; + + } // end of namespace mln::fun::internal + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_INTERNAL_RESOLVE_HH