#include <iostream>
#include <iterator>
struct csforward_iterator :
std::iterator<std::bidirectional_iterator_tag, const char, void> {
csforward_iterator( pointer ptr = nullptr ) : p( ptr ) {}
csforward_iterator& operator++() { ++p; return *this; }
csforward_iterator operator++(int) { auto t = *this; ++p; return t; }
csforward_iterator& operator--() { --p; return *this; }
csforward_iterator operator--(int) { auto t = *this; --p; return t; }
bool operator==( csforward_iterator o ) {
return p == o.p or ( p ? not ( o.p or *p ) : *o.p );
}
bool operator!=( csforward_iterator o ) { return not operator==( o ); }
reference operator*() const { return *p; }
private:
pointer p;
};
int main() {
std::copy( csforward_iterator( "foobar" ), csforward_iterator(), std::ostream_iterator<char>(std::cout) );
std::cout << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CgpzdHJ1Y3QgY3Nmb3J3YXJkX2l0ZXJhdG9yIDogCiAgICBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIGNvbnN0IGNoYXIsIHZvaWQ+IHsKCiAgICBjc2ZvcndhcmRfaXRlcmF0b3IoIHBvaW50ZXIgcHRyID0gbnVsbHB0ciApIDogcCggcHRyICkge30KICAgIAogICAgY3Nmb3J3YXJkX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgIHsgKytwOyByZXR1cm4gKnRoaXM7IH0KICAgIGNzZm9yd2FyZF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyBhdXRvIHQgPSAqdGhpczsgKytwOyByZXR1cm4gdDsgfQogICAgCiAgICBjc2ZvcndhcmRfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSAgeyAtLXA7IHJldHVybiAqdGhpczsgfQogICAgY3Nmb3J3YXJkX2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KSB7IGF1dG8gdCA9ICp0aGlzOyAtLXA7IHJldHVybiB0OyB9CiAgICAKICAgIGJvb2wgb3BlcmF0b3I9PSggY3Nmb3J3YXJkX2l0ZXJhdG9yIG8gKSB7IAogICAgICAgIHJldHVybiBwID09IG8ucCBvciAoIHAgPyBub3QgKCBvLnAgb3IgKnAgKSA6ICpvLnAgKTsgCiAgICB9CiAgICBib29sIG9wZXJhdG9yIT0oIGNzZm9yd2FyZF9pdGVyYXRvciBvICkgeyByZXR1cm4gbm90IG9wZXJhdG9yPT0oIG8gKTsgfQogICAgCiAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnA7IH0KcHJpdmF0ZToKICAgIHBvaW50ZXIgcDsKfTsKCgppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y29weSggY3Nmb3J3YXJkX2l0ZXJhdG9yKCAiZm9vYmFyIiApLCBjc2ZvcndhcmRfaXRlcmF0b3IoKSwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGNoYXI+KHN0ZDo6Y291dCkgKTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0=