Index: ChangeLog
from simon odou <simon(a)lrde.epita.fr>
* oln/core/entry.hh: New.
Just a basic and temporary property heredity system.
* oln/core/abstract/images.hh: Likewise.
* oln/core/abstract/image_with_data.hh: Likewiwe.
* oln/core/abstract/image_identity.hh: Likewiwe.
* oln/core/1d/image1d.hh: Likewiwe.
* oln/core/2d/image2d.hh: Likewiwe.
* oln/core/3d/image3d.hh: Likewiwe.
* tests/core/tests/readonly_image: Likewiwe.
* tests/core/tests/readwrite_image: Likewiwe.
* oln/core/tags.hh: Remove.
Old heredity system.
* oln/makefile.src: Remove tags.hh, add entry.hh.
oln/core/1d/image1d.hh | 8 -
oln/core/2d/image2d.hh | 8 -
oln/core/3d/image3d.hh | 8 -
oln/core/abstract/image_identity.hh | 2
oln/core/abstract/image_with_data.hh | 2
oln/core/abstract/images.hh | 2
oln/core/entry.hh | 64 +++++++++++++++
oln/core/tags.hh | 144 -----------------------------------
oln/makefile.src | 2
tests/core/tests/readonly_image | 4
tests/core/tests/readwrite_image | 5 -
11 files changed, 85 insertions(+), 164 deletions(-)
Index: tests/core/tests/readonly_image
--- tests/core/tests/readonly_image (revision 41)
+++ tests/core/tests/readonly_image (working copy)
@@ -24,8 +24,8 @@
typedef mlc_encoding_type_(value_type) value_storage_type;
typedef array2d<value_storage_type> value_container_type;
- typedef tag::readonly constness_tag;
- typedef tag::dimension2 dimension_tag;
+ typedef prop_of<abstract::readonly_image> image_constness;
+ typedef prop_of<abstract::image2d> image_dimension;
typedef mlc::no_type delegated_type;
};
Index: tests/core/tests/readwrite_image
--- tests/core/tests/readwrite_image (revision 41)
+++ tests/core/tests/readwrite_image (working copy)
@@ -17,6 +17,9 @@
struct props <cat::image, dummy_image> :
public default_props < cat::image >
{
+ typedef prop_of<abstract::readwrite_image> image_constness;
+ typedef prop_of<abstract::image2d> image_dimension;
+
typedef size2d size_type;
typedef point2d point_type;
typedef ntg::int_u8 value_type;
@@ -24,8 +27,6 @@
typedef mlc_encoding_type_(value_type) value_storage_type;
typedef array2d<value_storage_type> value_container_type;
- typedef tag::readwrite constness_tag;
- typedef tag::dimension2 dimension_tag;
typedef mlc::no_type delegated_type;
};
Index: oln/makefile.src
--- oln/makefile.src (revision 41)
+++ oln/makefile.src (working copy)
@@ -38,7 +38,7 @@
core/coord.hh \
core/macros.hh \
core/props.hh \
- core/tags.hh \
+ core/entry.hh \
core/value_box.hh \
fancy/iota.hh \
fancy/print.hh \
Index: oln/core/entry.hh
--- oln/core/entry.hh (revision 0)
+++ oln/core/entry.hh (revision 0)
@@ -0,0 +1,64 @@
+// Copyright (C) 2005 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, 59 Temple Place - Suite 330, 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_ENTRY_HH
+# define OLENA_CORE_ENTRY_HH
+
+# include <oln/core/abstract/image_constness.hh>
+# include <oln/core/abstract/image_dimension.hh>
+
+
+namespace oln {
+
+ template <template <typename> class Base>
+ struct prop_of
+ {
+ template <typename E>
+ struct inherits
+ {
+ typedef Base<E> ret;
+ };
+ };
+
+ namespace abstract {
+
+ template <typename E>
+ struct image_entry :
+ public props < cat::image, E >::image_constness::inherits<E>::ret,
+ public props < cat::image, E >::image_dimension::inherits<E>::ret
+ // ...
+ {
+ protected:
+ image_entry() {}
+ };
+
+ }
+
+} // end of namespace oln
+
+
+#endif // ! OLENA_CORE_ENTRY_HH
Index: oln/core/abstract/images.hh
--- oln/core/abstract/images.hh (revision 41)
+++ oln/core/abstract/images.hh (working copy)
@@ -36,7 +36,7 @@
# include <oln/core/abstract/image_constness.hh>
-# include <oln/core/tags.hh>
+# include <oln/core/entry.hh>
#endif // ! OLENA_CORE_ABSTRACT_IMAGES_HH
Index: oln/core/abstract/image_with_data.hh
--- oln/core/abstract/image_with_data.hh (revision 41)
+++ oln/core/abstract/image_with_data.hh (working copy)
@@ -31,7 +31,7 @@
# include <mlc/tracked_ptr.hh>
-# include <oln/core/tags.hh>
+# include <oln/core/entry.hh>
# include <oln/core/macros.hh>
/*! \namespace oln
Index: oln/core/abstract/image_identity.hh
--- oln/core/abstract/image_identity.hh (revision 41)
+++ oln/core/abstract/image_identity.hh (working copy)
@@ -30,7 +30,7 @@
# include <mlc/box.hh>
-# include <oln/core/tags.hh>
+# include <oln/core/entry.hh>
namespace oln {
Index: oln/core/1d/image1d.hh
--- oln/core/1d/image1d.hh (revision 41)
+++ oln/core/1d/image1d.hh (working copy)
@@ -57,6 +57,10 @@
template <typename T>
struct props < cat::image, image1d<T> > : public default_props < cat::image >
{
+ // intrusive properties
+ typedef prop_of<abstract::readwrite_image> image_constness;
+ typedef prop_of<abstract::image1d> image_dimension;
+
typedef mlc::no_type delegated_type;
typedef size1d size_type;
@@ -72,10 +76,6 @@
// FIXME: find a better name...
typedef array1d<value_storage_type> value_container_type;
- // tags
- typedef tag::readwrite constness_tag;
- typedef tag::dimension1 dimension_tag;
-
// functions
template <typename U>
Index: oln/core/2d/image2d.hh
--- oln/core/2d/image2d.hh (revision 41)
+++ oln/core/2d/image2d.hh (working copy)
@@ -61,6 +61,10 @@
template <typename T>
struct props < cat::image, image2d<T> > : public default_props < cat::image >
{
+ // intrusive properties
+ typedef prop_of<abstract::readwrite_image> image_constness;
+ typedef prop_of<abstract::image2d> image_dimension;
+
typedef mlc::no_type delegated_type;
typedef size2d size_type;
@@ -79,10 +83,6 @@
// FIXME: find a better name...
typedef array2d<value_storage_type> value_container_type;
- // tags
- typedef tag::readwrite constness_tag;
- typedef tag::dimension2 dimension_tag;
-
// functions
template <typename U>
Index: oln/core/3d/image3d.hh
--- oln/core/3d/image3d.hh (revision 41)
+++ oln/core/3d/image3d.hh (working copy)
@@ -58,6 +58,10 @@
template <typename T>
struct props < cat::image, image3d<T> > : public default_props < cat::image >
{
+ // intrusive properties
+ typedef prop_of<abstract::readwrite_image> image_constness;
+ typedef prop_of<abstract::image3d> image_dimension;
+
typedef mlc::no_type delegated_type;
typedef size3d size_type;
@@ -73,10 +77,6 @@
// FIXME: find a better name...
typedef array3d<value_storage_type> value_container_type;
- // tags
- typedef tag::readwrite constness_tag;
- typedef tag::dimension3 dimension_tag;
-
// functions
template <typename U>
Index: oln/core/tags.hh
--- oln/core/tags.hh (revision 41)
+++ oln/core/tags.hh (working copy)
@@ -1,144 +0,0 @@
-// Copyright (C) 2005 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, 59 Temple Place - Suite 330, 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_TAGS_HH
-# define OLENA_CORE_TAGS_HH
-
-# include <oln/core/abstract/image_constness.hh>
-# include <oln/core/abstract/image_dimension.hh>
-
-#define oln_tag_decl(TAG) \
- \
-struct TAG \
-{ \
-protected: \
- TAG() {} \
-}
-
-
-#define oln_tag_decl_case(MTAG, TAG, MCLASS) \
- \
-struct TAG : public MTAG \
-{ \
-protected: \
- TAG() {} \
-}; \
- \
-namespace internal { \
- \
- template <typename E> \
- struct image_case < TAG, E > : public MCLASS <E> \
- { \
- protected: \
- image_case() {} \
- }; \
-}
-
-
-#define oln_tag_decl_retrieve_from_props(TAG) \
- \
-template <typename E> \
-struct retrieve < tag::TAG, E > \
-{ \
- typedef typename props<cat::image,E>::TAG##_tag ret; /* FIXME: ok? */ \
- /* static test if ret derives from tag::TAG */ \
-}
-
-
-
-namespace oln {
-
-
- namespace tag {
-
-
- namespace internal {
-
- template <typename TAG, typename E> struct image_case;
- template <typename TAG, typename E> struct retrieve;
-
- } // end of namespace tag::internal
-
-
- oln_tag_decl ( constness );
- oln_tag_decl_case( constness, readonly, abstract::readonly_image )
- oln_tag_decl_case( constness, readwrite, abstract::readwrite_image )
-
- oln_tag_decl ( dimension );
- oln_tag_decl_case( dimension, dimension1, abstract::image1d)
- oln_tag_decl_case( dimension, dimension2, abstract::image2d)
- oln_tag_decl_case( dimension, dimension3, abstract::image3d)
-
- namespace internal {
-
- template <typename E>
- struct retrieve < tag::constness, E >
- {
- typedef typename props<cat::image,E>::constness_tag ret; // FIXME: ok?
- // test if ret derives from constness_tag
- };
-
- template <typename E>
- struct retrieve < tag::dimension, E >
- {
- typedef typename props<cat::image,E>::dimension_tag ret; // FIXME: ok?
- // test if ret derives from constness_tag
- };
-
-
- template <typename TAG, typename E>
- struct image_switch :
- public image_case< typename retrieve<TAG,E>::ret, E>
- {
- protected:
- image_switch() {}
- };
-
-
- } // end of namespace tag::internal
-
- } // end of namespace tag
-
-
- namespace abstract {
-
- template <typename E>
- struct image_entry :
- public tag::internal::image_switch < tag::constness, E >,
- public tag::internal::image_switch < tag::dimension, E >
- // ...
- {
- protected:
- image_entry() {}
- };
-
- }
-
-} // end of namespace oln
-
-
-#endif // ! OLENA_CORE_TAGS_HH
Index: ChangeLog
from Damien Thivolle <damien(a)lrde.epita.fr>
* oln/makefile.src: Add new files.
* oln/io/write_image_2d_pnm.hh: New. pgm output method for 2D images.
* oln/io/read_image_2d_pnm.hh: Handle mlc::box correctly.
* oln/io/write_image.hh: New. Dispatch for output methods.
* oln/io/read_image.hh: Handle mlc::box correctly..
* oln/io/utils.hh: Add pnm_write_header function.
io/read_image.hh | 30 +++++++++++
io/read_image_2d_pnm.hh | 20 +++++--
io/utils.hh | 32 ++++++++++++
io/write_image.hh | 63 ++++++++++++++++++++++++
io/write_image_2d_pnm.hh | 119 +++++++++++++++++++++++++++++++++++++++++++++++
makefile.src | 5 +
6 files changed, 260 insertions(+), 9 deletions(-)
Index: oln/makefile.src
--- oln/makefile.src (revision 40)
+++ oln/makefile.src (working copy)
@@ -30,6 +30,7 @@
core/abstract/image_with_data.hh \
core/abstract/images.hh \
core/abstract/internal/image_impl.hh \
+ core/abstract/op.hh \
core/abstract/piter.hh \
core/abstract/point.hh \
core/abstract/size.hh \
@@ -43,4 +44,6 @@
fancy/print.hh \
io/read_image.hh \
io/read_image_2d_pnm.hh \
- io/utils.hh
+ io/utils.hh \
+ io/write_image.hh \
+ io/write_image_2d_pnm.hh
Index: oln/io/write_image_2d_pnm.hh
--- oln/io/write_image_2d_pnm.hh (revision 0)
+++ oln/io/write_image_2d_pnm.hh (revision 0)
@@ -0,0 +1,119 @@
+// Copyright (C) 2005 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, 59 Temple Place - Suite 330, 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_IO_WRITE_IMAGE_2D_PNM_HH
+# define OLN_IO_WRITE_IMAGE_2D_PNM_HH
+
+# include <iostream>
+# include <string>
+
+# include <mlc/box.hh>
+
+# include <ntg/core/macros.hh>
+# include <ntg/real/int_u8.hh>
+# include <ntg/real/integer.hh>
+# include <ntg/enum/enum.hh>
+# include <ntg/color/color.hh>
+
+# include <oln/core/2d/image2d.hh>
+# include <oln/core/macros.hh>
+# include <oln/core/abstract/op.hh>
+
+# include <oln/io/utils.hh>
+
+namespace oln {
+
+ namespace io {
+
+ namespace impl {
+
+ template <typename I>
+ struct write_image_2d_pgm_raw
+ : public oln::abstract::void_op<write_image_2d_pgm_raw<I> >
+ {
+ typedef oln_value_type(I) value_type;
+ typedef typename mlc::traits<value_type>::encoding_type out_type;
+
+ const I& to_write_;
+ std::ofstream& ostr_;
+
+ write_image_2d_pgm_raw(const I& to_write, std::ofstream& ostr):
+ to_write_(to_write),
+ ostr_(ostr)
+ {}
+
+ void impl_run()
+ {
+ point2d p;
+ out_type c;
+
+ for (p.row() = 0; p.row() < to_write_.size().nrows(); ++p.row())
+ for (p.col() = 0; p.col() < to_write_.size().ncols(); ++p.col())
+ {
+ c = to_write_[p];
+ ostr_ << c;
+ }
+ ostr_.close();
+ }
+
+ };
+
+ template <typename I, typename T>
+ void write(const abstract::image2d<I>& to_write,
+ const ntg::integer<T>&,
+ const std::string& name,
+ const std::string& ext)
+ {
+ std::ofstream ostr;
+ point2d p;
+ size2d s = to_write.size();
+
+ if (ext == "pgm")
+ if (internal::write_pnm_header(ostr, name, "P5",
+ s.ncols(), s.nrows(),
+ ntg_max_val(T)))
+ {
+ write_image_2d_pgm_raw<I> tmp(to_write.exact(), ostr);
+ tmp.run();
+ }
+ else
+ std::cerr << "error: unable to write header" << std::endl;
+ else
+ std::cerr << "error: image data type (`integer') does not match"
+ << " file extension (`" << ext << "')" << std::endl;
+ }
+
+ }
+
+ }
+
+}
+
+
+
+#endif // ! OLN_IO_WRITE_IMAGE_2D_PNM_HH
Index: oln/io/read_image_2d_pnm.hh
--- oln/io/read_image_2d_pnm.hh (revision 40)
+++ oln/io/read_image_2d_pnm.hh (working copy)
@@ -48,6 +48,12 @@
typedef oln_value_type(I) value_type;
typedef typename mlc::traits<value_type>::encoding_type encoding_type;
+ read_image_2d_pgm_raw<I>& output(I& output)
+ {
+ output = *image_;
+ return *this;
+ }
+
void impl_run()
{
encoding_type c;
@@ -58,7 +64,6 @@
<< std::endl;
return;
}
- c =c ;
point2d p;
oln::image2d<value_type> tmp(info_.rows, info_.cols);
@@ -74,7 +79,7 @@
}
istr_.close();
*image_ = tmp;
-
+ std::cout << "debug : size = " << image_->size() << std::endl;
}
};
@@ -94,21 +99,24 @@
{
read_image_2d_pgm_raw<I> tmp(ima.exact(), istr, info);
tmp.run();
+ tmp.output(ima.exact());
}
else
if (info.type == "P2")
- std::cerr << "read_image_2d_pgm_ascii not implemented"
+ std::cerr << "error: read_image_2d_pgm_ascii not implemented"
<< std::endl;
else
- std::cerr << "file header (`" << info.type
+ std::cerr << "error: file header (`" << info.type
<< "') does not match file extension (`"
<< ext << "')" << std::endl;
else
- std::cerr << "image data type (`integer') does not match"
+ std::cerr << "error: image data type (`integer') does not match"
<< " file extension (`" << ext << "')" << std::endl;
else
- std::cerr << "bad header" << std::endl;
+ std::cerr << "error: unable to get a valid header" << std::endl;
+ std::cout << "debug : size = " << ima.size() << std::endl;
+
}
template <typename I, typename T>
Index: oln/io/write_image.hh
--- oln/io/write_image.hh (revision 0)
+++ oln/io/write_image.hh (revision 0)
@@ -0,0 +1,63 @@
+// Copyright (C) 2005 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, 59 Temple Place - Suite 330, 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_IO_WRITE_IMAGE_HH
+# define OLN_IO_WRITE_IMAGE_HH
+
+# include <string>
+
+# include <oln/io/utils.hh>
+# include <oln/io/write_image_2d_pnm.hh>
+
+namespace oln {
+
+ namespace io {
+
+ template <typename E>
+ void write(const abstract::image<E>& im, const std::string& name)
+ {
+ std::string ext;
+ oln_value_type(E) t;
+
+ ext = internal::utils::extension(name);
+
+ if (ext == "pgm" ||
+ ext == "ppm" ||
+ ext == "pbm")
+ impl::write(im.exact(), t, name, ext);
+ else
+ std::cerr << "error: output method for '"
+ << name.c_str()
+ << "' not implemented"
+ << std::endl;
+ }
+
+ }
+
+}
+
+#endif // ! OLN_IO_WRITE_IMAGE_HH
Index: oln/io/read_image.hh
--- oln/io/read_image.hh (revision 40)
+++ oln/io/read_image.hh (working copy)
@@ -1,3 +1,30 @@
+// Copyright (C) 2005 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, 59 Temple Place - Suite 330, 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_IO_READ_IMAGE_HH
# define OLN_IO_READ_IMAGE_HH
@@ -13,7 +40,6 @@
namespace oln {
-
namespace io {
struct filename
@@ -51,7 +77,7 @@
{
std::cout << "input method for '"
<< name.get()
- << "' not implemented yet"
+ << "' not implemented"
<< std::endl;
}
Index: oln/io/utils.hh
--- oln/io/utils.hh (revision 40)
+++ oln/io/utils.hh (working copy)
@@ -137,6 +137,38 @@
return true;
}
+ bool write_pnm_header(std::ofstream& ostr,
+ const std::string& name,
+ const std::string& type,
+ int ncols,
+ int nrows,
+ int max_val)
+ {
+ if (max_val > 65535)
+ {
+ std::cerr << "error: can't save " << name
+ << ", data type too large"
+ << std::endl;
+ return false;
+ }
+
+ ostr.open(name.c_str(), std::ofstream::out);
+
+ if (ostr.is_open() == false)
+ {
+ std::cerr << "error: couldn't open " << name << std::endl;
+ return false;
+ }
+
+
+ ostr << "P5" << std::endl
+ << "# Olena 1.0" << std::endl
+ << ncols << " " << nrows << std::endl
+ << max_val << std::endl;
+ return true;
+ }
+
+
} // end of namespace internal
} // end of namespace io
When I found this bug, I thought I was lucky not to have wasted too
much time understanding the strange messages of the compiler (damn
macros!).
Index: olena/ChangeLog
from Roland Levillain <roland(a)lrde.epita.fr>
* oln/core/abstract/image.hh (oln_fwd_iter_type_): Fix macro
definition.
Index: olena/oln/core/abstract/image.hh
--- olena/oln/core/abstract/image.hh Tue, 13 Apr 2004 17:31:32 +0200 van-vl_n (oln/t/25_image.hh 1.32 600)
+++ olena/oln/core/abstract/image.hh Thu, 24 Feb 2005 10:08:32 +0100 levill_r (oln/t/25_image.hh 1.32 600)
@@ -356,7 +356,7 @@
# define oln_fwd_iter_type(Fwd_Iterable) \
mlc_exact_type(Fwd_Iterable)::fwd_iter_type
# define oln_fwd_iter_type_(Fwd_Iterable) \
-mlc_exact_type_(Fwd_Iterable)
+mlc_exact_type_(Fwd_Iterable)::fwd_iter_type
# define oln_bkd_iter_type(Bkd_Iterable) \
mlc_exact_type(Bkd_Iterable)::bkd_iter_type