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_BKD_ITER2D_HH
00029 # define OLENA_CORE_BKD_ITER2D_HH
00030
00031 # include <oln/core/abstract/iter2d.hh>
00032
00033 namespace oln {
00034
00035 template<class Exact = mlc::final>
00036 class bkd_iter2d;
00037
00041 template<class Exact>
00042 struct iter_traits<bkd_iter2d<Exact> >: public
00043 iter_traits<abstract::iter2d<typename
00044 mlc::exact_vt<bkd_iter2d<Exact>, Exact>::ret> >
00045 {
00046 typedef point2d point_type;
00047 typedef dpoint2d dpoint_type;
00048 };
00049
00057 template<class Exact>
00058 class bkd_iter2d : public abstract::iter2d<typename mlc::exact_vt<bkd_iter2d<Exact>, Exact>::ret>
00059 {
00060 public:
00061
00062 typedef typename mlc::exact_vt<bkd_iter2d<Exact>, Exact>::ret exact_type;
00064
00065 typedef abstract::iter2d<exact_type> super_type;
00066 typedef abstract::iter<exact_type> super_iter_type;
00068
00069 enum { dim = iter_traits<exact_type>::dim };
00070
00076 typedef typename iter_traits<exact_type>::point_type point_type;
00077
00078 friend class abstract::iter<exact_type>;
00079 friend class abstract::iter2d<exact_type>;
00080
00085 template<class Image>
00086 bkd_iter2d(const Image& ima) :
00087 super_type(ima.size())
00088 {}
00089
00094 template<class U>
00095 U
00096 operator=(U u)
00097 {
00098 return super_iter_type::operator=(u);
00099 }
00100
00102 static std::string
00103 name()
00104 {
00105 return std::string("bkd_iter2d<") + Exact::name() + ">";
00106 }
00107
00108 protected:
00109
00115 void
00116 goto_begin_()
00117 {
00118 this->p_.row() = this->nrows_ - 1;
00119 this->p_.col() = this->ncols_ - 1;
00120 }
00121
00127 void
00128 goto_end_()
00129 {
00130 this->p_.row() = -1;
00131 }
00132
00137 bool
00138 is_at_end_() const
00139 {
00140 return this->p_.row() == -1;
00141 }
00142
00146 void
00147 goto_next_()
00148 {
00149 --this->p_.col();
00150 if (this->p_.col() >= 0)
00151 return;
00152 this->p_.col() = this->ncols_ - 1;
00153 --this->p_.row();
00154 }
00155
00156 };
00157
00158
00159 }
00160
00161
00162 #endif // ! OLENA_CORE_BKD_ITER2D_HH