Commit be241bbb authored by Roland Levillain's avatar Roland Levillain
Browse files

Plug image_entry's inheritance to the right image dimension

	abstraction according to the grid type of the exact image type.

	* oln/core/abstract/image_entry.hh: Add switch/case equipment in
	the oln namespace.
	* oln/core/abstract/image_dimension.hh
	(grid_dim_tag)
	(case_<grid_dim_tag, grid_type, 1>)
	(case_<grid_dim_tag, grid_type, 2>)
	(case_<grid_dim_tag, grid_type, 3>)
	(default_case_<grid_dim_tag, grid_type>): New Metalic switch/case
	on grid type, returning the corresponding image dimension type.
	(set_entry_node<I, oln::abstract::dimension_tag>): Use this Metalic
	switch/case to choose the dimension abstraction in the inheritance
	tree.
	* oln/core/abstract/image.hh (vtypes): Don't define
	image_dimension_type as an internal vtype, instead...
	* oln/core/abstract/image_dimension.hh
	(oln::ext_vtype<category::image, abstract::image<I>,
	typedef_::image_dimension_type>): ...define it externally, using
	the switch used inheritance-plugging mechanism based on the grid
	type.
	* tests/image_entry.cc (oln): Adjust.
	Check my::image's virtual types.
	Print my::image's vtypes on the standard output.


