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_FWD_ITER3D_HH
00029 # define OLENA_CORE_FWD_ITER3D_HH
00030
00031 # include <oln/core/abstract/iter3d.hh>
00032
00033 namespace oln {
00034
00035 template<class Exact = mlc::final>
00036 class fwd_iter3d;
00037
00038 template<class Exact>
00039 struct iter_traits< fwd_iter3d<Exact> >: public
00040 iter_traits<abstract::iter3d<typename
00041 mlc::exact_vt<fwd_iter3d<Exact>, Exact>::ret> >
00042 {
00043 typedef point3d point_type;
00044 typedef dpoint3d dpoint_type;
00045 };
00046
00054 template<class Exact>
00055 class fwd_iter3d : public abstract::iter3d<typename mlc::exact_vt<fwd_iter3d<Exact>, Exact>::ret>
00056 {
00057
00058 public:
00059
00060 typedef typename mlc::exact_vt<fwd_iter3d<Exact>, Exact>::ret exact_type;
00062
00063 typedef abstract::iter3d<exact_type> super_type;
00064 typedef abstract::iter<exact_type> super_iter_type;
00066
00067 enum { dim = iter_traits<exact_type>::dim };
00068
00074 typedef typename iter_traits<exact_type>::point_type point_type;
00075
00076 friend class abstract::iter<exact_type>;
00077 friend class abstract::iter3d<exact_type>;
00078
00083 template<class Image>
00084 fwd_iter3d(const Image& ima) :
00085 super_type(ima.size())
00086 {}
00087
00092 template<class U>
00093 U
00094 operator=(U u)
00095 {
00096 return super_iter_type::operator=(u);
00097 }
00098
00100 static std::string
00101 name()
00102 {
00103 return "fwd_iter3d<" + Exact::name() + ">";
00104 }
00105
00106 protected:
00107
00113 void
00114 goto_begin_()
00115 {
00116 this->p_.slice() = this->p_.row() = this->p_.col() = 0;
00117 }
00118
00124 void
00125 goto_end_()
00126 {
00127 this->p_.slice() = this->nslices_;
00128 }
00129
00134 bool
00135 is_at_end_() const
00136 {
00137 return this->p_.slice() == this->nslices_;
00138 }
00139
00143 void
00144 goto_next_()
00145 {
00146 ++this->p_.col();
00147 if (this->p_.col() < this->ncols_)
00148 return;
00149 this->p_.col() = 0;
00150 ++this->p_.row();
00151 if (this->p_.row() < this->nrows_)
00152 return;;
00153 this->p_.row() = 0;
00154 ++this->p_.slice();
00155 }
00156
00157 };
00158
00159 }
00160
00161
00162 #endif // ! OLENA_CORE_FWD_ITER3D_HH