/* */ #include "PStringBuildVisitor.h" #include "PStringSegment.h" #include "PStringNumLoop.h" #include "PStringSelect.h" #include "NumberDecorator.h" #include "a2functional.h" namespace aria2 { PStringBuildVisitor::PStringBuildVisitor() {} PStringBuildVisitor::~PStringBuildVisitor() {} void PStringBuildVisitor::visit(PStringSegment& segment) { std::string uri; if(buildQueue_.empty()) { uri += segment.getValue(); } else { uri = buildQueue_.front(); uri += segment.getValue(); } buildQueue_.push_front(uri); if(!segment.hasNext()) { uris_.push_back(uri); } if(segment.getNext()) { segment.getNext()->accept(*this); } buildQueue_.pop_front(); } void PStringBuildVisitor::visit(PStringNumLoop& s) { unsigned int start = s.getStartValue(); unsigned int end = s.getEndValue(); unsigned int step = s.getStep(); for(unsigned int i = start; i <= end; i += step) { PStringSegment(s.getNumberDecorator()->decorate(i), s.getNext()).accept(*this); } } void PStringBuildVisitor::visit(PStringSelect& s) { const std::vector& values = s.getValues(); for(std::vector::const_iterator i = values.begin(), eoi = values.end(); i != eoi; ++i) { PStringSegment(*i, s.getNext()).accept(*this); } } const std::vector& PStringBuildVisitor::getURIs() const { return uris_; } void PStringBuildVisitor::reset() { buildQueue_.clear(); uris_.clear(); } } // namespace aria2