#include <string>
#include <iostream>
#include <utility>
#include <iterator>
template<class Mark, class T>
struct marked_type {
T raw;
marked_type(T&& in):raw(std::forward<T>(in)) {}
};
template<typename Mark, typename T>
marked_type<Mark, T> mark_type( T&& t ) {
return {std::forward<T>(t)};
}
struct strange_iteration {};
template<typename T>
auto begin( marked_type<strange_iteration, T> const& container )
-> decltype( std::begin(std::forward<T>(container.raw)) )
{
std::cout << "BEGIN";
return std::begin(std::forward<T>(container.raw));
}
template<typename T>
auto end( marked_type<strange_iteration, T> const& container )
-> decltype( std::end(std::forward<T>(container.raw)) )
{
std::cout << "END";
return std::end(std::forward<T>(container.raw));
}
int main() {
std::string s = "hello world";
for( char c : mark_type<strange_iteration>(s) ) {
std::cout << c;
}
std::cout << "\n";
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKICAgIHRlbXBsYXRlPGNsYXNzIE1hcmssIGNsYXNzIFQ+CiAgICBzdHJ1Y3QgbWFya2VkX3R5cGUgewogICAgICBUIHJhdzsKICAgICAgbWFya2VkX3R5cGUoVCYmIGluKTpyYXcoc3RkOjpmb3J3YXJkPFQ+KGluKSkge30KICAgIH07CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXJrLCB0eXBlbmFtZSBUPgogICAgbWFya2VkX3R5cGU8TWFyaywgVD4gbWFya190eXBlKCBUJiYgdCApIHsKICAgICAgcmV0dXJuIHtzdGQ6OmZvcndhcmQ8VD4odCl9OwogICAgfQoKICAgIHN0cnVjdCBzdHJhbmdlX2l0ZXJhdGlvbiB7fTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBhdXRvIGJlZ2luKCBtYXJrZWRfdHlwZTxzdHJhbmdlX2l0ZXJhdGlvbiwgVD4gY29uc3QmIGNvbnRhaW5lciApCiAgICAgIC0+IGRlY2x0eXBlKCBzdGQ6OmJlZ2luKHN0ZDo6Zm9yd2FyZDxUPihjb250YWluZXIucmF3KSkgKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkJFR0lOIjsKICAgICAgcmV0dXJuIHN0ZDo6YmVnaW4oc3RkOjpmb3J3YXJkPFQ+KGNvbnRhaW5lci5yYXcpKTsKICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBhdXRvIGVuZCggbWFya2VkX3R5cGU8c3RyYW5nZV9pdGVyYXRpb24sIFQ+IGNvbnN0JiBjb250YWluZXIgKQogICAgICAtPiBkZWNsdHlwZSggc3RkOjplbmQoc3RkOjpmb3J3YXJkPFQ+KGNvbnRhaW5lci5yYXcpKSApCiAgICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiRU5EIjsKICAgICAgcmV0dXJuIHN0ZDo6ZW5kKHN0ZDo6Zm9yd2FyZDxUPihjb250YWluZXIucmF3KSk7CiAgICB9ICAgICAgICAKaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBzID0gImhlbGxvIHdvcmxkIjsKICAgIGZvciggY2hhciBjIDogbWFya190eXBlPHN0cmFuZ2VfaXRlcmF0aW9uPihzKSApIHsKICAgICAgc3RkOjpjb3V0IDw8IGM7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKfQ==