00001 #ifndef LM_COMMON_MODEL_BUFFER_H
00002 #define LM_COMMON_MODEL_BUFFER_H
00003
00004
00005
00006
00007
00008 #include "util/file.hh"
00009 #include "util/fixed_array.hh"
00010
00011 #include <string>
00012 #include <vector>
00013
00014 namespace util { namespace stream {
00015 class Chains;
00016 class Chain;
00017 }}
00018
00019 namespace lm {
00020
00021 class ModelBuffer {
00022 public:
00023
00024 ModelBuffer(StringPiece file_base, bool keep_buffer, bool output_q);
00025
00026
00027 explicit ModelBuffer(StringPiece file_base);
00028
00029
00030 void Sink(util::stream::Chains &chains, const std::vector<uint64_t> &counts);
00031
00032
00033
00034 void Source(util::stream::Chains &chains);
00035
00036 void Source(std::size_t order_minus_1, util::stream::Chain &chain);
00037
00038
00039 std::size_t Order() const { return counts_.size(); }
00040
00041 const std::vector<uint64_t> &Counts() const {
00042 assert(!counts_.empty());
00043 return counts_;
00044 }
00045
00046 int VocabFile() const { return vocab_file_.get(); }
00047 int StealVocabFile() { return vocab_file_.release(); }
00048
00049 bool Keep() const { return keep_buffer_; }
00050
00051 private:
00052 const std::string file_base_;
00053 const bool keep_buffer_;
00054 bool output_q_;
00055 std::vector<uint64_t> counts_;
00056
00057 util::scoped_fd vocab_file_;
00058 util::FixedArray<util::scoped_fd> files_;
00059 };
00060
00061 }
00062
00063 #endif // LM_COMMON_MODEL_BUFFER_H