#include <list>
#include "ConversionChain.hpp"
#include "Segments.hpp"
using namespace opencc;
ConversionChain::ConversionChain(const std::list<ConversionPtr> _conversions)
: conversions(_conversions) {}
SegmentsPtr ConversionChain::Convert(const SegmentsPtr& input) const {
SegmentsPtr output = input;
for (auto conversion : conversions) {
output = conversion->Convert(output);
}
return output;
}
void ConversionChain::AppendConvertedSegment(const char* segment,
std::string* output) const {
if (conversions.empty()) {
output->append(segment);
return;
}
auto conversion = conversions.begin();
auto lastConversion = conversions.end();
--lastConversion;
if (conversion == lastConversion) {
(*conversion)->AppendConverted(segment, output);
return;
}
std::string converted;
(*conversion)->AppendConverted(segment, &converted);
++conversion;
for (; conversion != lastConversion; ++conversion) {
std::string next;
(*conversion)->AppendConverted(converted.c_str(), &next);
converted.swap(next);
}
(*lastConversion)->AppendConverted(converted.c_str(), output);
}
std::vector<SegmentsPtr>
ConversionChain::ConvertWithTrace(const SegmentsPtr& input) const {
std::vector<SegmentsPtr> trace;
trace.reserve(conversions.size());
SegmentsPtr output = input;
for (auto conversion : conversions) {
output = conversion->Convert(output);
trace.push_back(output);
}
return trace;
}