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_; };