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 #include "TypeDef.h"
00030 #include "Factor.h"
00031 #include "Util.h"
00032
00033 namespace Moses
00034 {
00035
00036 class Phrase;
00037
00038
00039
00040
00041 class Word
00042 {
00043 friend std::ostream& operator<<(std::ostream&, const Word&);
00044
00045 protected:
00046
00047 typedef const Factor * FactorArray[MAX_NUM_FACTORS];
00048
00049 FactorArray m_factorArray;
00050 bool m_isNonTerminal;
00051
00052 public:
00054 Word(const Word ©)
00055 :m_isNonTerminal(copy.m_isNonTerminal) {
00056 std::memcpy(m_factorArray, copy.m_factorArray, sizeof(FactorArray));
00057 }
00058
00060 explicit Word(bool isNonTerminal = false) {
00061 std::memset(m_factorArray, 0, sizeof(FactorArray));
00062 m_isNonTerminal = isNonTerminal;
00063 }
00064
00065 ~Word() {}
00066
00068 const Factor*& operator[](FactorType index) {
00069 return m_factorArray[index];
00070 }
00071
00072 const Factor * const & operator[](FactorType index) const {
00073 return m_factorArray[index];
00074 }
00075
00077 inline const Factor* GetFactor(FactorType factorType) const {
00078 return m_factorArray[factorType];
00079 }
00080 inline void SetFactor(FactorType factorType, const Factor *factor) {
00081 m_factorArray[factorType] = factor;
00082 }
00083
00084 inline bool IsNonTerminal() const {
00085 return m_isNonTerminal;
00086 }
00087 inline void SetIsNonTerminal(bool val) {
00088 m_isNonTerminal = val;
00089 }
00090
00093 void Merge(const Word &sourceWord);
00094
00100 std::string GetString(const std::vector<FactorType> factorType,bool endWithBlank) const;
00101 TO_STRING();
00102
00104 inline bool operator< (const Word &compare) const {
00105
00106
00107
00108 return Compare(*this, compare) < 0;
00109 }
00110
00111 inline bool operator== (const Word &compare) const {
00112
00113
00114
00115 return Compare(*this, compare) == 0;
00116 }
00117
00118 inline bool operator!= (const Word &compare) const {
00119 return Compare(*this, compare) != 0;
00120 }
00121
00122
00123
00128 static int Compare(const Word &targetWord, const Word &sourceWord);
00129
00130 void CreateFromString(FactorDirection direction
00131 , const std::vector<FactorType> &factorOrder
00132 , const std::string &str
00133 , bool isNonTerminal);
00134
00135 void CreateUnknownWord(const Word &sourceWord);
00136
00137 };
00138
00139 struct WordComparer {
00141 bool operator()(const Word *a, const Word *b) const {
00142 return *a < *b;
00143 }
00144 };
00145
00146 }
00147
00148 #endif