#include <iostream>
#include <fstream>
using namespace std;
class Logger {
public:
Logger(ostream& os) : os_(os), curIndentLevel_(0) {}
void increaseLevel() { ++curIndentLevel_; }
void decreaseLevel() { --curIndentLevel_; }
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();
log << "Hello World!" << endl;
log.decreaseLevel();
log << "Hello World!" << endl;
return 0;
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxmc3RyZWFtPgoJCgl1c2luZyBuYW1lc3BhY2Ugc3RkOwoJCgljbGFzcyBMb2dnZXIgewoJcHVibGljOgoJICAgIExvZ2dlcihvc3RyZWFtJiBvcykgOiBvc18ob3MpLCBjdXJJbmRlbnRMZXZlbF8oMCkge30KCSAgICB2b2lkIGluY3JlYXNlTGV2ZWwoKSB7ICsrY3VySW5kZW50TGV2ZWxfOyB9CgkgICAgdm9pZCBkZWNyZWFzZUxldmVsKCkgeyAtLWN1ckluZGVudExldmVsXzsgfQoJICAgIAoJcHJpdmF0ZToKCSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChMb2dnZXImLCBUKTsKCQoJICAgIG9zdHJlYW0mIG9zXzsKCSAgICBpbnQgY3VySW5kZW50TGV2ZWxfOwoJfTsKCQoJdGVtcGxhdGU8dHlwZW5hbWUgVD4gCglvc3RyZWFtJiBvcGVyYXRvcjw8KExvZ2dlciYgbG9nLCBUIG9wKSB7CgkJZm9yKGludCBpID0gMDsgaSA8IGxvZy5jdXJJbmRlbnRMZXZlbF8gKiA0OyArK2kpIHsKCQkJbG9nLm9zXyA8PCAnICc7CgkJfQoJCWxvZy5vc18gPDwgb3A7CgkJcmV0dXJuIGxvZy5vc187Cgl9CgkKCWludCBtYWluKCkgewoJCUxvZ2dlciBsb2coY291dCk7CgkJCgkJbG9nLmluY3JlYXNlTGV2ZWwoKTsKCQlsb2cgPDwgIkhlbGxvIFdvcmxkISIgPDwgZW5kbDsKCQlsb2cuZGVjcmVhc2VMZXZlbCgpOwoJCWxvZyA8PCAiSGVsbG8gV29ybGQhIiA8PCBlbmRsOwoJCXJldHVybiAwOwoJfQ==