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 "Factor.h"
00034 #include "Util.h"
00035 #include "util/string_piece.hh"
00036
00037 namespace Moses
00038 {
00039
00040 class Phrase;
00041
00045 class Word
00046 {
00047 friend std::ostream& operator<<(std::ostream&, const Word&);
00048
00049 protected:
00050
00051 typedef const Factor * FactorArray[MAX_NUM_FACTORS];
00052
00053 FactorArray m_factorArray;
00054 bool m_isNonTerminal;
00055
00056 public:
00058 Word(const Word ©)
00059 :m_isNonTerminal(copy.m_isNonTerminal) {
00060 std::memcpy(m_factorArray, copy.m_factorArray, sizeof(FactorArray));
00061 }
00062
00064 explicit Word(bool isNonTerminal = false) {
00065 std::memset(m_factorArray, 0, sizeof(FactorArray));
00066 m_isNonTerminal = isNonTerminal;
00067 }
00068
00069 ~Word() {}
00070
00072 const Factor*& operator[](FactorType index) {
00073 return m_factorArray[index];
00074 }
00075
00076 const Factor * const & operator[](FactorType index) const {
00077 return m_factorArray[index];
00078 }
00079
00081 inline const Factor* GetFactor(FactorType factorType) const {
00082 return m_factorArray[factorType];
00083 }
00084 inline void SetFactor(FactorType factorType, const Factor *factor) {
00085 m_factorArray[factorType] = factor;
00086 }
00087
00088 inline bool IsNonTerminal() const {
00089 return m_isNonTerminal;
00090 }
00091 inline void SetIsNonTerminal(bool val) {
00092 m_isNonTerminal = val;
00093 }
00094
00097 void Merge(const Word &sourceWord);
00098
00104 std::string GetString(const std::vector<FactorType> factorType,bool endWithBlank) const;
00105 StringPiece GetString(FactorType factorType) const;
00106 TO_STRING();
00107
00109 inline bool operator< (const Word &compare) const {
00110
00111
00112
00113 return Compare(*this, compare) < 0;
00114 }
00115
00116 inline bool operator== (const Word &compare) const {
00117
00118
00119
00120 return Compare(*this, compare) == 0;
00121 }
00122
00123 inline bool operator!= (const Word &compare) const {
00124 return Compare(*this, compare) != 0;
00125 }
00126
00127
00128
00133 static int Compare(const Word &targetWord, const Word &sourceWord);
00134
00135 void CreateFromString(FactorDirection direction
00136 , const std::vector<FactorType> &factorOrder
00137 , const StringPiece &str
00138 , bool isNonTerminal);
00139
00140 void CreateUnknownWord(const Word &sourceWord);
00141
00142 inline size_t hash() const {
00143 return util::MurmurHashNative(m_factorArray, MAX_NUM_FACTORS*sizeof(Factor*), m_isNonTerminal);
00144 }
00145 };
00146
00147 struct WordComparer {
00149 bool operator()(const Word *a, const Word *b) const {
00150 return *a < *b;
00151 }
00152 };
00153
00154
00155 inline size_t hash_value(const Word& word)
00156 {
00157 return word.hash();
00158 }
00159
00160 }
00161
00162 #endif