00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef moses_Word_h
00023 #define moses_Word_h
00024
00025 #include <cstring>
00026 #include <iostream>
00027 #include <vector>
00028 #include <list>
00029
00030 #include "util/murmur_hash.hh"
00031
00032 #include "TypeDef.h"
00033 #include "Util.h"
00034 #include "util/string_piece.hh"
00035
00036 namespace Moses
00037 {
00038 class Factor;
00039 class FactorMask;
00040
00044 class Word
00045 {
00046 friend std::ostream& operator<<(std::ostream&, const Word&);
00047
00048 protected:
00049
00050 typedef const Factor * FactorArray[MAX_NUM_FACTORS];
00051
00052 FactorArray m_factorArray;
00053 bool m_isNonTerminal;
00054 bool m_isOOV;
00055
00056 public:
00058 Word(const Word ©)
00059 :m_isNonTerminal(copy.m_isNonTerminal)
00060 ,m_isOOV(copy.m_isOOV) {
00061 std::memcpy(m_factorArray, copy.m_factorArray, sizeof(FactorArray));
00062 }
00063
00065 explicit Word(bool isNonTerminal = false) {
00066 std::memset(m_factorArray, 0, sizeof(FactorArray));
00067 m_isNonTerminal = isNonTerminal;
00068 m_isOOV = false;
00069 }
00070
00071 ~Word() {}
00072
00074 const Factor*& operator[](FactorType index) {
00075 return m_factorArray[index];
00076 }
00077
00078 const Factor * const & operator[](FactorType index) const {
00079 return m_factorArray[index];
00080 }
00081
00083 inline const Factor* GetFactor(FactorType factorType) const {
00084 return m_factorArray[factorType];
00085 }
00086 inline void SetFactor(FactorType factorType, const Factor *factor) {
00087 m_factorArray[factorType] = factor;
00088 }
00089
00090 inline bool IsNonTerminal() const {
00091 return m_isNonTerminal;
00092 }
00093 inline void SetIsNonTerminal(bool val) {
00094 m_isNonTerminal = val;
00095 }
00096
00097 inline bool IsOOV() const {
00098 return m_isOOV;
00099 }
00100 inline void SetIsOOV(bool val) {
00101 m_isOOV = val;
00102 }
00103
00104 bool IsEpsilon() const;
00105
00108 void Merge(const Word &sourceWord);
00109
00115 std::string GetString(const std::vector<FactorType> factorType,bool endWithBlank) const;
00116 StringPiece GetString(FactorType factorType) const;
00117 TO_STRING();
00118
00119 bool operator== (const Word &compare) const;
00120
00121 inline bool operator!= (const Word &compare) const {
00122 return !(*this == compare);
00123 }
00124
00125
00126
00131 static int Compare(const Word &targetWord, const Word &sourceWord);
00132
00133 void CreateFromString(FactorDirection direction
00134 , const std::vector<FactorType> &factorOrder
00135 , const StringPiece &str
00136 , bool isNonTerminal
00137 , bool strict = true);
00138
00139 void CreateUnknownWord(const Word &sourceWord);
00140
00141 void OnlyTheseFactors(const FactorMask &factors);
00142
00143 inline size_t hash() const {
00144 return util::MurmurHashNative(m_factorArray, MAX_NUM_FACTORS*sizeof(Factor*), m_isNonTerminal);
00145 }
00146 };
00147
00148 inline size_t hash_value(const Word& word)
00149 {
00150 return word.hash();
00151 }
00152
00153 }
00154
00155 #endif