00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_CORE_ABSTRACT_ITER3D_HH
00029 # define OLENA_CORE_ABSTRACT_ITER3D_HH
00030
00031 # include <oln/core/coord.hh>
00032 # include <oln/core/point3d.hh>
00033 # include <oln/core/dpoint3d.hh>
00034 # include <oln/core/image3d_size.hh>
00035 # include <oln/core/abstract/iter.hh>
00036
00037 # include <mlc/contract.hh>
00038 # include <mlc/type.hh>
00039 # include <mlc/objs.hh>
00040
00041 namespace oln {
00042
00043 namespace abstract {
00044 template<class Exact>
00045 class iter3d;
00046 }
00047
00051 template<class Exact>
00052 struct iter_traits<abstract::iter3d<Exact> >: public
00053 iter_traits<abstract::iter<Exact> >
00054 {
00055 enum { dim = 3 };
00056 typedef point3d point_type;
00057 typedef dpoint3d dpoint_type;
00058 };
00059
00060 namespace abstract {
00061
00069 template<class Exact>
00070 class iter3d : public iter< Exact >
00071 {
00072 public:
00073
00074 typedef iter<Exact> super_type;
00075
00076 friend class iter<Exact>;
00077
00085 coord
00086 slice() const
00087 {
00088 return this->p_.slice();
00089 }
00090
00098 coord
00099 row() const
00100 {
00101 return this->p_.row();
00102 }
00103
00111 coord
00112 col() const
00113 {
00114 return this->p_.col();
00115 }
00116
00118 static std::string name()
00119 {
00120 return std::string("_iter3d<") + Exact::name() + ">";
00121 }
00122
00123 protected:
00124
00125 const coord nslices_;
00126 const coord nrows_;
00127 const coord ncols_;
00128
00134 point3d
00135 to_point() const
00136 {
00137 precondition(*this != end);
00138 invariant(this->p_.slice() >=0
00139 && this->p_.slice() < nslices_
00140 && this->p_.row() >= 0
00141 && this->p_.row() < nrows_
00142 && this->p_.col() >= 0
00143 && this->p_.col() < ncols_);
00144 return this->p_;
00145 }
00146
00150 iter3d() : super_type(), nslices_(0), nrows_(0), ncols_(0)
00151 {}
00152
00160 iter3d(const image3d_size& size) :
00161 super_type(),
00162 nslices_(size.nslices()),
00163 nrows_(size.nrows()),
00164 ncols_(size.ncols())
00165 {
00166 precondition(size.nslices() > 0
00167 && size.nrows() > 0
00168 && size.ncols() > 0);
00169 this->exact().goto_begin_();
00170 }
00171 };
00172
00173 }
00174
00175 }
00176
00177
00178 #endif // ! OLENA_CORE_ABSTRACT_ITER3D_HH