summaryrefslogtreecommitdiff
path: root/traveler/AsciiTraveler.cc
blob: db4088d16d8962ff76ad7c30316fa2873d50b3cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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