Listing 4: Subwindow iterator design.
template<size_t _SubWidth, size_t _SubHeight, typename _Tp> class SubWindow: public std::iterator<heavy_forward_iterator_tag, _Tp> { public: // the nested iterator definition class iterator: public std::iterator<std::forward_iterator_tag, _Tp> { // dereference, add padding if necessary inline _Tp operator*(void) const { if ((x_ < 0) || (y_ < 0) || (x_ >= width_) || (y_ >= yOffImage_)) { return 0; } return begin_[y_ + x_]; } // advance preserving spatial location in image inline iterator & operator ++(void) { x_ += 1; if (x_ > stopX_) { x_ = startX_; y_ += width_; } return *this; } // get the lightweight proxy proxy_iterator operator&(void) { return proxy_iterator(this); } // remaining methods and data members omitted for brevity // ... }; // define a proxy for reducing copy overhead class proxy_iterator: public std::iterator<std::forward_iterator_tag, _Tp> { // pass operation along to addressee inline proxy_iterator& operator++(void) { addressee_->operator++(); return *this; } // remaining methods and data members omitted for brevity // ... }; // Access the iterator pair. Note returning a reference for efficiency inline iterator &begin() { return begin_; } inline iterator &end() { return end_; } // set the position in the larger image (see downloadable code) inline void reset(size_t x, size_t y); // constructor caches the data pointer and dimensions SubWindow(_Tp *in, int width, int height); private: // current location iterator begin_; iterator end_; };