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