traverse.hh

00001 // Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
00027 
00028 #ifndef OLENA_CORE_TRAVERSE_HH
00029 # define OLENA_CORE_TRAVERSE_HH
00030 
00031 # include <mlc/contract.hh>
00032 # include <oln/core/abstract/image.hh>
00033 # include <oln/core/abstract/iter.hh>
00034 # include <oln/core/macros.hh>
00035 
00036 namespace oln {
00037 
00038   // traverse (unary)
00039 
00043   template<class I, class F>
00044   const F& 
00045   traverse(F& f, const abstract::image<I>& input)
00046   {
00047     oln_iter_type(I) p(input);
00048     for_all(p) f(input[p]);
00049     return f;
00050   }
00051 
00052   
00056   template<class F, class I> 
00057   inline const F 
00058   traverse(const abstract::image<I>& input)
00059   {
00060     F f;
00061     return traverse(f, input);
00062   }
00063 
00067   template<template<class> class F, class I> 
00068   inline const F<oln_value_type(I)> 
00069   traverse(const abstract::image<I>& input)
00070   {
00071     F<oln_value_type(I)> f;
00072     return traverse(f, input);
00073   }
00074 
00075   
00079   template<template<class, class> class F, class I2, class I> 
00080   inline const F<oln_value_type(I), I2> 
00081   traverse(const abstract::image<I>& input)
00082   {
00083     F<oln_value_type(I), I2> f;
00084     return traverse(f, input);
00085   }
00086 
00091   template<template<class,class> class F,
00092            template<class> class F2,
00093            class I> 
00094   inline const F<oln_value_type(I), F2<oln_value_type(I)> > 
00095   traverse(const abstract::image<I>& input)
00096   {
00097     F<oln_value_type(I), F2<oln_value_type(I)> > f;
00098     traverse(f, input);
00099     return f;
00100   }
00101 
00102 
00103   // traverse2 (binary)
00104 
00110   template<class I1, class I2, class F>
00111   const F& 
00112   traverse2(F& f,
00113             const abstract::image<I1>& input1, 
00114             const abstract::image<I2>& input2)
00115   {
00116     precondition(input1.size() == input2.size());
00117     oln_iter_type(I1) p(input1);
00118     for_all(p) f(input1[p], input2[p]);
00119     return f;
00120   }
00121 
00128   template<template<class> class F, class I> 
00129   inline const F<oln_value_type(I)> 
00130   traverse2(const abstract::image<I>& input1, const abstract::image<I>& input2)
00131   {
00132     F<oln_value_type(I)> f;
00133     return traverse2(f, input1, input2);
00134   }
00135 
00143   template<template<class,class> class F, class I1, class I2> 
00144   inline const F<oln_value_type(I1), oln_value_type(I2)> 
00145   traverse2(const abstract::image<I1>& input1, 
00146             const abstract::image<I2>& input2)
00147   {
00148     F<oln_value_type(I1), oln_value_type(I2)> f;
00149     return traverse2(f, input1, input2);
00150   }
00151 
00152 } // end of oln
00153 
00154 #endif // ! OLENA_CORE_TRAVERSE_HH

Generated on Thu Apr 15 20:13:15 2004 for Olena by doxygen 1.3.6-20040222