diff options
Diffstat (limited to 'traveler/AsciiTraveler.cc')
| -rw-r--r-- | traveler/AsciiTraveler.cc | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/traveler/AsciiTraveler.cc b/traveler/AsciiTraveler.cc new file mode 100644 index 0000000..db4088d --- /dev/null +++ b/traveler/AsciiTraveler.cc @@ -0,0 +1,62 @@ +#include "AsciiTraveler.hh" + +namespace pcc { +const std::string AsciiTraveler::MiddleLevelPrefix_ = "|-"; +const std::string AsciiTraveler::LastLevelPrefix_ = "`-"; +const std::string AsciiTraveler::MiddleChildPrefix_ = "| "; +const std::string AsciiTraveler::LastChildPrefix_ = " "; +const size_t AsciiTraveler::LevelWidth_ = + AsciiTraveler::MiddleLevelPrefix_.size(); + +AsciiTraveler::AsciiTraveler(std::ostream& out) + : Traveler(out) + , prefix_("") + , level_(0) { + IsLastChild_.push(true); +} + +Traveler& AsciiTraveler::operator<<(TravelPart part) { + switch (part) { + case TravelPart::PREFIX: + out_ << prefix_ + << (IsLastChild_.top() ? LastLevelPrefix_ : MiddleLevelPrefix_); + break; + case TravelPart::NAME_BEGIN: + out_ << '<'; + break; + case TravelPart::NAME_END: + out_ << '>'; + break; + break; + case TravelPart::DESCRPTION_BEGIN: + out_ << '<'; + break; + case TravelPart::DESCRPTION_END: + out_ << ">\n"; + break; + case TravelPart::CHILD_BEGIN: + prefix_.append(IsLastChild_.top() ? LastChildPrefix_ + : MiddleChildPrefix_); + IsLastChild_.push(false); + ++level_; + break; + case TravelPart::LAST_CHILD_BEGIN: + prefix_.append(IsLastChild_.top() ? LastChildPrefix_ + : MiddleChildPrefix_); + IsLastChild_.push(true); + ++level_; + break; + case TravelPart::CHILD_END: + case TravelPart::LAST_CHILD_END: + prefix_.erase(prefix_.size() - LevelWidth_); + IsLastChild_.pop(); + --level_; + break; + case TravelPart::END: + break; + default: + break; + } + return *this; +} +} // namespace pcc |
