summaryrefslogtreecommitdiff
path: root/traveler/AsciiTraveler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'traveler/AsciiTraveler.cc')
-rw-r--r--traveler/AsciiTraveler.cc62
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