LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
PrefixIterator.cpp
Go to the documentation of this file.
1// Copyright 2002-2013 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
8namespace Lima {
9namespace Common {
10namespace FsaAccess {
11
13 const uint64_t wordPos)
14// TODO: test with word.str()
15 : m_word_content(word.data()), m_word_length(word.length()), m_wordPos(wordPos) {
16}
17
18PrefixIterator::PrefixIterator( const LimaChar* word_content, const int32_t word_length, const int32_t wordPos)
19 : m_word_content(word_content), m_word_length(word_length), m_wordPos(wordPos) {
20}
21
22std::ostream& operator<<(std::ostream& os, const PrefixIterator& ctx) {
23 ctx.print(os);
24 return os;
25}
26
27void PrefixIterator::print(std::ostream& os) const {
30 << ", word_length=" << m_word_length
31 << ", wordPos=" << m_wordPos << "}" << std::endl;
32}
33
35#ifdef DEBUG_CD
37 LDEBUG << "PrefixIterator::operator==():"
38 << "m_word_content=" << m_word_content << ", m_word_length = " << m_word_length
39 << "it.m_word_content=" << it.m_word_content << ", it.m_word_length = " << it.m_word_length;
40#endif
41 return( (m_word_content == it.m_word_content)
42 && (m_wordPos == it.m_wordPos ) );
43}
44
46#ifdef DEBUG_CD
48 LDEBUG << "PrefixIterator::operator!=():"
49 << "m_word_content=" << m_word_content << ", m_word_length = " << m_word_length
50 << "it.m_word_content=" << it.m_word_content << ", it.m_word_length = " << it.m_word_length;
51#endif
52 return( (m_word_content != it.m_word_content)
53 || (m_wordPos != it.m_wordPos ) );
54}
55
57 const uint64_t wordPos)
58 : PrefixIterator(word,wordPos) {
59}
60
61ForwardPrefixIterator::ForwardPrefixIterator( const LimaChar* word_content, const int32_t word_length, const int32_t wordPos)
62 : PrefixIterator( word_content, word_length, wordPos ) {
63}
64
65
67 const uint64_t wordPos)
68 : PrefixIterator(word,word.length()-wordPos) {
69}
70
71ReversePrefixIterator::ReversePrefixIterator( const LimaChar* word_content, const int32_t word_length, const int32_t wordPos)
72 : PrefixIterator( word_content, word_length, wordPos) {
73}
74
75
77// #ifdef DEBUG_CD
78// FSAALOGINIT;
79// LDEBUG << "ForwardPrefixIterator::hasNextLetter: m_wordPos = "
80// << m_wordPos << ", m_word_length = " << m_word_length;
81// #endif
82
83 return( m_wordPos < m_word_length );
84}
85
87 return( m_wordPos > 0 );
88}
89
90char32_t ForwardPrefixIterator::getNextLetter(int32_t& wordOffset) const {
91
92 char32_t result;
93 int32_t wordPos0 = m_wordPos;
94
95 U16_NEXT(m_word_content, wordPos0, m_word_length, result);
96 wordOffset = wordPos0 - m_wordPos;
97 return result;
98}
99
100void ForwardPrefixIterator::next( const int32_t wordOffset ) {
101 m_wordPos = m_wordPos + wordOffset;
102}
103
104char32_t ReversePrefixIterator::getNextLetter(int32_t& wordOffset) const {
105
106 char32_t result;
107 int32_t wordPos0 = m_wordPos;
108
109 U16_PREV(m_word_content, 0, wordPos0, result);
110 wordOffset = m_wordPos - wordPos0;
111 return result;
112}
113
114void ReversePrefixIterator::next( const int32_t wordOffset ) {
115 m_wordPos = m_wordPos - wordOffset;
116}
117
119 return( m_wordPos );
120}
121
122
126
130
134
137#ifdef DEBUG_CD
139 LDEBUG << "ForwardPrefixIterator::clone: "
140 << "m_word_content=" << result->m_word_content << ", m_word_length=" << result->m_word_length << ", wordPos=" << result->m_wordPos << "\n"
141 << " "
142 << "orig.m_word_content=" << orig->m_word_content << ", it.m_word_length = " << orig->m_word_length << ", wordPos=" << orig->m_wordPos;
143#endif
144 return( result );
145// return( new ForwardPrefixIterator( orig->m_word_content, orig->m_word_length, orig->m_wordPos ) );
146}
147
149 return( new ReversePrefixIterator( orig->m_word_content, orig->m_word_length, orig->m_wordPos ) );
150}
151
155
159
163
167
171
175
179
183
184/*
185 * to find the right offset in the vector of out_edge:
186 * search for the character currentChar in the string text
187 * which contains label of all out_edges using dichotomy search
188 * (assume characters are ordered in textString)
189 */
191 const char32_t searchChar, int32_t wordOffset, int32_t highCharTextPos ) const {
192
193 // letter searchChar is defined with 1 16bits word
194 if( wordOffset > 1 ) {
195 int32_t min = 0;
196 int range = highCharTextPos;
197#ifdef DEBUG_CD
199 LTRACE << "ForwardPrefixIterator::findEdge(" << searchChar << "): min = " << min
200 << " range = " << range;
201#endif
202 char32_t edgeLabel;
203 int32_t offset = min;
204 while( range > 0 ) {
205 offset = min + range/2;
206 int32_t offset0 = offset;
207#ifdef DEBUG_CD
208 LTRACE << "ForwardPrefixIterator::findEdge(1): min = " << min
209 << " range = " << range << " try " << offset;
210#endif
211 U16_NEXT(m_word_content, offset, m_word_length, edgeLabel);
212 if( edgeLabel == searchChar ) {
213#ifdef DEBUG_CD
214 LTRACE << "ForwardPrefixIterator::findEdge(1): match " << edgeLabel << " return " << offset0;
215#endif
216 return offset0;
217 }
218 else if( searchChar > edgeLabel ){
219 range = min + range - offset0 - 1;
220 min = offset0 + 1;
221 }
222 else {
223 range = offset0 - min;
224 }
225 }
226#ifdef DEBUG_CD
227 LTRACE << "ForwardPrefixIterator::findEdge(1): min = " << min
228 << " range = " << range << " try " << min;
229#endif
230 int32_t offset0 = min;
231 U16_NEXT(m_word_content, min, m_word_length, edgeLabel);
232 if( edgeLabel == searchChar ) {
233#ifdef DEBUG_CD
234 LTRACE << "ForwardPrefixIterator::findEdge(1): match " << edgeLabel << " return " << offset0;
235#endif
236 return offset0;
237 }
238 else {
239#ifdef DEBUG_CD
240 LTRACE << "ForwardPrefixIterator::findEdge(1): unmatch " << edgeLabel << " and " << searchChar;
241#endif
242 return -1;
243 }
244 }
245 // letter searchChar is defined with 2 16bits words
246 else {
247 int32_t min = highCharTextPos;
248 int range = (m_word_length - min)/2;
249#ifdef DEBUG_CD
251 LTRACE << "ForwardPrefixIterator::findEdge(" << searchChar << "): min = " << min
252 << " range = " << range;
253#endif
254 char32_t edgeLabel;
255 int32_t offset = min;
256 while( range > 0 ) {
257 offset = 2*(min + range/2);
258 int32_t offset0 = offset;
259#ifdef DEBUG_CD
260 LTRACE << "ForwardPrefixIterator::findEdge(2): min = " << min
261 << " range = " << range << " try " << offset;
262#endif
263 U16_NEXT(m_word_content, offset, m_word_length, edgeLabel);
264 if( edgeLabel == searchChar ) {
265#ifdef DEBUG_CD
266 LTRACE << "ForwardPrefixIterator::findEdge(2): match " << edgeLabel << " return " << offset0/2;
267#endif
268 return offset0/2;
269 }
270 else if( searchChar > edgeLabel ){
271 range = min + range - offset0 - 2;
272 min = 2*(offset0 + 1);
273 }
274 else {
275 range = offset0 - min;
276 }
277 }
278#ifdef DEBUG_CD
279 LTRACE << "ForwardPrefixIterator::findEdge(2): min = " << min
280 << " range = " << range << " try " << min;
281#endif
282 int32_t offset0 = min;
283 U16_NEXT(m_word_content, min, m_word_length, edgeLabel);
284 if( edgeLabel == searchChar ) {
285#ifdef DEBUG_CD
286 LTRACE << "ForwardPrefixIterator::findEdge(2): match " << edgeLabel << " return " << offset0/2;
287#endif
288 return (offset0/2);
289 }
290 else {
291#ifdef DEBUG_CD
292 LTRACE << "ForwardPrefixIterator::findEdge(2): unmatch " << edgeLabel << " and " << searchChar;
293#endif
294 return -1;
295 }
296 }
297}
298
299
300
301} // namespace FsaAccess
302} // namespace Common
303} // namespace Lima
#define LTRACE
Definition LimaCommon.h:156
#define LDEBUG
Definition LimaCommon.h:157
#define FSAALOGINIT
Definition LimaCommon.h:206
PrefixIterator * clone(const PrefixIterator *const orig) const override
void next(const int32_t wordOffset) override
char32_t getNextLetter(int32_t &wordOffset) const override
int32_t findEdge(const char32_t searchChar, int32_t wordOffset, int32_t highCharTextPos) const
const LimaString getCurrentPrefix() const override
const LimaString getTotalPrefix() const override
const LimaString getPastPrefix() const override
const Lima::LimaChar * getCurrentContent() const override
bool operator!=(const PrefixIterator &it) const
friend LIMA_FSAACCESS_EXPORT std::ostream & operator<<(std::ostream &os, const PrefixIterator &t)
void print(std::ostream &os) const
PrefixIterator(const LimaString &word, const uint64_t offset)
const Lima::LimaChar *const m_word_content
bool operator==(const PrefixIterator &it) const
const LimaString getPastPrefix() const override
void next(const int32_t wordOffset) override
char32_t getNextLetter(int32_t &wordOffset) const override
const LimaString getTotalPrefix() const override
const Lima::LimaChar * getCurrentContent() const override
PrefixIterator * clone(const PrefixIterator *const orig) const override
const LimaString getCurrentPrefix() const override
std::string limastring2utf8stdstring(const Lima::LimaString &phrase, uint32_t size0)
Convert a wide string to a string , in dest up to size bytes.
NAUTITIA.
QChar LimaChar
Definition LimaString.h:30
QString LimaString
Definition LimaString.h:33
#define U16_PREV(s, start, i, c)
#define U16_NEXT(s, i, length, c)