66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
#ifndef LM_BUILDER_NGRAM_STREAM_H
|
|
#define LM_BUILDER_NGRAM_STREAM_H
|
|
|
|
#include "lm/common/ngram.hh"
|
|
#include "util/stream/chain.hh"
|
|
#include "util/stream/multi_stream.hh"
|
|
#include "util/stream/stream.hh"
|
|
|
|
#include <cstddef>
|
|
|
|
namespace lm {
|
|
|
|
template <class Proxy> class ProxyStream {
|
|
public:
|
|
// Make an invalid stream.
|
|
ProxyStream() {}
|
|
|
|
explicit ProxyStream(const util::stream::ChainPosition &position, const Proxy &proxy = Proxy())
|
|
: proxy_(proxy), stream_(position) {
|
|
proxy_.ReBase(stream_.Get());
|
|
}
|
|
|
|
Proxy &operator*() { return proxy_; }
|
|
const Proxy &operator*() const { return proxy_; }
|
|
|
|
Proxy *operator->() { return &proxy_; }
|
|
const Proxy *operator->() const { return &proxy_; }
|
|
|
|
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(); }
|
|
|
|
ProxyStream<Proxy> &operator++() {
|
|
++stream_;
|
|
proxy_.ReBase(stream_.Get());
|
|
return *this;
|
|
}
|
|
|
|
private:
|
|
Proxy proxy_;
|
|
util::stream::Stream stream_;
|
|
};
|
|
|
|
template <class Payload> class NGramStream : public ProxyStream<NGram<Payload> > {
|
|
public:
|
|
// Make an invalid stream.
|
|
NGramStream() {}
|
|
|
|
explicit NGramStream(const util::stream::ChainPosition &position) :
|
|
ProxyStream<NGram<Payload> >(position, NGram<Payload>(NULL, NGram<Payload>::OrderFromSize(position.GetChain().EntrySize()))) {}
|
|
};
|
|
|
|
template <class Payload> class NGramStreams : public util::stream::GenericStreams<NGramStream<Payload> > {
|
|
private:
|
|
typedef util::stream::GenericStreams<NGramStream<Payload> > P;
|
|
public:
|
|
NGramStreams() : P() {}
|
|
NGramStreams(const util::stream::ChainPositions &positions) : P(positions) {}
|
|
};
|
|
|
|
} // namespace
|
|
#endif // LM_BUILDER_NGRAM_STREAM_H
|