2006-08-30 Thierry GERAUD <theo(a)tegucigalpa.lrde.epita.fr>
Start point hierarchy.
* oln/core/typedefs.hh (oln_type_of): New macro.
(dim_type): New typedef decl.
* oln/core/abstract/point.hh: New.
* oln/core/abstract/point_nd.hh: New.
* oln/core/2d/point2d.hh: New.
\svn ci
Index: oln/core/typedefs.hh
===================================================================
--- oln/core/typedefs.hh (revision 506)
+++ oln/core/typedefs.hh (working copy)
@@ -37,6 +37,18 @@
# include <stc/vtypes.hh>
+
+/*! \macro oln_type_of(OlnType, Alias)
+**
+** Macro to retrieve an associated type \Alias from an oln type
+** \OlnType whose category is not specified.
+*/
+
+# define oln_type_of(OlnType, Alias) \
+stc_type_of(oln, void, OlnType, Alias)
+
+
+
namespace oln
{
@@ -48,6 +60,7 @@
// triggers Metalic's typedef introspection equipment.
stc_equip_namespace_with_vtypes();
+
/*-------.
| Misc. |
`-------*/
@@ -154,6 +167,13 @@
mlc_decl_typedef(coord_type);
+ /*-----------------.
+ | category::point. |
+ `-----------------*/
+
+ mlc_decl_typedef(dim_type);
+
+
/*------------------------------------.
| category::fun1 and category::fun2. |
`------------------------------------*/
Index: oln/core/abstract/point.hh
===================================================================
--- oln/core/abstract/point.hh (revision 0)
+++ oln/core/abstract/point.hh (revision 0)
@@ -0,0 +1,75 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 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_POINT_HH
+# define OLENA_CORE_ABSTRACT_POINT_HH
+
+# include <mlc/assert.hh>
+# include <mlc/cmp.hh>
+
+# include <stc/any.hh>
+# include <stc/vtypes.hh>
+
+# include <oln/core/typedefs.hh>
+
+
+
+
+namespace oln {
+
+ namespace abstract {
+
+ /// Abstract point class.
+ template <typename E>
+ class point : public stc::any__simple<E>
+ {
+ public:
+
+ bool operator==(const abstract::point<E>& rhs) const
+ {
+ return this->exact().impl_eq(rhs.exact());
+ }
+
+ protected:
+ point()
+ {}
+
+ ~point() {
+ mlc::assert_defined_< oln_type_of(E, grid) >::check();
+ mlc::assert_defined_< oln_type_of(E, dpoint) >::check();
+ mlc::assert_defined_< oln_type_of(E, coord) >::check();
+ mlc::assert_defined_< oln_type_of(E, dim) >::check();
+ }
+ };
+
+ } // end of namespace oln::abstract
+
+} // end of namespace oln
+
+
+#endif // ! OLENA_CORE_ABSTRACT_POINT_HH
Index: oln/core/abstract/point_nd.hh
===================================================================
--- oln/core/abstract/point_nd.hh (revision 0)
+++ oln/core/abstract/point_nd.hh (revision 0)
@@ -0,0 +1,82 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 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_POINT_ND_HH
+# define OLENA_CORE_ABSTRACT_POINT_ND_HH
+
+# include <mlc/value.hh>
+# include <xtd/vec.hh>
+# include <oln/core/abstract/point.hh>
+
+
+namespace oln
+{
+
+ namespace abstract
+ {
+
+ template <typename E>
+ class point_nd : public abstract::point<E>
+ {
+ typedef point_nd<E> self;
+ typedef oln_type_of(E, dim) dim;
+ typedef oln_type_of(E, coord) coord;
+
+ public:
+
+ enum { n = mlc_value(dim) };
+
+ bool impl_eq(const self& rhs) const
+ {
+ return v_ == rhs.v_;
+ }
+
+ const coord operator[](unsigned i) const
+ {
+ assert(i < n);
+ return v_[i];
+ }
+
+ coord& operator[](unsigned i)
+ {
+ assert(i < n);
+ return v_[i];
+ }
+
+ protected:
+
+ xtd::vec<n,coord> v_;
+ };
+
+ } // end of namespace oln::abstract
+
+
+} // end of namespace oln
+
+
+#endif // ! OLENA_CORE_ABSTRACT_POINT_ND_HH
Index: oln/core/2d/point2d.hh
===================================================================
--- oln/core/2d/point2d.hh (revision 0)
+++ oln/core/2d/point2d.hh (revision 0)
@@ -0,0 +1,90 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 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_2D_POINT2D_HH
+# define OLENA_CORE_2D_POINT2D_HH
+
+# include <mlc/int.hh>
+# include <oln/core/abstract/point_nd.hh>
+
+
+namespace oln
+{
+
+ // Forward declarations.
+ template <typename C> class point2d_;
+ class dpoint2d;
+ class grid2d;
+
+
+// /// Super type.
+// template<typename C>
+// struct set_super_type< point2d_<C> >
+// {
+// typedef abstract::point< point2d_<C> > ret;
+// };
+
+
+ /// Virtual types associated to oln::abstract::image.
+ template <typename C>
+ struct vtypes_< point2d_<C> >
+ {
+ typedef grid2d grid_type;
+ typedef dpoint2d dpoint_type;
+ typedef C coord_type;
+ typedef mlc::uint_<2> dim_type;
+ };
+
+
+ /// General 2D point class.
+ template <typename C>
+ class point2d_ : public abstract::point_nd< point2d_<C> > // FIXME:
stc_get_super_(point2d_<C>)
+ {
+ typedef point2d_<C> self;
+ typedef abstract::point_nd<self> super; // FIXME: stc_get_super(self)
+ typedef oln_type_of(self, coord) coord;
+
+ using super::v_;
+
+ public:
+
+ const coord row() const { return v_[0]; }
+ coord& row() { return v_[0]; }
+
+ const coord col() const { return v_[1]; }
+ coord& col() { return v_[1]; }
+ };
+
+
+ /// Classical 2D point class.
+ typedef point2d_<int> point2d;
+
+
+} // end of namespace oln
+
+
+#endif // ! OLENA_CORE_2D_POINT2D_HH