https://svn.lrde.epita.fr/svn/oln/trunk/olena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add initialization material; extend point2d and box2d with it.
* oln/core/init.hh,
* oln/core/internal/initializer.hh,
* oln/core/internal/instant_value.hh: New.
* oln/core/concept/grid.hh (from, to): New.
* oln/core/2d/grid2d.hh (row, col),
(drow, dcol, nrows, ncols): New.
* oln/core/2d/box2d.hh (init__): New.
* oln/core/2d/point2d.hh (init__): New.
* oln/core/gen/box.hh (init__): New.
(operator<<): New.
* oln/core/internal/utils.hh: Add FIXME.
2d/box2d.hh | 65 +++++++++++++++++++++++++-
2d/grid2d.hh | 9 +++
2d/point2d.hh | 30 ++++++++++++
concept/grid.hh | 6 ++
gen/box.hh | 43 ++++++++++++++++-
init.hh | 105 ++++++++++++++++++++++++++++++++++++++++++
internal/initializer.hh | 115 ++++++++++++++++++++++++++++++++++++++++++++++
internal/instant_value.hh | 85 ++++++++++++++++++++++++++++++++++
internal/utils.hh | 6 ++
9 files changed, 460 insertions(+), 4 deletions(-)
Index: oln/core/concept/grid.hh
--- oln/core/concept/grid.hh (revision 867)
+++ oln/core/concept/grid.hh (working copy)
@@ -30,11 +30,17 @@
# define OLN_CORE_CONCEPT_GRID_HH
# include <oln/core/equipment.hh>
+# include <oln/core/internal/instant_value.hh>
namespace oln
{
+ /// Instant values.
+ oln_decl_instant_value(from);
+ oln_decl_instant_value(to);
+
+
/// Concept-class "Grid".
template <typename Exact>
Index: oln/core/init.hh
--- oln/core/init.hh (revision 0)
+++ oln/core/init.hh (revision 0)
@@ -0,0 +1,105 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_INIT_HH
+# define OLN_CORE_INIT_HH
+
+# include <oln/core/internal/utils.hh>
+# include <oln/core/internal/instant_value.hh>
+# include <oln/core/internal/initializer.hh>
+
+
+
+namespace oln
+{
+
+
+ template <template<class> class M, typename V>
+ internal::initializer_< internal::singleton< M<V> > >
+ init(const internal::instant_value_<M,V>& v);
+
+
+ template <template<class> class M1, typename V1,
+ template<class> class M2, typename V2>
+ internal::initializer_< internal::pair< M1<V1>, M2<V2> > >
+ init(const internal::instant_value_<M1,V1>& v1,
+ const internal::instant_value_<M2,V2>& v2);
+
+
+ template <template<class> class M1, typename V1,
+ template<class> class M2, typename V2,
+ template<class> class M3, typename V3>
+ internal::initializer_< internal::triplet< M1<V1>, M2<V2>, M3<V3> > >
+ init(const internal::instant_value_<M1,V1>& v1,
+ const internal::instant_value_<M2,V2>& v2,
+ const internal::instant_value_<M3,V3>& v3);
+
+ // ...
+
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <template<class> class M, typename V>
+ internal::initializer_< internal::singleton< M<V> > >
+ init(const internal::instant_value_<M,V>& v)
+ {
+ internal::singleton< M<V> > tmp(v.value);
+ return tmp;
+ }
+
+ template <template<class> class M1, typename V1,
+ template<class> class M2, typename V2>
+ internal::initializer_< internal::pair< M1<V1>, M2<V2> > >
+ init(const internal::instant_value_<M1,V1>& v1,
+ const internal::instant_value_<M2,V2>& v2)
+ {
+ internal::pair< M1<V1>, M2<V2> > tmp(v1.value, v2.value);
+ return tmp;
+ }
+
+ template <template<class> class M1, typename V1,
+ template<class> class M2, typename V2,
+ template<class> class M3, typename V3>
+ internal::initializer_< internal::triplet< M1<V1>, M2<V2>, M3<V3> > >
+ init(const internal::instant_value_<M1,V1>& v1,
+ const internal::instant_value_<M2,V2>& v2,
+ const internal::instant_value_<M3,V3>& v3)
+ {
+ internal::triplet< M1<V1>, M2<V2>, M3<V3> > tmp(v1.value, v2.value, v3.value);
+ return tmp;
+ }
+
+ // ...
+
+# endif // OLN_INCLUDE_ONLY
+
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_INIT_HH
Property changes on: oln/core/init.hh
___________________________________________________________________
Name: svn:executable
+ *
Index: oln/core/2d/grid2d.hh
--- oln/core/2d/grid2d.hh (revision 867)
+++ oln/core/2d/grid2d.hh (working copy)
@@ -32,6 +32,7 @@
# include <oln/core/concept/grid.hh>
+
# define OLN_ENV_2D
@@ -39,6 +40,14 @@
namespace oln
{
+ /// Instant values.
+ oln_decl_instant_value(row);
+ oln_decl_instant_value(col);
+ oln_decl_instant_value(drow);
+ oln_decl_instant_value(dcol);
+ oln_decl_instant_value(nrows);
+ oln_decl_instant_value(ncols);
+
/// \{
/// Fwd decls.
Index: oln/core/2d/box2d.hh
--- oln/core/2d/box2d.hh (revision 867)
+++ oln/core/2d/box2d.hh (working copy)
@@ -28,18 +28,79 @@
#ifndef OLN_CORE_2D_BOX2D_HH
# define OLN_CORE_2D_BOX2D_HH
-# include <oln/core/gen/box.hh>
# include <oln/core/2d/point2d.hh>
namespace oln
{
+ // Fwd decl.
+ template <typename P> class box_;
+
+
// FIXME: box2d should be an actual type, not an alias...
typedef box_<point2d> box2d;
+
+ /// init__
+ namespace internal
+ {
+
+ template <typename C>
+ void init__(box2d& b,
+ const initializer_< pair< nrows_t<C>, ncols_t<C> > >& data);
+
+ template <typename C>
+ void init__(box2d& b,
+ const initializer_< triplet< from_t<point2d>, nrows_t<C>, ncols_t<C> > >& data);
+
+ } // end of namespace oln::internal
+
} // end of namespace oln
-#endif // ! OLN_CORE_2D_BOX2D_HH
+# include <oln/core/gen/box.hh>
+
+# ifndef OLN_INCLUDE_ONLY
+
+namespace oln
+{
+
+ namespace internal
+ {
+
+ template <typename C>
+ void init__(box2d& b,
+ const initializer_< pair< nrows_t<C>, ncols_t<C> > >& data)
+ {
+ C nrows = data->value1.value;
+ C ncols = data->value2.value;
+ precondition(nrows > 0 and ncols > 0);
+ b.pmin().row() = 0;
+ b.pmin().col() = 0;
+ b.pmax().row() = nrows - 1;
+ b.pmax().col() = ncols - 1;
+ }
+
+ template <typename C>
+ void init__(box2d& b,
+ const initializer_< triplet< from_t<point2d>, nrows_t<C>, ncols_t<C> > >& data)
+ {
+ C nrows = data->value2.value;
+ C ncols = data->value3.value;
+ precondition(nrows > 0 and ncols > 0);
+ b.pmin() = data->value1.value;
+ b.pmax().row() = b.pmin().row() + nrows - 1;
+ b.pmax().col() = b.pmin().col() + ncols - 1;
+ }
+
+ } // end of namespace oln::internal
+
+} // end of namespace oln
+
+
+# endif // OLN_INCLUDE_ONLY
+
+
+#endif // ! OLN_CORE_2D_BOX2D_HH
Index: oln/core/2d/point2d.hh
--- oln/core/2d/point2d.hh (revision 867)
+++ oln/core/2d/point2d.hh (working copy)
@@ -31,6 +31,7 @@
# include <oln/core/2d/grid2d.hh>
# include <oln/core/internal/point2d.hh>
+# include <oln/core/init.hh>
namespace oln
@@ -59,13 +60,25 @@
};
+ /// init__
+ namespace internal
+ {
+ template <typename C>
+ void init__(point2d& p,
+ const initializer_< pair< row_t<C>, col_t<C> > >& data);
+ }
+
+
/// Usual 2D point class.
class point2d : public internal::point2d_< point2d >
{
public:
+
/// Ctors.
point2d();
point2d(int row, int col);
+ template <typename D>
+ point2d(const internal::initializer_<D>& data);
};
@@ -82,6 +95,23 @@
this->col() = col;
}
+ template <typename D>
+ point2d::point2d(const internal::initializer_<D>& data)
+ {
+ internal::init__(*this, data);
+ }
+
+ namespace internal
+ {
+ template <typename C>
+ void init__(point2d& p,
+ const initializer_< pair< row_t<C>, col_t<C> > >& data)
+ {
+ p.row() = data->value1.value; // FIXME: first
+ p.col() = data->value2.value; // FIXME: second
+ }
+ }
+
# endif
Index: oln/core/gen/box.hh
--- oln/core/gen/box.hh (revision 867)
+++ oln/core/gen/box.hh (working copy)
@@ -32,11 +32,13 @@
# include <oln/core/concept/point.hh>
# include <oln/core/concept/iterator_on_points.hh>
# include <oln/core/internal/point_set_base.hh>
+# include <oln/core/init.hh>
namespace oln
{
+
// Forward declarations.
template <typename P> class box_;
template <typename P> class box_fwd_piter_;
@@ -62,6 +64,15 @@
};
+ /// init__
+ namespace internal
+ {
+ template <typename P>
+ void init__(box_<P>& b,
+ const initializer_< pair< from_t<P>, to_t<P> > >& data);
+ }
+
+
/// Generic box class based on a point class.
template <typename P>
@@ -83,6 +94,8 @@
box_();
box_(const P& pmin, const P& pmax);
+ template <typename D>
+ box_(const internal::initializer_<D>& data);
unsigned impl_npoints() const;
bool impl_has(const P& p) const;
@@ -99,6 +112,11 @@
}; // end of class oln::box_<P>
+ template <typename P>
+ std::ostream& operator<<(std::ostream& ostr, const box_<P>& b)
+ {
+ return ostr << "{ " << b.pmin() << " .. " << b.pmax() << " }";
+ }
// -------------------- iterators on box_<P>
@@ -209,6 +227,13 @@
}
template <typename P>
+ template <typename D>
+ box_<P>::box_(const internal::initializer_<D>& data)
+ {
+ internal::init__(*this, data);
+ }
+
+ template <typename P>
unsigned
box_<P>::impl_npoints() const
{
@@ -268,6 +293,22 @@
}
+ // -------------------- init__
+
+
+ namespace internal
+ {
+
+ template <typename P>
+ void init__(box_<P>& b,
+ const initializer_< pair< from_t<P>, to_t<P> > >& data)
+ {
+ b.pmin() = data->value1.value;
+ b.pmax() = data->value2.value;
+ }
+
+ }
+
// -------------------- box_fwd_piter_<P>
@@ -407,7 +448,7 @@
return &p_;
}
-# endif
+# endif // OLN_INCLUDE_ONLY
} // end of namespace oln
Index: oln/core/internal/initializer.hh
--- oln/core/internal/initializer.hh (revision 0)
+++ oln/core/internal/initializer.hh (revision 0)
@@ -0,0 +1,115 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_INTERNAL_INITIALIZER_HH
+# define OLN_CORE_INTERNAL_INITIALIZER_HH
+
+
+namespace oln
+{
+
+
+ namespace ERROR
+ {
+
+ template <typename S>
+ struct bad_initialization_of_
+ {
+ template <typename D>
+ struct with_;
+ };
+
+ } // end of namespace oln::ERROR
+
+
+
+ namespace internal
+ {
+
+
+ template <typename D>
+ struct initializer_
+ {
+ initializer_(const D& data);
+ const D& operator*() const;
+ const D* operator->() const;
+
+ protected:
+ D data_;
+ };
+
+
+ template <typename Tag, typename Subject, typename D>
+ void init__(const Tag& t, Subject& s, const initializer_<D>& d);
+
+ template <typename Subject, typename D>
+ void init__(Subject& s, const initializer_<D>& d);
+
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename D>
+ initializer_<D>::initializer_(const D& data)
+ : data_(data)
+ {}
+
+ template <typename D>
+ const D&
+ initializer_<D>::operator*() const
+ {
+ return this->data_;
+ }
+
+ template <typename D>
+ const D*
+ initializer_<D>::operator->() const
+ {
+ return &(this->data_);
+ }
+
+ template <typename Tag, typename Subject, typename D>
+ void init__(const Tag&, Subject&, const initializer_<D>&)
+ {
+ mlc::abort_<D, typename ERROR::bad_initialization_of_<Subject>::template with_<D> >::check();
+ }
+
+ template <typename Subject, typename D>
+ void init__(Subject&, const initializer_<D>&)
+ {
+ mlc::abort_<D, typename ERROR::bad_initialization_of_<Subject>::template with_<D> >::check();
+ }
+
+# endif // OLN_INCLUDE_ONLY
+
+
+ } // end of namespace oln::internal
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_INTERNAL_INITIALIZER_HH
Property changes on: oln/core/internal/initializer.hh
___________________________________________________________________
Name: svn:executable
+ *
Index: oln/core/internal/utils.hh
--- oln/core/internal/utils.hh (revision 867)
+++ oln/core/internal/utils.hh (working copy)
@@ -35,6 +35,11 @@
namespace internal
{
+
+ // FIXME: Rename attributes as first / second / third / fourth?
+
+
+
/// Simple singleton class.
template <typename T>
@@ -109,4 +114,3 @@
#endif // ! OLN_CORE_INTERNAL_UTILS_HH
-
Index: oln/core/internal/instant_value.hh
--- oln/core/internal/instant_value.hh (revision 0)
+++ oln/core/internal/instant_value.hh (revision 0)
@@ -0,0 +1,85 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_INTERNAL_INSTANT_VALUE_HH
+# define OLN_CORE_INTERNAL_INSTANT_VALUE_HH
+
+
+# define oln_decl_instant_value(Name) \
+ \
+template <typename V> \
+struct Name##_t : public internal::instant_value_< Name##_t, V> \
+{ \
+ Name##_t(const V& v) { this->value = v; } \
+}; \
+ \
+template <typename V> \
+Name##_t<V> Name(const V& v) \
+{ \
+ return Name##_t<V>(v); \
+} \
+ \
+struct e_n_d___w_i_t_h___s_e_m_i_c_o_l_u_m_n
+
+
+
+namespace oln
+{
+
+ namespace internal
+ {
+
+ /// Class internal::instant_value_<M,V>.
+
+ template <template<class> class M, typename V>
+ struct instant_value_
+ {
+ V value;
+
+ template <typename W>
+ operator M<W>() const;
+ };
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <template<class> class M, typename V>
+ template <typename W>
+ instant_value_<M,V>::operator M<W>() const
+ {
+ M<W> tmp(this->value);
+ return tmp;
+ }
+
+# endif // OLN_INCLUDE_ONLY
+
+ } // end of namespace oln::internal
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_INTERNAL_INSTANT_VALUE_HH
https://svn.lrde.epita.fr/svn/oln/trunk/olena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add the notion of image plus neighborhood and the underlying
mechanism.
* oln/debug/print_nbh.hh,
* oln/debug/iota.hh,
* oln/core/concept/image_identity.hh,
* oln/core/gen/op.hh,
* oln/core/internal/op_image_plus_nbh.hh,
* oln/core/internal/special_op.hh: New.
* oln/core/concept/image.hh (fwd_niter, bkd_niter, niter): New.
* oln/core/concept/neighborhood.hh (category): New.
(include): Add op_image_plus_nbh.hh.
(oln_decl_op_plus): New. Handle "Image + Neighborhood".
* oln/core/equipment.hh (left, right, oper, tag): New.
* oln/core/gen/single_value_image.hh: Fix.
* oln/core/internal/neighborhood_base.hh (category): New.
(neighborhood_base_): Fix inheritance.
* oln/core/internal/image_base.hh (image_extension_): New.
(image_base_): Add dpoint.
* oln/stc/scoop.hxx (vtypes, super_trait_): Add specialization
for const types.
(super_trait_): Handle error when not user-defined.
core/concept/image.hh | 5
core/concept/image_identity.hh | 292 +++++++++++++++++++++++++++++++++++++
core/concept/neighborhood.hh | 6
core/equipment.hh | 6
core/gen/op.hh | 162 ++++++++++++++++++++
core/gen/single_value_image.hh | 5
core/internal/image_base.hh | 35 ++++
core/internal/neighborhood_base.hh | 3
core/internal/op_image_plus_nbh.hh | 102 ++++++++++++
core/internal/special_op.hh | 76 +++++++++
debug/iota.hh | 56 +++++++
debug/print_nbh.hh | 101 ++++++++++++
stc/scoop.hxx | 21 ++
13 files changed, 863 insertions(+), 7 deletions(-)
Index: oln/debug/print_nbh.hh
--- oln/debug/print_nbh.hh (revision 0)
+++ oln/debug/print_nbh.hh (revision 0)
@@ -0,0 +1,101 @@
+// Copyright (C) 2007 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, 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 OLN_DEBUG_PRINT_NBH_HH
+# define OLN_DEBUG_PRINT_NBH_HH
+
+# include <iostream>
+# include <oln/core/concept/image.hh>
+
+
+namespace oln
+{
+
+ namespace debug
+ {
+
+ // fwd decl
+ template <typename I>
+ void print_nbh(const Image_with_Nbh<I>& input, std::ostream& ostr = std::cout);
+
+
+ namespace impl
+ {
+
+ // Image
+
+ template <typename I>
+ void print_nbh(const Image<I>&, const I& input, std::ostream& ostr)
+ {
+ typename I::fwd_piter p(input.points());
+ typename I::fwd_niter n(p, input.nbhood());
+ for_all(p)
+ {
+ ostr << input(p) << ": ";
+ for_all(n)
+ if (input.owns_(n))
+ ostr << input(n) << " ";
+ ostr << std::endl;
+ }
+ }
+
+
+ // Point_Wise_Accessible_Image
+
+ template <typename I>
+ void print_nbh(const Point_Wise_Accessible_Image<I>&,const I& input, std::ostream& ostr)
+ {
+ typename I::fwd_piter p(input.points());
+ typename I::fwd_niter n(p, input.nbhood());
+ for_all(p)
+ {
+ ostr << input(p) << ": ";
+ for_all(n)
+ if (input.has(n))
+ ostr << input(n) << " ";
+ ostr << std::endl;
+ }
+ }
+
+ } // end of namespace oln::debug::impl
+
+
+ // facade
+ template <typename I>
+ void print_nbh(const Image_with_Nbh<I>& input, std::ostream& ostr)
+ {
+ impl::print_nbh(exact(input), exact(input), ostr);
+ }
+
+
+
+ } // end of namespace oln::debug
+
+} // end of namespace oln
+
+
+#endif // ! OLN_DEBUG_PRINT_NBH_HH
Index: oln/debug/iota.hh
--- oln/debug/iota.hh (revision 0)
+++ oln/debug/iota.hh (revision 0)
@@ -0,0 +1,56 @@
+// Copyright (C) 2007 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, 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 OLN_DEBUG_IOTA_HH
+# define OLN_DEBUG_IOTA_HH
+
+# include <oln/core/concept/image.hh>
+
+
+namespace oln
+{
+
+ namespace debug
+ {
+
+
+ template <typename I>
+ void iota(Mutable_Image<I>& in_out)
+ {
+ typename I::value v = 0;
+ typename I::fwd_piter p(in_out.points());
+ for_all(p)
+ in_out(p) = v++;
+ }
+
+
+ } // end of namespace oln::debug
+
+} // end of namespace oln
+
+
+#endif // ! OLN_DEBUG_IOTA_HH
Index: oln/core/concept/image.hh
--- oln/core/concept/image.hh (revision 858)
+++ oln/core/concept/image.hh (working copy)
@@ -142,6 +142,11 @@
public automatic::get_impl<Image_with_Nbh, Exact>
{
stc_typename(nbh);
+
+ stc_typename(fwd_niter);
+ stc_typename(bkd_niter);
+ typedef fwd_niter niter;
+
nbh nbhood() const;
protected:
Index: oln/core/concept/neighborhood.hh
--- oln/core/concept/neighborhood.hh (revision 858)
+++ oln/core/concept/neighborhood.hh (working copy)
@@ -29,6 +29,9 @@
# define OLN_CORE_CONCEPT_NEIGHBORHOOD_HH
# include <oln/core/equipment.hh>
+# include <oln/core/internal/op_image_plus_nbh.hh>
+
+
namespace oln
@@ -41,6 +44,7 @@
{
stc_typename(grid);
stc_typename(point);
+ stc_typename(category);
protected:
Neighborhood();
@@ -48,6 +52,8 @@
}; // end of oln::Neighborhood<Exact>
+ oln_decl_op_plus(Image, Neighborhood);
+
# ifndef OLN_INCLUDE_ONLY
Index: oln/core/concept/image_identity.hh
--- oln/core/concept/image_identity.hh (revision 0)
+++ oln/core/concept/image_identity.hh (revision 0)
@@ -0,0 +1,292 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_CONCEPT_IMAGE_IDENTITY_HH
+# define OLN_CORE_CONCEPT_IMAGE_IDENTITY_HH
+
+# include <oln/core/concept/image.hh>
+
+
+
+namespace oln
+{
+
+ namespace behavior { struct identity; }
+
+
+ namespace automatic
+ {
+
+
+ /// Concept-class "Image".
+
+ template <typename Exact>
+ struct set_impl< Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(psite);
+ stc_typename(rvalue);
+ stc_typename(box);
+ stc_typename(pset);
+
+ bool impl_owns_(const psite& p) const;
+ rvalue impl_read(const psite& p) const;
+ box impl_bbox() const;
+ pset impl_points() const;
+ };
+
+
+ /// Concept-class "Image_with_Nbh".
+
+ template <typename Exact>
+ struct set_impl< Image_with_Nbh, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(nbh);
+ nbh impl_nbhood() const;
+ };
+
+
+ /// Concept-class "Mutable_Image".
+
+ template <typename Exact>
+ struct set_impl< Mutable_Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(psite);
+ stc_typename(lvalue);
+ lvalue impl_read_write(const psite& p);
+ };
+
+
+ /// Concept-class "Fast_Image".
+
+ template <typename Exact>
+ struct set_impl< Fast_Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(rvalue);
+ stc_typename(lvalue);
+ stc_typename(index);
+
+ rvalue impl_index_read(index i) const;
+ lvalue impl_index_read_write(index i);
+ std::size_t impl_npoints() const;
+ };
+
+
+ /// Concept-class "Point_Wise_Accessible_Image".
+
+ template <typename Exact>
+ struct set_impl< Point_Wise_Accessible_Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(point);
+ bool impl_has(const point& p) const;
+ };
+
+
+ /// Concept-class "Value_Wise_Accessible_Image".
+
+ template <typename Exact>
+ struct set_impl< Value_Wise_Accessible_Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(vsite);
+ stc_typename(rvaluep);
+ rvaluep impl_value_read(const vsite& v) const;
+ };
+
+
+ /// Concept-class "Value_Wise_Mutable_Image".
+
+ template <typename Exact>
+ struct set_impl< Value_Wise_Mutable_Image, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ stc_typename(vsite);
+ stc_typename(lvaluep);
+ lvaluep impl_value_read_write(const vsite& v);
+ };
+
+
+ /// Concept-class "Image_1D".
+
+ template <typename Exact>
+ struct set_impl< Image_1D, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ };
+
+
+ /// Concept-class "Image_2D".
+
+ template <typename Exact>
+ struct set_impl< Image_2D, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ };
+
+
+ /// Concept-class "Image_3D".
+
+ template <typename Exact>
+ struct set_impl< Image_3D, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ };
+
+
+ /// Concept-class "Point_Wise_Accessible_Image_2D".
+
+ template <typename Exact>
+ struct set_impl< Point_Wise_Accessible_Image_2D, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ // default code is provided in Point_Wise_Accessible_Image_2D<Exact>
+ };
+
+
+ /// Concept-class "Point_Wise_Mutable_Image_2D".
+
+ template <typename Exact>
+ struct set_impl< Point_Wise_Mutable_Image_2D, behavior::identity, Exact > : public virtual Any<Exact>
+ {
+ // default code is provided in Point_Wise_Mutable_Image_2D<Exact>
+ };
+
+
+
+
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+
+ /// Concept-class "Image".
+
+ template <typename Exact>
+ bool
+ set_impl< Image, behavior::identity, Exact >::impl_owns_(const typename set_impl< Image, behavior::identity, Exact >::psite& p) const
+ {
+ return exact(this)->image().owns_(p);
+ }
+
+ template <typename Exact>
+ typename set_impl< Image, behavior::identity, Exact >::rvalue
+ set_impl< Image, behavior::identity, Exact >::impl_read(const typename set_impl< Image, behavior::identity, Exact >::psite& p) const
+ {
+ return exact(this)->image()(p);
+ }
+
+ template <typename Exact>
+ typename set_impl< Image, behavior::identity, Exact >::box
+ set_impl< Image, behavior::identity, Exact >::impl_bbox() const
+ {
+ return exact(this)->image().bbox();
+ }
+
+ template <typename Exact>
+ typename set_impl< Image, behavior::identity, Exact >::pset
+ set_impl< Image, behavior::identity, Exact >::impl_points() const
+ {
+ return exact(this)->image().points();
+ }
+
+
+ /// Concept-class "Image_with_Nbh".
+
+ template <typename Exact>
+ typename set_impl< Image_with_Nbh, behavior::identity, Exact >::nbh
+ set_impl< Image_with_Nbh, behavior::identity, Exact >::impl_nbhood() const
+ {
+ return exact(this)->image().nbhood();
+ }
+
+
+ /// Concept-class "Mutable_Image".
+
+ template <typename Exact>
+ typename set_impl< Mutable_Image, behavior::identity, Exact >::lvalue
+ set_impl< Mutable_Image, behavior::identity, Exact >::impl_read_write(const typename set_impl< Mutable_Image, behavior::identity, Exact >::psite& p)
+ {
+ return exact(this)->image().operator()(p);
+ }
+
+
+ /// Concept-class "Fast_Image".
+
+ template <typename Exact>
+ typename set_impl< Fast_Image, behavior::identity, Exact >::rvalue
+ set_impl< Fast_Image, behavior::identity, Exact >::impl_index_read(typename set_impl< Fast_Image, behavior::identity, Exact >::index i) const
+ {
+ return exact(this)->image()[i];
+ }
+
+ template <typename Exact>
+ typename set_impl< Fast_Image, behavior::identity, Exact >::lvalue
+ set_impl< Fast_Image, behavior::identity, Exact >::impl_index_read_write(typename set_impl< Fast_Image, behavior::identity, Exact >::index i)
+ {
+ return exact(this)->image()[i];
+ }
+
+ template <typename Exact>
+ std::size_t
+ set_impl< Fast_Image, behavior::identity, Exact >::impl_npoints() const
+ {
+ return exact(this)->image().npoints();
+ }
+
+
+ /// Concept-class "Point_Wise_Accessible_Image".
+
+ template <typename Exact>
+ bool
+ set_impl< Point_Wise_Accessible_Image, behavior::identity, Exact >::impl_has(const typename set_impl< Point_Wise_Accessible_Image, behavior::identity, Exact >::point& p) const
+ {
+ return exact(this)->image().has(p);
+ }
+
+
+ /// Concept-class "Value_Wise_Accessible_Image".
+
+ template <typename Exact>
+ typename set_impl< Value_Wise_Accessible_Image, behavior::identity, Exact >::rvaluep
+ set_impl< Value_Wise_Accessible_Image, behavior::identity, Exact >::impl_value_read(const typename set_impl< Value_Wise_Accessible_Image, behavior::identity, Exact >::vsite& v) const
+ {
+ return exact(this)->image().value(v);
+ }
+
+
+ /// Concept-class "Value_Wise_Mutable_Image".
+
+ template <typename Exact>
+ typename set_impl< Value_Wise_Mutable_Image, behavior::identity, Exact >::lvaluep
+ set_impl< Value_Wise_Mutable_Image, behavior::identity, Exact >::impl_value_read_write(const typename set_impl< Value_Wise_Mutable_Image, behavior::identity, Exact >::vsite& v)
+ {
+ return exact(this)->image().value(v);
+ }
+
+
+# endif
+
+
+ } // end of namespace oln::automatic
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_CONCEPT_IMAGE_IDENTITY_HH
Index: oln/core/equipment.hh
--- oln/core/equipment.hh (revision 858)
+++ oln/core/equipment.hh (working copy)
@@ -66,6 +66,7 @@
stc_decl_associated_type( index );
// l
+ stc_decl_associated_type( left );
stc_decl_associated_type( lvalue );
stc_decl_associated_type( lvaluep );
@@ -75,6 +76,7 @@
stc_decl_associated_type( niter );
// o
+ stc_decl_associated_type( oper );
stc_decl_associated_type( output );
// p
@@ -87,12 +89,16 @@
stc_decl_associated_type( qiter );
// r
+ stc_decl_associated_type( right );
stc_decl_associated_type( rvalue );
stc_decl_associated_type( rvaluep );
// s
stc_decl_associated_type( std_container );
+ // t
+ stc_decl_associated_type( tag );
+
// v
stc_decl_associated_type( value );
stc_decl_associated_type( vsite );
Index: oln/core/gen/op.hh
--- oln/core/gen/op.hh (revision 0)
+++ oln/core/gen/op.hh (revision 0)
@@ -0,0 +1,162 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_GEN_OP_HH
+# define OLN_CORE_GEN_OP_HH
+
+# include <oln/core/internal/special_op.hh>
+
+
+
+// Macro.
+
+# define oln_decl_op_(OpName, Lconcept, OpSym, Rconcept) \
+ \
+ template <typename L, typename R> \
+ op_<L, OpName, R> \
+ operator OpSym (Lconcept<L>& lhs, Rconcept<R>& rhs) \
+ { \
+ op_<L, OpName, R> tmp(exact(lhs), exact(rhs)); \
+ return tmp; \
+ } \
+ \
+ template <typename L, typename R> \
+ op_<L, OpName, const R> \
+ operator OpSym (Lconcept<L>& lhs, const Rconcept<R>& rhs) \
+ { \
+ op_<L, OpName, const R> tmp(exact(lhs), exact(rhs)); \
+ return tmp; \
+ } \
+ \
+ template <typename L, typename R> \
+ op_<const L, OpName, R> \
+ operator OpSym (const Lconcept<L>& lhs, Rconcept<R>& rhs) \
+ { \
+ op_<const L, OpName, R> tmp(exact(lhs), exact(rhs)); \
+ return tmp; \
+ } \
+ \
+ template <typename L, typename R> \
+ op_<const L, OpName, const R> \
+ operator OpSym (const Lconcept<L>& lhs, const Rconcept<R>& rhs) \
+ { \
+ op_<const L, OpName, const R> tmp(exact(lhs), exact(rhs)); \
+ return tmp; \
+ } \
+ \
+ struct e_n_d___w_i_t_h___a___s_e_m_i___c_o_l_u_m_n
+
+
+# define oln_decl_op_plus(Lconcept, Rconcept) oln_decl_op_(plus, Lconcept, +, Rconcept)
+# define oln_decl_op_such_as(Lconcept, Rconcept) oln_decl_op_(such_as, Lconcept, |, Rconcept)
+// ...
+
+
+
+
+# define oln_category_of_(Type) typename oln::internal::category_of_<Type>::ret
+
+
+namespace oln
+{
+
+
+ namespace internal
+ {
+ template <typename T>
+ struct category_of_
+ {
+ typedef stc_type(T, category) ret;
+ };
+
+ // ...
+
+ } // end of namespace oln::internal
+
+
+
+ /// \{
+ /// Operator Names.
+
+ struct plus;
+ struct such_as;
+
+ /// \}
+
+
+
+ // Fwd decl.
+ template <typename L, typename OpName, typename R> class op_;
+
+
+ /// Virtual types.
+ template <typename L, typename OpName, typename R>
+ struct vtypes< op_<L, OpName, R> >
+ {
+ };
+
+
+ /// Super type.
+
+# define super \
+ internal::special_op_< oln_category_of_(L), L, OpName, oln_category_of_(R), R >
+
+ template <typename L, typename OpName, typename R>
+ struct super_trait_< op_<L, OpName, R> >
+ {
+ typedef super ret;
+ };
+
+
+ /// Class for result of "L op R".
+
+ template <typename L, typename OpName, typename R>
+ class op_ : public super
+ {
+ public:
+ op_(L& l, R& r);
+
+ }; // end of op_<L, OpName, R>
+
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+ template <typename L, typename OpName, typename R>
+ op_<L, OpName, R>::op_(L& l, R& r)
+ : super (l, r)
+ {
+ }
+
+# endif
+
+# undef super
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_GEN_OP_HH
Index: oln/core/gen/single_value_image.hh
--- oln/core/gen/single_value_image.hh (revision 858)
+++ oln/core/gen/single_value_image.hh (working copy)
@@ -54,11 +54,6 @@
typedef const T& rvalue;
typedef internal::pair<Ps, T> data;
-
- // FIXME: To be defined...
- typedef mlc::none qiter;
- typedef mlc::none fwd_qiter;
- typedef mlc::none bkd_qiter;
};
Index: oln/core/internal/neighborhood_base.hh
--- oln/core/internal/neighborhood_base.hh (revision 858)
+++ oln/core/internal/neighborhood_base.hh (working copy)
@@ -56,6 +56,7 @@
typedef stc_deferred(point) point__;
typedef stc::final< stc_type(point__, grid) > grid;
+ typedef stc::final< stc::is<Neighborhood> > category;
};
@@ -65,7 +66,7 @@
/// Base class for implementation of neighborhoods class.
template <typename Exact>
- class neighborhood_base_ : public Neighborhood< neighb_<Exact> >
+ class neighborhood_base_ : public Neighborhood<Exact>
{
protected:
neighborhood_base_();
Index: oln/core/internal/op_image_plus_nbh.hh
--- oln/core/internal/op_image_plus_nbh.hh (revision 0)
+++ oln/core/internal/op_image_plus_nbh.hh (revision 0)
@@ -0,0 +1,102 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_INTERNAL_OP_IMAGE_PLUS_NBH_HH
+# define OLN_CORE_INTERNAL_OP_IMAGE_PLUS_NBH_HH
+
+# include <oln/core/gen/op.hh>
+# include <oln/core/gen/dpoints_piter.hh>
+# include <oln/core/internal/image_base.hh>
+
+
+namespace oln
+{
+
+ /// Fwd decls.
+ template <typename Exact> struct Image;
+ template <typename Exact> struct Neighborhood;
+
+
+ /// Super type.
+ template <typename I, typename N>
+ struct super_trait_< internal::special_op_<stc::is<Image>, I, plus, stc::is<Neighborhood>, N> >
+ {
+ typedef internal::image_extension_< op_<I, plus, N> > ret;
+ };
+
+
+ /// Virtual types.
+ template <typename I, typename N>
+ struct vtypes< internal::special_op_<stc::is<Image>, I, plus, stc::is<Neighborhood>, N> >
+ {
+ typedef op_<I, plus, N> Exact;
+ typedef stc_type(I, point) point__;
+
+ typedef I delegatee;
+ typedef internal::pair<I,N> data;
+
+ typedef N nbh;
+ typedef dpoints_fwd_piter_<point__> fwd_niter;
+ typedef dpoints_bkd_piter_<point__> bkd_niter;
+ };
+
+
+ namespace internal
+ {
+
+ /// Implementation class the result of "Image I + Neighborhood N".
+
+ template <typename I, typename N>
+ class special_op_< stc::is<Image>, I, plus, stc::is<Neighborhood>, N >
+ :
+ public internal::image_extension_< op_<I, plus, N> >
+ {
+ typedef internal::image_extension_< op_<I, plus, N> > super;
+ public:
+ stc_using(nbh);
+ stc_using(data);
+ stc_using(delegatee);
+
+ delegatee& impl_image() { assert(this->has_data()); return this->data_->value1; }
+ const delegatee& impl_image() const { assert(this->has_data()); return this->data_->value1; }
+
+ nbh impl_nbhood() const { assert(this->has_data()); return this->data_->value2; }
+
+ protected:
+ special_op_(I& ima, N& n)
+ {
+ this->data_ = new data(ima, n);
+ }
+ };
+
+
+ } // end of namespace oln::internal
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_INTERNAL_OP_IMAGE_PLUS_NBH_HH
Index: oln/core/internal/image_base.hh
--- oln/core/internal/image_base.hh (revision 858)
+++ oln/core/internal/image_base.hh (working copy)
@@ -29,10 +29,11 @@
# define OLN_CORE_INTERNAL_IMAGE_BASE_HH
# include <oln/core/internal/image_selectors.hh>
+# include <oln/core/concept/image_identity.hh>
+
# include <oln/core/internal/tracked_ptr.hh>
# include <oln/core/internal/utils.hh>
# include <oln/core/gen/box.hh>
-# include <oln/core/gen/image_pset_piter.hh>
@@ -50,6 +51,7 @@
template <typename Exact> struct image_morpher_;
template <typename Exact> struct single_image_morpher_;
+ template <typename Exact> struct image_extension_;
template <typename Exact> struct multiple_image_morpher_;
}
@@ -87,6 +89,12 @@
};
template <typename Exact>
+ struct super_trait_< internal::image_extension_<Exact> >
+ {
+ typedef internal::single_image_morpher_<Exact> ret;
+ };
+
+ template <typename Exact>
struct super_trait_< internal::multiple_image_morpher_<Exact> >
{
typedef internal::image_morpher_<Exact> ret;
@@ -122,6 +130,7 @@
typedef stc::final< stc::is<Image> > category;
typedef stc::final< box_<point__> > box;
typedef stc::final< stc_type(point__, grid) > grid;
+ typedef stc::final< stc_type(point__, dpoint) > dpoint;
typedef stc::final< typename pset__::fwd_piter > fwd_piter;
typedef stc::final< typename pset__::bkd_piter > bkd_piter;
typedef fwd_piter piter;
@@ -145,6 +154,7 @@
struct vtypes< internal::image_morpher_<Exact> >
{
typedef stc::abstract delegatee;
+ typedef stc::abstract behavior;
typedef stc::not_delegated data;
};
@@ -154,6 +164,12 @@
};
template <typename Exact>
+ struct vtypes< internal::image_extension_<Exact> >
+ {
+ typedef stc::final< behavior::identity > behavior;
+ };
+
+ template <typename Exact>
struct vtypes< internal::multiple_image_morpher_<Exact> >
{
typedef stc::abstract n;
@@ -239,6 +255,16 @@
};
+ /// image_extension_<Exact>
+
+ template <typename Exact>
+ class image_extension_ : public single_image_morpher_<Exact>
+ {
+ protected:
+ image_extension_();
+ };
+
+
/// multiple_image_morpher_<Exact>
template <typename Exact>
@@ -320,6 +346,13 @@
{
}
+ // image_extension_<Exact>
+
+ template <typename Exact>
+ image_extension_<Exact>::image_extension_()
+ {
+ }
+
// multiple_image_morpher_<Exact>
template <typename Exact>
Index: oln/core/internal/special_op.hh
--- oln/core/internal/special_op.hh (revision 0)
+++ oln/core/internal/special_op.hh (revision 0)
@@ -0,0 +1,76 @@
+// Copyright (C) 2007 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, 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 OLN_CORE_INTERNAL_SPECIAL_OP_HH
+# define OLN_CORE_INTERNAL_SPECIAL_OP_HH
+
+# include <oln/core/internal/image_base.hh>
+
+
+namespace oln
+{
+
+
+ // Fwd decls.
+ namespace internal {
+ template <typename Lcat, typename L, typename OpName, typename Rcat, typename R>
+ class special_op_;
+ }
+ template <typename L, typename OpName, typename R> class op_;
+
+
+ /// Virtual types.
+ template <typename Lcat, typename L, typename OpName, typename Rcat, typename R>
+ struct vtypes< internal::special_op_<Lcat, L, OpName, Rcat, R> >
+ /* undefined; to be specialized... */
+ ;
+
+
+ /// Super type.
+ template <typename Lcat, typename L, typename OpName, typename Rcat, typename R>
+ struct super_trait_< internal::special_op_<Lcat, L, OpName, Rcat, R> >
+ /* undefined; to be specialized... */
+ ;
+
+
+ namespace internal
+ {
+
+ /// Class for result of "L op R".
+
+ template <typename Lcat, typename L, typename OpName, typename Rcat, typename R>
+ class special_op_;
+ /* undefined; to be specialized... */
+
+
+ } // end of namespace oln::internal
+
+
+} // end of namespace oln
+
+
+#endif // ! OLN_CORE_INTERNAL_SPECIAL_OP_HH
Index: oln/stc/scoop.hxx
--- oln/stc/scoop.hxx (revision 858)
+++ oln/stc/scoop.hxx (working copy)
@@ -56,6 +56,9 @@
struct no_delegatee_declared_;
+ template <typename T>
+ struct super_trait_not_defined_for_;
+
} /* end of namespace ERROR */
@@ -69,6 +72,11 @@
{
};
+template <typename from_type>
+struct vtypes <const from_type> : public vtypes <from_type>
+{
+};
+
template <typename from_type, typename type>
struct single_vtype
{
@@ -77,17 +85,30 @@
+/* super_trait_ */
template <typename from_type>
struct super_trait_;
+template <typename from_type>
+struct super_trait_ <const from_type> : super_trait_<from_type>
+{
+};
+
template <template <class> class abstraction, typename Exact>
struct super_trait_< abstraction<Exact> >
{
typedef mlc::none ret;
};
+template <typename from_type>
+struct super_trait_ :
+ mlc::abort_< ERROR::super_trait_not_defined_for_<from_type> >
+{
+ typedef mlc::none ret;
+};
+