#include "Tracer.h" #include #include #include using std::cout; using std::endl; using std::ostream; using std::string; using std::stringstream; using std::vector; ////////////////////////////////////////////////////////////////////////////// // Friends and statics: int Tracer::nextid_ = 0; ostream &operator<<(ostream &out, const Tracer &rhs) { out << rhs.PrintID(); return out; } ////////////////////////////////////////////////////////////////////////////// // Class implementation: Tracer::Tracer() : id_(Tracer::nextid_++) { cout << "Tracer" << PrintID() << endl; } Tracer::Tracer(const Tracer &rhs) : id_(Tracer::nextid_++) { cout << "TracerCopy[" << PrintID(); cout << "<--" << rhs.PrintID() << "]" << endl; AppendAncestors(rhs); } Tracer::~Tracer() { cout << "~Tracer" << PrintID() << endl; } Tracer &Tracer::operator=(const Tracer &rhs) { cout << "Tracer" << PrintID() << "=" << rhs.PrintID() << endl; ancestors_.clear(); AppendAncestors(rhs); return *this; } bool Tracer::operator<(const Tracer &rhs) const { cout << "Tracer" << PrintID() << "<" << rhs.PrintID() << endl; return GetRoot() < rhs.GetRoot(); } string Tracer::PrintID() const { stringstream ss; ss << "(" << id_ << ", {"; for (unsigned int i = 0; i < ancestors_.size(); ++i) { if (i > 0) { ss << ","; } ss << ancestors_[i];; } ss << "})"; return ss.str(); } void Tracer::AppendAncestors(const Tracer &t) { ancestors_.push_back(t.id_); ancestors_.insert(ancestors_.end(), t.ancestors_.begin(), t.ancestors_.end());; } int Tracer::GetRoot() const { if (ancestors_.empty()) { return id_; } else { return ancestors_.back(); } }