Listing 3: Window iterator design.
template<size_t _SubWidth, size_t _SubHeight, typename _Tp> class Window {
public:
typedef SubWindow<_SubWidth, _SubHeight, _Tp> SubWindow;
// the nested iterator definition
class iterator : public std::iterator<std::forward_iterator_tag, _Tp> {
// dereference to get a subwindow buffer (must update to current
// pixel first)
inline SubWindow &operator*() {
subWindow_.reset(x_, y_);
return subWindow_;
}
// advance preserving spatial location in image
inline iterator & operator ++(void) {
++x_;
if (x_ == width_) {
x_ = 0;
++y_;
}
return *this;
}
// remaining methods and data members omitted for brevity
// ...
};
// constructor caches the data pointer and dimensions
Window(_Tp *in, size_t width, size_t height);
// Access the iterator pair, must reset before returning. Note
// returning a reference for efficiency
inline iterator &begin() {
begin_.x_ = 0;
begin_.y_ = 0;
return begin_;
}
inline iterator &end() {
end_.x_ = 0;
end_.y_ = end_.height_;
return end_;
}
private:
// current subwindow pair stored to reduce number of temporaries
// that must be created
iterator begin_;
iterator end_;
};