2006-09-26 Thierry GERAUD <theo(a)tegucigalpa.lrde.epita.fr>
Add mapimage type and update.
* oln/core/gen/mapimage.hh: New.
* oln/automatic/image_being_random_accessible.hh: New.
* oln/core/abstract/topology_having_bbox.hh
(bbox): New; mutable version.
* oln/core/abstract/image.hh (has): Remove; this method
is now specific to a sub-abstraction.
* oln/core/abstract/image/mutability/hierarchy.hh
(lvalue_t, psite_t): Update.
(~image_being_mutable): Fix typo.
(using): New; it allows disambiguation of overloading
thru inheritance.
* oln/core/abstract/image/accessibility/hierarchy.hh
(has, has_large): Update.
(include): Update.
* oln/core/abstract/image/bbox/hierarchy.hh
(bbox_t, point_t): Update.
(bbox): Change return signature.
(pmin, pmax): New.
* oln/core/gen/topo_bbox.hh (impl_bbox): New.
* oln/Makefile.am (nobase_oln_HEADERS): Update.
Index: oln/automatic/image_being_random_accessible.hh
===================================================================
--- oln/automatic/image_being_random_accessible.hh (revision 0)
+++ oln/automatic/image_being_random_accessible.hh (revision 0)
@@ -0,0 +1,104 @@
+// Copyright (C) 2006 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 OLENA_AUTOMATIC_IMAGE_BEING_RANDOM_ACCESSIBLE_HH
+# define OLENA_AUTOMATIC_IMAGE_BEING_RANDOM_ACCESSIBLE_HH
+
+# include <oln/core/typedefs.hh>
+# include <oln/morpher/tags.hh>
+
+
+namespace oln
+{
+
+ // Forward declaration.
+ namespace abstract
+ {
+ template <typename E> class image_being_random_accessible;
+
+ } // end of namespace oln::abstract
+
+
+ namespace automatic
+ {
+
+ /// Default implementation corresponding to the interface
+ /// oln::abstract::image_being_random_accessible.
+
+ template <typename E, typename M>
+ class impl< abstract::image_being_random_accessible, M, E> :
+ public virtual stc::any__simple<E>
+ {
+ private:
+
+ typedef oln_type_of(E, point) point_t;
+
+ public:
+
+ bool impl_has(const point_t& p) const
+ {
+ return this->exact().topo().has(p);
+ }
+
+ bool impl_has_large(const point_t& p) const
+ {
+ return this->exact().has(p);
+ }
+
+ };
+
+
+ /// Implementation corresponding to the interface
+ /// oln::abstract::image_being_random_accessible for an identity morpher.
+
+ template <typename E>
+ class impl< abstract::image_being_random_accessible, morpher::tag::identity, E>
:
+ public virtual stc::any__simple<E>
+ {
+ private:
+
+ typedef oln_type_of(E, point) point_t;
+
+ public:
+
+ bool impl_has(const point_t& p) const
+ {
+ return this->exact().delegate().has(p);
+ }
+
+ bool impl_has_large(const point_t& p) const
+ {
+ return this->exact().delegate().has_large(p);
+ }
+
+ };
+
+ } // end of namespace oln::automatic
+
+} // end of namespace oln
+
+#endif // ! OLENA_AUTOMATIC_IMAGE_BEING_RANDOM_ACCESSIBLE_HH
Index: oln/core/abstract/topology_having_bbox.hh
===================================================================
--- oln/core/abstract/topology_having_bbox.hh (revision 574)
+++ oln/core/abstract/topology_having_bbox.hh (working copy)
@@ -56,6 +56,12 @@
return this->exact().impl_bbox();
}
+ // abstract
+ bbox_t& bbox()
+ {
+ return this->exact().impl_bbox();
+ }
+
// concrete
operator bbox_t() const
{
Index: oln/core/abstract/image.hh
===================================================================
--- oln/core/abstract/image.hh (revision 574)
+++ oln/core/abstract/image.hh (working copy)
@@ -123,23 +123,6 @@
return this->exact().impl_op_read(p);
}
-
- /*! \brief Test if the point \a p belongs to the current image.
- ** Please note that a point of the outer boundary of an image
- ** does NOT belong to the image.
- **
- ** \return True if p belongs to the current image, false otherwise.
- **
- ** \see hold_large
- */
-
- bool has(const psite_t& p) const
- {
- return this->exact().impl_has(p);
- }
-
- // FIXME: has should *not* be defined for all image classes.
-
protected:
/*! \brief Constructor (protected, empty).
Index: oln/core/abstract/image/mutability/hierarchy.hh
===================================================================
--- oln/core/abstract/image/mutability/hierarchy.hh (revision 574)
+++ oln/core/abstract/image/mutability/hierarchy.hh (working copy)
@@ -53,8 +53,8 @@
{
private:
- typedef oln_type_of(E, lvalue) lvalue_t;
- typedef oln_type_of(E, psite) psite_t;
+ typedef oln_check_type_of(E, lvalue) lvalue_t;
+ typedef oln_check_type_of(E, psite) psite_t;
public:
@@ -66,7 +66,9 @@
** the current image.
*/
- lvalue_t& operator()(const psite_t& p) const
+ using image<E>::operator();
+
+ lvalue_t& operator()(const psite_t& p)
{
return this->exact().impl_op_readwrite(p);
}
@@ -77,7 +79,7 @@
image_being_mutable() {}
/// Destructor (protected).
- image_being_mutable() { decl(); }
+ ~image_being_mutable() { decl(); }
};
Index: oln/core/abstract/image/accessibility/hierarchy.hh
===================================================================
--- oln/core/abstract/image/accessibility/hierarchy.hh (revision 574)
+++ oln/core/abstract/image/accessibility/hierarchy.hh (working copy)
@@ -29,6 +29,7 @@
# define OLENA_CORE_ABSTRACT_IMAGE_ACCESSIBILITY_HIERARCHY_HH
# include <oln/core/abstract/image.hh>
+# include <oln/automatic/image_being_random_accessible.hh>
@@ -52,16 +53,16 @@
public:
- // Concrete method.
+ // Abstract method.
bool has(const point_t& p) const
{
- return this->topo().has(p);
+ return this->exact().impl_has(p);
}
- // Concrete method.
+ // Abstract method.
bool has_large(const point_t& p) const
{
- return this->topo().has_large(p);
+ return this->exact().impl_has_large(p);
}
protected:
Index: oln/core/abstract/image/bbox/hierarchy.hh
===================================================================
--- oln/core/abstract/image/bbox/hierarchy.hh (revision 574)
+++ oln/core/abstract/image/bbox/hierarchy.hh (working copy)
@@ -48,8 +48,10 @@
public automatic::impl< image_having_bbox, oln_type_of(E, morpher), E >
{
private:
- typedef oln_type_of(E, bbox) bbox_t;
+ typedef oln_check_type_of(E, bbox) bbox_t;
+ typedef oln_check_type_of(E, point) point_t;
+
public:
struct decl {
@@ -57,11 +59,23 @@
};
// Concrete method.
- bbox_t bbox() const
+ const bbox_t& bbox() const
{
return this->topo().bbox();
}
+ // Concrete method.
+ const point_t& pmin() const
+ {
+ return this->topo().bbox().pmin();
+ }
+
+ // Concrete method.
+ const point_t& pmax() const
+ {
+ return this->topo().bbox().pmax();
+ }
+
protected:
/// Constructor (protected, empty).
Index: oln/core/gen/topo_bbox.hh
===================================================================
--- oln/core/gen/topo_bbox.hh (revision 574)
+++ oln/core/gen/topo_bbox.hh (working copy)
@@ -64,6 +64,8 @@
template <typename point>
class topo_bbox_ : public topology_entry< topo_bbox_<point> >
{
+ typedef topo_bbox_<point> self_t;
+ typedef topology_entry<self_t> super_t;
typedef bbox_<point> bbox_t;
public:
@@ -82,6 +84,11 @@
return bb_;
}
+ bbox_t& impl_bbox()
+ {
+ return bb_;
+ }
+
bool impl_has(const point& p) const
{
return bb_.has(p);
Index: oln/core/gen/mapimage.hh
===================================================================
--- oln/core/gen/mapimage.hh (revision 0)
+++ oln/core/gen/mapimage.hh (revision 0)
@@ -0,0 +1,123 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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 OLENA_CORE_GEN_MAPIMAGE_HH
+# define OLENA_CORE_GEN_MAPIMAGE_HH
+
+# include <oln/core/image_entry.hh>
+# include <oln/core/gen/topo_bbox.hh>
+# include <map>
+
+
+namespace oln
+{
+
+ // Forward declaration.
+ template <typename point_t, typename value_t> class mapimage;
+
+
+ /// Virtual types associated to oln::mapimage<>.
+ template <typename point_t, typename value_t>
+ struct vtypes< mapimage<point_t, value_t> >
+ {
+ typedef topo_bbox_<point_t> topo_type;
+ typedef oln_type_of(point_t, grid) grid_type;
+
+ typedef point_t point_type;
+
+ typedef fwd_piter_bbox_<topo_type> fwd_piter_type;
+ typedef bkd_piter_bbox_<topo_type> bkd_piter_type;
+
+ typedef value_t value_type;
+
+ typedef mlc::true_ is_mutable_type;
+ typedef value_t lvalue_type;
+
+ typedef void real_type; // FIXME
+ };
+
+
+ /// Super type declaration.
+ template <typename point_t, typename value_t>
+ struct set_super_type< mapimage<point_t, value_t> >
+ {
+ typedef mapimage<point_t, value_t> self_t;
+ typedef image_entry<self_t> ret;
+ };
+
+
+ /// General 2D image class.
+ template <typename point_t, typename value_t>
+ class mapimage : public image_entry< mapimage<point_t, value_t> >
+ {
+ typedef mapimage<point_t, value_t> self_t;
+ typedef oln_type_of(self_t, topo) topo_t;
+
+ public:
+
+ /// Ctor.
+ mapimage(const value_t& val)
+ : val_(val)
+ {
+ }
+
+ const topo_t& impl_topo() const
+ {
+ return topo_;
+ }
+
+ value_t impl_op_read(const point_t& p) const
+ {
+ if (not has(p))
+ return val_;
+ return data_[p];
+ }
+
+ value_t& impl_op_readwrite(const point_t& p)
+ {
+ topo_.bbox().take(p);
+ return data_[p];
+ }
+
+ bool impl_has(const point_t& p) const
+ {
+ return data_.find(p) != data_.end();
+ }
+
+ private:
+
+ value_t val_;
+ mutable topo_t topo_;
+ mutable std::map<point_t, value_t> data_;
+ };
+
+
+} // end of namespace oln
+
+
+#endif // ! OLENA_CORE_GEN_MAPIMAGE_HH
Index: oln/Makefile.am
===================================================================
--- oln/Makefile.am (revision 574)
+++ oln/Makefile.am (working copy)
@@ -5,7 +5,10 @@
nobase_oln_HEADERS = \
\
automatic/image.hh \
+ automatic/image_being_mutable.hh \
+ automatic/image_being_random_accessible.hh \
automatic/image_having_neighborhood.hh \
+ automatic/image_having_neighborhood.hh \
automatic/topology_being_random_accessible.hh \
automatic/topology_having_bbox.hh \
automatic/topology_having_neighborhood.hh \
@@ -30,11 +33,14 @@
core/abstract/entry.hh \
core/abstract/grid.hh \
core/abstract/image.hh \
+ core/abstract/image/accessibility/hierarchy.hh \
+ core/abstract/image/bbox/hierarchy.hh \
core/abstract/image/dimension/1d.hh \
core/abstract/image/dimension/2d.hh \
core/abstract/image/dimension/3d.hh \
core/abstract/image/dimension/hierarchy.hh \
core/abstract/image/hierarchies.hh \
+ core/abstract/image/mutability/hierarchy.hh \
core/abstract/image/neighborhood/hierarchy.hh \
core/abstract/image/type/binary.hh \
core/abstract/image/type/color.hh \
@@ -62,9 +68,13 @@
core/gen/bbox.hh \
core/gen/bbox_bkd_piter.hh \
core/gen/bbox_fwd_piter.hh \
+ core/gen/bkd_piter_bbox.hh \
+ core/gen/fwd_piter_bbox.hh \
+ core/gen/mapimage.hh \
core/gen/neighb.hh \
core/gen/topo_add_nbh.hh \
core/gen/topo_bbox.hh \
+ core/gen/topo_lbbox.hh \
\
core/internal/bbox_bkd_piter.hh \
core/internal/bbox_fwd_piter.hh \