#ifndef SEARCH_HEADER__ #define SEARCH_HEADER__ // Header consisting of Score, Arity, Note and WordsRange #include "search/types.hh" #include "moses/WordsRange.h" #include namespace search { // Copying is shallow. class Header { public: bool Valid() const { return base_; } Score GetScore() const { return *reinterpret_cast(base_); } void SetScore(Score to) { *reinterpret_cast(base_) = to; } bool operator<(const Header &other) const { return GetScore() < other.GetScore(); } bool operator>(const Header &other) const { return GetScore() > other.GetScore(); } Arity GetArity() const { return *reinterpret_cast(base_ + sizeof(Score)); } Note GetNote() const { return *reinterpret_cast(base_ + sizeof(Score) + sizeof(Arity)); } void SetNote(Note to) { *reinterpret_cast(base_ + sizeof(Score) + sizeof(Arity)) = to; } Moses::WordsRange GetRange() const { return *reinterpret_cast(base_ + sizeof(Score) + sizeof(Arity) + sizeof(Note)); } void SetRange(Moses::WordsRange to) { *reinterpret_cast(base_ + sizeof(Score) + sizeof(Arity) + sizeof(Note)) = to; } uint8_t *Base() { return base_; } const uint8_t *Base() const { return base_; } protected: Header() : base_(NULL) {} explicit Header(void *base) : base_(static_cast(base)) {} Header(void *base, Arity arity) : base_(static_cast(base)) { *reinterpret_cast(base_ + sizeof(Score)) = arity; } static const std::size_t kHeaderSize = sizeof(Score) + sizeof(Arity) + sizeof(Note) + sizeof(Moses::WordsRange); uint8_t *After() { return base_ + kHeaderSize; } const uint8_t *After() const { return base_ + kHeaderSize; } private: uint8_t *base_; }; } // namespace search #endif // SEARCH_HEADER__