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_WINNEIGHB_HH
00029 # define OLENA_CORE_WINNEIGHB_HH
00030
00031 # include <mlc/objs.hh>
00032 # include <oln/core/image.hh>
00033
00034 # include <string>
00035
00036 namespace oln
00037 {
00038
00039 template< class Win >
00040 struct winneighb {
00041
00042 typedef oln_point_type(Win) point;
00043 typedef oln_dpoint_type(Win) dpoint;
00044
00045 template< class T >
00046 winneighb(const typename Win::abstract_type& win, const T& anchor) :
00047 win_(win.exact()), pos_(0), anchor_(anchor.point_ref())
00048 {}
00049
00050 const point& point_ref() const
00051 {
00052 return cur_;
00053 }
00054
00055 mlc::begin_type
00056 operator=(mlc::begin_type)
00057 {
00058 pos_ = 0;
00059 cur_ = anchor_ + win_.dp(pos_);
00060 return begin;
00061 }
00062
00063 mlc::end_type
00064 operator=(mlc::end_type)
00065 {
00066 pos_ = win_.card();
00067 return end;
00068 }
00069
00070 bool
00071 operator==(mlc::end_type) const
00072 {
00073 return pos_ == win_.card();
00074 }
00075
00076 bool
00077 operator!=(mlc::end_type) const
00078 {
00079 return pos_ != win_.card();
00080 }
00081
00082 winneighb&
00083 operator++()
00084 {
00085 precondition(*this != end);
00086 ++pos_;
00087 if (*this != end)
00088 cur_ = anchor_ + win_.dp(pos_);
00089 return *this;
00090 }
00091
00092 winneighb
00093 operator++(int)
00094 {
00095 precondition(*this != end);
00096 winneighb i = *this;
00097 ++(*this);
00098 return i;
00099 }
00100
00101 operator point() const
00102 {
00103 precondition(*this != end);
00104 return cur_;
00105 }
00106
00107
00108
00109 point
00110 cur() const
00111 {
00112 return *this;
00113 }
00114
00115 static std::string
00116 name()
00117 {
00118 return std::string("winneighb<") + Win::name() + ">";
00119 }
00120
00121 private:
00122
00123 const Win &win_;
00124 unsigned pos_;
00125 const point& anchor_;
00126 point cur_;
00127
00128 };
00129
00130 }
00131
00132 #endif // OLENA_CORE_WINNEIGHB_HH