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