/* */ #include "PStringBuildVisitor.h" #include "PStringSegment.h" #include "PStringNumLoop.h" #include "PStringSelect.h" #include "a2functional.h" namespace aria2 { 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().isNull()) { 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