#include <iostream>
#include <fstream>
using namespace std;
class Logger {
public:
Logger(ostream& os) : os_(os), curIndentLevel_(0) {}
Logger& increaseLevel() { ++curIndentLevel_; return *this; }
Logger& decreaseLevel() { --curIndentLevel_; return *this; }
private:
template<typename T> friend ostream& operator<<(Logger&, T);
ostream& os_;
int curIndentLevel_;
};
template<typename T>
ostream& operator<<(Logger& log, T op) {
for(int i = 0; i < log.curIndentLevel_ * 4; ++i) {
log.os_ << ' ';
}
log.os_ << op;
return log.os_;
}
int main() {
Logger log(cout);
log.increaseLevel() << "Hello World!" << endl;
log.decreaseLevel() << "Hello World!" << endl;
return 0;
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxmc3RyZWFtPgoJCgl1c2luZyBuYW1lc3BhY2Ugc3RkOwoJCgljbGFzcyBMb2dnZXIgewoJcHVibGljOgoJICAgIExvZ2dlcihvc3RyZWFtJiBvcykgOiBvc18ob3MpLCBjdXJJbmRlbnRMZXZlbF8oMCkge30KCSAgICBMb2dnZXImIGluY3JlYXNlTGV2ZWwoKSB7ICsrY3VySW5kZW50TGV2ZWxfOyByZXR1cm4gKnRoaXM7IH0KCSAgICBMb2dnZXImIGRlY3JlYXNlTGV2ZWwoKSB7IC0tY3VySW5kZW50TGV2ZWxfOyByZXR1cm4gKnRoaXM7IH0KCSAgICAKCXByaXZhdGU6CgkgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwoTG9nZ2VyJiwgVCk7CgkKCSAgICBvc3RyZWFtJiBvc187CgkgICAgaW50IGN1ckluZGVudExldmVsXzsKCX07CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IAoJb3N0cmVhbSYgb3BlcmF0b3I8PChMb2dnZXImIGxvZywgVCBvcCkgewoJCWZvcihpbnQgaSA9IDA7IGkgPCBsb2cuY3VySW5kZW50TGV2ZWxfICogNDsgKytpKSB7CgkJCWxvZy5vc18gPDwgJyAnOwoJCX0KCQlsb2cub3NfIDw8IG9wOwoJCXJldHVybiBsb2cub3NfOwoJfQoJCglpbnQgbWFpbigpIHsKCQlMb2dnZXIgbG9nKGNvdXQpOwoJCQoJCWxvZy5pbmNyZWFzZUxldmVsKCkgPDwgIkhlbGxvIFdvcmxkISIgPDwgZW5kbDsKCQlsb2cuZGVjcmVhc2VMZXZlbCgpIDw8ICJIZWxsbyBXb3JsZCEiIDw8IGVuZGw7CgkJcmV0dXJuIDA7Cgl9