|
#ifndef LM_BUILDER_NGRAM_STREAM_H |
|
#define LM_BUILDER_NGRAM_STREAM_H |
|
|
|
#include "lm/builder/ngram.hh" |
|
#include "util/stream/chain.hh" |
|
#include "util/stream/multi_stream.hh" |
|
#include "util/stream/stream.hh" |
|
|
|
#include <cstddef> |
|
|
|
namespace lm { namespace builder { |
|
|
|
class NGramStream { |
|
public: |
|
NGramStream() : gram_(NULL, 0) {} |
|
|
|
NGramStream(const util::stream::ChainPosition &position) : gram_(NULL, 0) { |
|
Init(position); |
|
} |
|
|
|
void Init(const util::stream::ChainPosition &position) { |
|
stream_.Init(position); |
|
gram_ = NGram(stream_.Get(), NGram::OrderFromSize(position.GetChain().EntrySize())); |
|
} |
|
|
|
NGram &operator*() { return gram_; } |
|
const NGram &operator*() const { return gram_; } |
|
|
|
NGram *operator->() { return &gram_; } |
|
const NGram *operator->() const { return &gram_; } |
|
|
|
void *Get() { return stream_.Get(); } |
|
const void *Get() const { return stream_.Get(); } |
|
|
|
operator bool() const { return stream_; } |
|
bool operator!() const { return !stream_; } |
|
void Poison() { stream_.Poison(); } |
|
|
|
NGramStream &operator++() { |
|
++stream_; |
|
gram_.ReBase(stream_.Get()); |
|
return *this; |
|
} |
|
|
|
private: |
|
NGram gram_; |
|
util::stream::Stream stream_; |
|
}; |
|
|
|
inline util::stream::Chain &operator>>(util::stream::Chain &chain, NGramStream &str) { |
|
str.Init(chain.Add()); |
|
return chain; |
|
} |
|
|
|
typedef util::stream::GenericStreams<NGramStream> NGramStreams; |
|
|
|
}} |
|
#endif |
|
|