
Christian Henning wrote:
I think Phil means rather than do the read in operator++, just set a flag in operator++ that the read should be done, and actually do it in operator* (which then clears the flag). Then if someone calls operator++ again without calling operator* (which you can detect by the flag being set in operator++), you can do a skip in operator++, and thus avoid decoding the line you didn't need.
Interesting idea. I'll update the code.
Actually that doesn't work. How would the user signal to just skip a scanline? I cannot add a parameter to operator++.
PSEUDO-CODE!!!! class iterator { buffer_t& buffer; size_t pending_advance_rows; public: const buffer_t& operator*() { while (pending_advance_rows > 1) { format_specific_skip_row(); --pending_advance_rows; } if (pending_advance_rows == 1) { format_specific_read_row_into(buffer); --pending_advance_rows; } return buffer; } void operator++() { ++pending_advance_rows; } }; or in iterator-facade-style: class iterator: public iterator_facade<........> { buffer_t& buffer; size_t pending_advance_rows; const buffer_t& dereference() { while (pending_advance_rows > 1) { format_specific_skip_row(); --pending_advance_rows; } if (pending_advance_rows == 1) { format_specific_read_row_into(buffer); --pending_advance_rows; } return buffer; } void increment() { ++pending_advance_rows; } };