git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@471 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent ec13303d
2006-04-25 Roland Levillain <roland@lrde.epita.fr>
Plug image_entry's inheritance to the right image dimension
abstraction according to the grid type of the exact image type.
* oln/core/abstract/image_entry.hh: Add switch/case equipment in
the oln namespace.
* oln/core/abstract/image_dimension.hh
(grid_dim_tag)
(case_<grid_dim_tag, grid_type, 1>)
(case_<grid_dim_tag, grid_type, 2>)
(case_<grid_dim_tag, grid_type, 3>)
(default_case_<grid_dim_tag, grid_type>): New Metalic switch/case
on grid type, returning the corresponding image dimension type.
(set_entry_node<I, oln::abstract::dimension_tag>): Use this Metalic
switch/case to choose the dimension abstraction in the inheritance
tree.
* oln/core/abstract/image.hh (vtypes): Don't define
image_dimension_type as an internal vtype, instead...
* oln/core/abstract/image_dimension.hh
(oln::ext_vtype<category::image, abstract::image<I>,
typedef_::image_dimension_type>): ...define it externally, using
the switch used inheritance-plugging mechanism based on the grid
type.
* tests/image_entry.cc (oln): Adjust.
Check my::image's virtual types.
Print my::image's vtypes on the standard output.
2006-04-25 Roland Levillain <roland@lrde.epita.fr>
Add grids.
......
......@@ -87,14 +87,14 @@ namespace oln {
// typedef is_a<abstract::readonly_image> image_constness_type;
// typedef mlc::undefined image_rawness_type;
// --------------------------------------------------------------------
typedef mlc::undefined image_dimension_type;
};
/// Packing of the virtual types of any image class.
template <typename I>
struct packed_vtypes<category::image, I>
{
typedef oln_type_of(I, grid) grid_type;
// Internally defined virtual types.
typedef oln_type_of(I, grid) grid_type;
// --------------------------------------------------------------------
// FIXME: To be enabled later.
......@@ -122,10 +122,11 @@ namespace oln {
// typedef oln_type_of(I, image_constness) image_constness_type;
// typedef oln_type_of(I, image_rawness) image_rawness_type;
// --------------------------------------------------------------------
typedef oln_type_of(I, image_dimension) image_dimension_type;
//...
// Defined externally virtual types.
typedef oln_type_of(I, image_dimension) image_dimension_type;
/// Pretty-printing.
static void echo(std::ostream& ostr)
{
ostr
......
......@@ -82,24 +82,88 @@ namespace oln {
image3d() {}
};
} // end of namespace oln::abstract
/*-------------------.
| Dimension switch. |
`-------------------*/
/// Forward declarations.
/// \{
class grid1d;
class grid2d;
class grid3d;
/// \}
/// Case tag for the dimension.
struct grid_dim_tag;
/// Switch on on the grid dimension.
/// \{
template <typename grid_type>
struct case_<grid_dim_tag, grid_type, 1> :
// Test.
public mlc::where_< mlc_eq(grid_type, oln::grid1d) >
{
// Super class if test succeeds.
typedef stc::is_a<abstract::image1d> ret;
};
template <typename grid_type>
struct case_<grid_dim_tag, grid_type, 2> :
// Test.
public mlc::where_< mlc_eq(grid_type, oln::grid2d) >
{
// Super class if test succeeds.
typedef stc::is_a<abstract::image2d> ret;
};
template <typename grid_type>
struct case_<grid_dim_tag, grid_type, 3> :
// Test.
public mlc::where_< mlc_eq(grid_type, oln::grid3d) >
{
// Super class if test succeeds.
typedef stc::is_a<abstract::image3d> ret;
};
/// Abort when grid_type is not handled by the previous cases.
template <typename grid_type>
struct default_case_<grid_dim_tag, grid_type>
{
typedef mlc::abort_<grid_dim_tag> ret;
};
/// \}
} // end of namespace oln
// Register the dimension switch for oln::abstract::image_entry.
namespace stc
{
template <typename E>
struct set_entry_node<E, oln::abstract::dimension_tag> :
// FIXME: Don't use the abstraction as a property, but the
// corresponding grid instead.
public oln_type_of_(E, image_dimension)
::template instantiated_with<E>::ret
template <typename I>
struct set_entry_node<I, oln::abstract::dimension_tag> :
public oln::switch_< oln::grid_dim_tag, oln_type_of(I, grid) >::ret
::template instantiated_with<I>::ret
{
};
}
} // end of namespace stc
namespace oln
{
/// An external type associated to my::B.
template <typename I>
struct ext_vtype< category::image,
abstract::image<I>,
// FIXME: Get rid of this typedef_:: qualifier.
typedef_::image_dimension_type >
{
// Use the same switch as the one use in the inheritance-plugging
// mechanism above.
typedef typename oln::switch_< oln::grid_dim_tag,
oln_type_of(I, grid) >::ret ret;
};
}
#endif // ! OLENA_CORE_ABSTRACT_IMAGE_DIMENSION_HH
......@@ -28,8 +28,9 @@
#ifndef OLENA_CORE_ABSTRACT_IMAGE_ENTRY_HH
# define OLENA_CORE_ABSTRACT_IMAGE_ENTRY_HH
# include <oln/core/abstract/image.hh>
# include <mlc/case.hh>
# include <stc/entry.hh>
# include <oln/core/abstract/image.hh>
namespace oln
{
......@@ -75,4 +76,8 @@ namespace oln
} // end of namespace oln
// Add switch/case equipment in the oln namespace.
mlc_case_equipment_for_namespace(oln);
#endif // ! OLENA_CORE_ABSTRACT_IMAGE_ENTRY_HH
......@@ -46,12 +46,10 @@ namespace oln
template<>
struct vtypes<category::image, my::image>
{
// FIXME: Don't use the abstraction as a property, but the
// corresponding grid instead. The switch for image_dimension
// (above image_entry) should plug the inheritance relationship to
// the right image_dimension class using the sole grid information
// (the grid can be seen here as a ``tag'').
typedef stc::is_a<abstract::image1d> image_dimension_type;
// The switch for image_dimension (above image_entry) plugs the
// inheritance relation to the right abstract::image_dimension
// class using the sole grid information (the grid can be seen
// here as a ``tag'').
typedef oln::grid1d grid_type;
};
}
......@@ -62,6 +60,9 @@ namespace my
class image : public oln::set_super_type<my::image>::ret
{
typedef image self_type;
// An internal vtype.
typedef oln_type_of_(self_type, grid) grid_type;
// An external vtype.
typedef oln_type_of_(self_type, image_dimension) image_dimension_type;
};
}
......@@ -69,7 +70,17 @@ namespace my
int
main()
{
// Instantiate it, and check its dimension.
// Check its internally defined vtype.
mlc::assert_< mlc_eq(my::image::grid_type, oln::grid1d) >::check();
// Check its externally defined vtype.
mlc::assert_< mlc_eq( my::image::image_dimension_type,
stc::is_a<oln::abstract::image1d> ) >::check();
// Check its image dimension abstraction.
mlc::assert_< mlc_is_a_(my::image, oln::abstract::image1d) >::check();
// Ensure we can instantiate it.
my::image i;
mlc::assert_< mlc_is_a_(my::image::image, oln::abstract::image1d) >::check();
// Print my::image's vtypes.
// FIXME: To be removed in the final version.
oln::packed_vtypes<oln::category::image, my::image>::echo (std::cout);
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment