#ifndef LM_FILTER_WRAPPER_H__ #define LM_FILTER_WRAPPER_H__ #include "util/string_piece.hh" #include #include #include namespace lm { // Provide a single-output filter with the same interface as a // multiple-output filter so clients code against one interface. template class BinaryFilter { public: // Binary modes are just references (and a set) and it makes the API cleaner to copy them. explicit BinaryFilter(Binary binary) : binary_(binary) {} template void AddNGram(const Iterator &begin, const Iterator &end, const StringPiece &line, Output &output) { if (binary_.PassNGram(begin, end)) output.AddNGram(line); } template void AddNGram(const StringPiece &ngram, const StringPiece &line, Output &output) { AddNGram(util::TokenIter(ngram, ' '), util::TokenIter::end(), line, output); } void Flush() const {} private: Binary binary_; }; // Wrap another filter to pay attention only to context words template class ContextFilter { public: typedef FilterT Filter; explicit ContextFilter(Filter &backend) : backend_(backend) {} template void AddNGram(const StringPiece &ngram, const StringPiece &line, Output &output) { pieces_.clear(); // TODO: this copy could be avoided by a lookahead iterator. std::copy(util::TokenIter(ngram, ' '), util::TokenIter::end(), std::back_insert_iterator >(pieces_)); backend_.AddNGram(pieces_.begin(), pieces_.end() - !pieces_.empty(), line, output); } void Flush() const {} private: std::vector pieces_; Filter backend_; }; } // namespace lm #endif // LM_FILTER_WRAPPER_H__