2 #ifndef __SUNPINYIN_PYTRIE_H__
3 #define __SUNPINYIN_PYTRIE_H__
9 #include "../portability.h"
10 #include "pinyin/syllable.h"
13 #define WORD_ID_WIDTH 24
17 friend class CPinyinTrieMaker;
25 #ifdef WORDS_BIGENDIAN
28 unsigned m_csLevel : 2;
29 unsigned m_id : WORD_ID_WIDTH;
31 unsigned m_id : WORD_ID_WIDTH;
32 unsigned m_csLevel : 2;
37 TWordIdInfo() { memset(this, 0, sizeof(TWordIdInfo)); }
39 TWordIdInfo(unsigned id,
44 : m_id(id), m_csLevel(cslvl), m_cost(cost), m_bSeen(seen) { }
46 operator unsigned int() const { return m_id; }
50 #ifdef WORDS_BIGENDIAN
52 unsigned m_bFullSyllableTransfer : 1;
53 unsigned m_csLevel : 2;
54 unsigned m_nTransfer : 12;
55 unsigned m_nWordId : 12;
57 unsigned m_nWordId : 12;
58 unsigned m_nTransfer : 12;
59 unsigned m_csLevel : 2;
60 unsigned m_bFullSyllableTransfer : 1;
64 static unsigned int size_for(unsigned int nTransfer,
65 unsigned int nWordId) {
66 return sizeof(TNode) + sizeof(TTransUnit) * nTransfer +
67 sizeof(TWordIdInfo) * nWordId;
71 { *((unsigned *) this) = 0; }
73 bool hasPinyinChild(void) const
74 { return(m_nTransfer > 1); }
76 const TTransUnit*getTrans() const
77 { return (TTransUnit *) (this + 1); }
79 const TWordIdInfo*getWordIdPtr() const
80 { return (TWordIdInfo *) (((char *) (this +
81 1)) + sizeof(TTransUnit) *
84 unsigned int transfer(unsigned s) const {
85 unsigned int b = 0, e = m_nTransfer;
86 const TTransUnit* ptrans = getTrans();
88 int m = b + (e - b) / 2;
89 if (ptrans[m].m_Syllable == s)
90 return ptrans[m].m_Offset;
91 if (ptrans[m].m_Syllable < s)
101 CPinyinTrie() : m_Size(0), m_mem(NULL), m_words(NULL) { }
107 load(const char* fileName);
113 isValid(const TNode* pnode, bool allowNonComplete, unsigned csLevel = 0);
115 unsigned int getRootOffset() const
116 { return 3 * sizeof(unsigned int); }
118 const TNode*getRootNode() const
119 { return (TNode *) (m_mem + getRootOffset()); }
121 const TNode*nodeFromOffset(unsigned int offset) const
122 { return (offset < getRootOffset()) ? NULL : ((TNode *) (m_mem + offset)); }
124 unsigned int getWordCount(void) const
125 { return *(unsigned int *) m_mem; }
127 unsigned int getNodeCount(void) const
128 { return *(unsigned int *) (m_mem + sizeof(unsigned int)); }
130 unsigned int getStringOffset(void) const
131 { return *(unsigned int *) (m_mem + 2 * sizeof(unsigned int)); }
133 inline const TNode*transfer(const TNode* pnode, unsigned s) const
134 { return nodeFromOffset(pnode->transfer(s)); }
136 inline const TNode*transfer(unsigned s) const
137 { return transfer(getRootNode(), s); }
140 getSymbolId(const TWCHAR* wstr);
143 getSymbolId(const wstring & wstr);
145 const TWCHAR*operator[](unsigned int idx) const
146 { return m_words[idx]; }
149 lengthAt(unsigned int idx) const;
152 print(FILE *fp) const;
159 std::map<wstring, unsigned> m_SymbolMap;
162 print(const TNode* pRoot, std::string& prefix, FILE *fp) const;
165 #endif /* __SUNPINYIN_PYTRIE_H__*/