#ifndef LM_FACADE_H #define LM_FACADE_H #include "virtual_interface.hh" #include "../util/string_piece.hh" #include namespace lm { namespace base { // Common model interface that depends on knowing the specific classes. // Curiously recurring template pattern. template class ModelFacade : public Model { public: typedef StateT State; typedef VocabularyT Vocabulary; /* Translate from void* to State */ FullScoreReturn BaseFullScore(const void *in_state, const WordIndex new_word, void *out_state) const { return static_cast(this)->FullScore( *reinterpret_cast(in_state), new_word, *reinterpret_cast(out_state)); } FullScoreReturn BaseFullScoreForgotState(const WordIndex *context_rbegin, const WordIndex *context_rend, const WordIndex new_word, void *out_state) const { return static_cast(this)->FullScoreForgotState( context_rbegin, context_rend, new_word, *reinterpret_cast(out_state)); } // Default Score function calls FullScore. Model can override this. float Score(const State &in_state, const WordIndex new_word, State &out_state) const { return static_cast(this)->FullScore(in_state, new_word, out_state).prob; } float BaseScore(const void *in_state, const WordIndex new_word, void *out_state) const { return static_cast(this)->Score( *reinterpret_cast(in_state), new_word, *reinterpret_cast(out_state)); } const State &BeginSentenceState() const { return begin_sentence_; } const State &NullContextState() const { return null_context_; } const Vocabulary &GetVocabulary() const { return *static_cast(&BaseVocabulary()); } protected: ModelFacade() : Model(sizeof(State)) {} virtual ~ModelFacade() {} // begin_sentence and null_context can disappear after. vocab should stay. void Init(const State &begin_sentence, const State &null_context, const Vocabulary &vocab, unsigned char order) { begin_sentence_ = begin_sentence; null_context_ = null_context; begin_sentence_memory_ = &begin_sentence_; null_context_memory_ = &null_context_; base_vocab_ = &vocab; order_ = order; } private: State begin_sentence_, null_context_; }; } // mamespace base } // namespace lm #endif // LM_FACADE_H