574: Add some abstract image sub-hierarchies.

2006-09-26 Thierry GERAUD <theo@tegucigalpa.lrde.epita.fr> Add some abstract image sub-hierarchies. * oln/automatic/image_being_mutable.hh: New. * oln/core/abstract/image/mutability/hierarchy.hh: New. * oln/core/abstract/image/accessibility/hierarchy.hh: New. * oln/core/abstract/image/bbox/hierarchy.hh: New. * oln/core/typedefs.hh (lvalue_type, is_mutable_type): New. * oln/core/macros.hh (oln_deduce_type_of): New. * oln/core/abstract/image.hh: Cosmetics. * oln/core/abstract/image/hierarchies.hh (image_hierarchy_wrt_bbox): New. (image_hierarchy_wrt_accessibility): New. (image_hierarchy_wrt_mutability): New. (include): Update. * oln/core/abstract/image/neighborhood/hierarchy.hh (decl): New. (~image_having_neighborhood): New. Index: oln/automatic/image_being_mutable.hh =================================================================== --- oln/automatic/image_being_mutable.hh (revision 0) +++ oln/automatic/image_being_mutable.hh (revision 0) @@ -0,0 +1,69 @@ +// 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_MUTABLE_HH +# define OLENA_AUTOMATIC_IMAGE_BEING_MUTABLE_HH + +# include <oln/core/typedefs.hh> +# include <oln/morpher/tags.hh> + + +namespace oln +{ + // Forward declaration. + namespace abstract + { + template <typename E> class image_being_mutable; + + } // end of namespace oln::abstract + + + namespace automatic + { + /// Implementation corresponding to the interface + /// oln::abstract::image_being_mutable for an identity morpher. + template <typename E> + class impl< abstract::image_being_mutable, morpher::tag::identity, E> : + public virtual stc::any__simple<E> + { + private: + typedef oln_type_of(E, lvalue) lvalue_t; + typedef oln_type_of(E, psite) psite_t; + + public: + /// Accessor delegation. + lvalue_t& impl_op_readwrite(const psite_t& p) const + { + return this->exact().delegate().operator()(p); + } + }; + + } // end of namespace oln::automatic + +} // end of namespace oln + +#endif // ! OLENA_AUTOMATIC_IMAGE_BEING_MUTABLE_HH Index: oln/core/typedefs.hh =================================================================== --- oln/core/typedefs.hh (revision 573) +++ oln/core/typedefs.hh (working copy) @@ -120,6 +120,8 @@ // -------------------------------------------------------------------- mlc_decl_typedef(value_type); mlc_decl_typedef(rvalue_type); + mlc_decl_typedef(lvalue_type); + mlc_decl_typedef(is_mutable_type); // -------------------------------------------------------------------- // FIXME: To be enabled later. Index: oln/core/macros.hh =================================================================== --- oln/core/macros.hh (revision 573) +++ oln/core/macros.hh (working copy) @@ -40,6 +40,14 @@ # define oln_type_of(OlnType, Alias) \ stc_type_of(oln, void, OlnType, Alias) + +/// FIXME: Temporary macro to be able to perform "oln_type_of(oln_type_of(A, B), C)". +# define oln_deduce_type_of(OlnType, Alias1, Alias2) \ +typename oln::type_of_<void, \ + typename oln::type_of_<void, OlnType, oln::typedef_::Alias1##_type >::ret, \ + oln::typedef_::Alias2##_type >::ret + + /// \def oln_type_of(OlnType, Alias) /// /// Macro to retrieve an associated type \a Alias from the exact type of Index: oln/core/abstract/image.hh =================================================================== --- oln/core/abstract/image.hh (revision 573) +++ oln/core/abstract/image.hh (working copy) @@ -55,9 +55,7 @@ template <typename E> struct image : public virtual stc::any__simple<E>, public virtual oln::type, - public automatic::impl< image, - oln_type_of(E, morpher), - E > + public automatic::impl< image, oln_type_of(E, morpher), E > { public: Index: oln/core/abstract/image/mutability/hierarchy.hh =================================================================== --- oln/core/abstract/image/mutability/hierarchy.hh (revision 0) +++ oln/core/abstract/image/mutability/hierarchy.hh (revision 0) @@ -0,0 +1,102 @@ +// 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_CORE_ABSTRACT_IMAGE_MUTABILITY_HIERARCHY_HH +# define OLENA_CORE_ABSTRACT_IMAGE_MUTABILITY_HIERARCHY_HH + +# include <oln/core/abstract/image.hh> + +// Automatically-inherited implementations. +# include <oln/automatic/image_being_mutable.hh> + + + +namespace oln +{ + + /*-------------------------. + | Dimension abstractions. | + `-------------------------*/ + + namespace abstract + { + + /// Image being mutable. + template <typename E> + struct image_being_mutable : + public virtual image<E>, + public automatic::impl< image_being_mutable, oln_type_of(E, morpher), E > + { + private: + + typedef oln_type_of(E, lvalue) lvalue_t; + typedef oln_type_of(E, psite) psite_t; + + public: + + struct decl { + stc_virtual_typedef(lvalue); + }; + + /*! \brief Gives writable access to the value stored at \a p in + ** the current image. + */ + + lvalue_t& operator()(const psite_t& p) const + { + return this->exact().impl_op_readwrite(p); + } + + protected: + + /// Constructor (protected, empty). + image_being_mutable() {} + + /// Destructor (protected). + image_being_mutable() { decl(); } + + }; + + } // end of namespace oln::abstract + + + /*-------------------. + | Dimension switch. | + `-------------------*/ + + /// With mutability. + template <typename E> + struct case_< image_hierarchy_wrt_mutability, E, 1 > : + where_< mlc::eq_< oln_type_of(E, is_mutable), mlc::true_ > > + { + typedef abstract::image_being_mutable<E> ret; + }; + +} // end of namespace oln + + +#endif // ! OLENA_CORE_ABSTRACT_IMAGE_MUTABILITY_HIERARCHY_HH Index: oln/core/abstract/image/hierarchies.hh =================================================================== --- oln/core/abstract/image/hierarchies.hh (revision 573) +++ oln/core/abstract/image/hierarchies.hh (working copy) @@ -37,11 +37,14 @@ typedef hierarchy<abstract::image, 1> image_hierarchy_wrt_dimension; typedef hierarchy<abstract::image, 2> image_hierarchy_wrt_type; typedef hierarchy<abstract::image, 3> image_hierarchy_wrt_neighborhood; + typedef hierarchy<abstract::image, 4> image_hierarchy_wrt_bbox; + typedef hierarchy<abstract::image, 5> image_hierarchy_wrt_accessibility; + typedef hierarchy<abstract::image, 6> image_hierarchy_wrt_mutability; // FIXME: To be continued. #if 0 - typedef hierarchy<abstract::image, 4> image_hierarchy_wrt_value; - typedef hierarchy<abstract::image, 5> image_hierarchy_wrt_data_retrieval; + typedef hierarchy<abstract::image, 7> image_hierarchy_wrt_value; + typedef hierarchy<abstract::image, 8> image_hierarchy_wrt_data_retrieval; // ... #endif @@ -57,5 +60,14 @@ // Hierarchy 3: topology w.r.t. neighborhood. # include <oln/core/abstract/image/neighborhood/hierarchy.hh> +// Hierarchy 4: topology w.r.t. bounding box. +# include <oln/core/abstract/image/bbox/hierarchy.hh> +// Hierarchy 5: topology w.r.t. accessibility. +# include <oln/core/abstract/image/accessibility/hierarchy.hh> + +// // // Hierarchy 6: topology w.r.t. data mutability. +# include <oln/core/abstract/image/mutability/hierarchy.hh> + + #endif // ! OLENA_CORE_ABSTRACT_IMAGE_HIERARCHIES_HH Index: oln/core/abstract/image/neighborhood/hierarchy.hh =================================================================== --- oln/core/abstract/image/neighborhood/hierarchy.hh (revision 573) +++ oln/core/abstract/image/neighborhood/hierarchy.hh (working copy) @@ -67,14 +67,26 @@ typedef oln_type_of(E, neighborhood) neighborhood_t; public: + + struct decl { + // FIXME: Uncomment. + // stc_virtual_typedef(fwd_niter); + // stc_virtual_typedef(bkd_niter); + }; + neighborhood_t neighborhood() const { return this->topo().neighborhood(); } protected: + /// Constructor (protected, empty). image_having_neighborhood() {} + + /// Destructor (protected). + ~image_having_neighborhood() { decl(); } + }; } // end of namespace oln::abstract Index: oln/core/abstract/image/accessibility/hierarchy.hh =================================================================== --- oln/core/abstract/image/accessibility/hierarchy.hh (revision 0) +++ oln/core/abstract/image/accessibility/hierarchy.hh (revision 0) @@ -0,0 +1,91 @@ +// 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_CORE_ABSTRACT_IMAGE_ACCESSIBILITY_HIERARCHY_HH +# define OLENA_CORE_ABSTRACT_IMAGE_ACCESSIBILITY_HIERARCHY_HH + +# include <oln/core/abstract/image.hh> + + + +namespace oln +{ + + /*-------------------------. + | Dimension abstractions. | + `-------------------------*/ + + namespace abstract + { + + /// Image having a accessibility. + template <typename E> + struct image_being_random_accessible : + public virtual image<E>, + public automatic::impl< image_being_random_accessible, oln_type_of(E, morpher), E > + { + typedef oln_type_of(E, point) point_t; + + public: + + // Concrete method. + bool has(const point_t& p) const + { + return this->topo().has(p); + } + + // Concrete method. + bool has_large(const point_t& p) const + { + return this->topo().has_large(p); + } + + protected: + + /// Constructor (protected, empty). + image_being_random_accessible() {} + }; + + } // end of namespace oln::abstract + + + /*-------------------. + | Dimension switch. | + `-------------------*/ + + /// With accessibility. + template <typename E> + struct case_< image_hierarchy_wrt_accessibility, E, 1 > : + where_< mlc::eq_< oln_deduce_type_of(E, topo, is_random_accessible), mlc::true_ > > + { + typedef abstract::image_being_random_accessible<E> ret; + }; + +} // end of namespace oln + + +#endif // ! OLENA_CORE_ABSTRACT_IMAGE_ACCESSIBILITY_HIERARCHY_HH Index: oln/core/abstract/image/bbox/hierarchy.hh =================================================================== --- oln/core/abstract/image/bbox/hierarchy.hh (revision 0) +++ oln/core/abstract/image/bbox/hierarchy.hh (revision 0) @@ -0,0 +1,105 @@ +// 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_CORE_ABSTRACT_IMAGE_BBOX_HIERARCHY_HH +# define OLENA_CORE_ABSTRACT_IMAGE_BBOX_HIERARCHY_HH + +# include <oln/core/abstract/image.hh> + + +namespace oln +{ + + /*-------------------------. + | Dimension abstractions. | + `-------------------------*/ + + namespace abstract + { + + /// Image having a bbox. + template <typename E> + struct image_having_bbox : + public virtual image<E>, + public automatic::impl< image_having_bbox, oln_type_of(E, morpher), E > + { + private: + typedef oln_type_of(E, bbox) bbox_t; + + public: + + struct decl { + stc_virtual_typedef(bbox); + }; + + // Concrete method. + bbox_t bbox() const + { + return this->topo().bbox(); + } + + protected: + + /// Constructor (protected, empty). + + image_having_bbox() {} + /// Destructor. + virtual ~image_having_bbox() { decl(); } + }; + + } // end of namespace oln::abstract + + + /*-------------------. + | Dimension switch. | + `-------------------*/ + + /// With bbox. + template <typename E> + struct case_< image_hierarchy_wrt_bbox, E, 1 > : + where_< mlc::neq_< oln_deduce_type_of(E, topo, bbox), mlc::not_found > > + { + typedef abstract::image_having_bbox<E> ret; + }; + + + template <typename E> struct image_entry; + + + template <typename E> + struct single_vtype< image_entry<E>, typedef_::bbox_type > + { + private: + typedef oln_type_of(E, topo) topo_t; + public: + typedef oln_type_of(topo_t, bbox) ret; + }; + +} // end of namespace oln + + +#endif // ! OLENA_CORE_ABSTRACT_IMAGE_BBOX_HIERARCHY_HH
participants (1)
-
Thierry GERAUD