1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Copyright (C) 2001-2008,2010 IBM and others. All rights reserved.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  03/22/2000   helena      Creation.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/brkiter.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/schriter.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/search.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "usrchimp.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// public constructors and destructors -----------------------------------
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator::SearchIterator(const SearchIterator &other)
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : UObject(other)
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_breakiterator_            = other.m_breakiterator_;
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_text_                     = other.m_text_;
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_                   = (USearch *)uprv_malloc(sizeof(USearch));
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->breakIter        = other.m_search_->breakIter;
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isCanonicalMatch = other.m_search_->isCanonicalMatch;
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isOverlap        = other.m_search_->isOverlap;
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    m_search_->elementComparisonType = other.m_search_->elementComparisonType;
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedIndex     = other.m_search_->matchedIndex;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedLength    = other.m_search_->matchedLength;
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->text             = other.m_search_->text;
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->textLength       = other.m_search_->textLength;
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator::~SearchIterator()
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (m_search_ != NULL) {
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_free(m_search_);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// public get and set methods ----------------------------------------
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setAttribute(USearchAttribute       attribute,
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  USearchAttributeValue  value,
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  UErrorCode            &status)
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch (attribute)
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case USEARCH_OVERLAP :
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isOverlap = (value == USEARCH_ON ? TRUE : FALSE);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case USEARCH_CANONICAL_MATCH :
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isCanonicalMatch = (value == USEARCH_ON ? TRUE : FALSE);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case USEARCH_ELEMENT_COMPARISON :
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (value == USEARCH_PATTERN_BASE_WEIGHT_IS_WILDCARD || value == USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD) {
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                m_search_->elementComparisonType = (int16_t)value;
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            } else {
6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                m_search_->elementComparisonType = 0;
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ILLEGAL_ARGUMENT_ERROR;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (value == USEARCH_ATTRIBUTE_VALUE_COUNT) {
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ILLEGAL_ARGUMENT_ERROR;
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUSearchAttributeValue SearchIterator::getAttribute(
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          USearchAttribute  attribute) const
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (attribute) {
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case USEARCH_OVERLAP :
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (m_search_->isOverlap == TRUE ? USEARCH_ON : USEARCH_OFF);
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case USEARCH_CANONICAL_MATCH :
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (m_search_->isCanonicalMatch == TRUE ? USEARCH_ON :
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                                USEARCH_OFF);
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    case USEARCH_ELEMENT_COMPARISON :
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            int16_t value = m_search_->elementComparisonType;
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (value == USEARCH_PATTERN_BASE_WEIGHT_IS_WILDCARD || value == USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD) {
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return (USearchAttributeValue)value;
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            } else {
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return USEARCH_STANDARD_ELEMENT_COMPARISON;
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default :
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DEFAULT;
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::getMatchedStart() const
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_search_->matchedIndex;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::getMatchedLength() const
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_search_->matchedLength;
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::getMatchedText(UnicodeString &result) const
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t matchedindex  = m_search_->matchedIndex;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t     matchedlength = m_search_->matchedLength;
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (matchedindex != USEARCH_DONE && matchedlength != 0) {
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result.setTo(m_search_->text + matchedindex, matchedlength);
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result.remove();
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setBreakIterator(BreakIterator *breakiter,
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      UErrorCode &status)
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if 0
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->breakIter = NULL;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // the c++ breakiterator may not make use of ubreakiterator.
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // so we'll have to keep track of it ourselves.
130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#else
131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Well, gee... the Constructors that take a BreakIterator
132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // all cast the BreakIterator to a UBreakIterator and
133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // pass it to the corresponding usearch_openFromXXX
134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // routine, so there's no reason not to do this.
135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        //
136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Besides, a UBreakIterator is a BreakIterator, so
137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // any subclass of BreakIterator should work fine here...
138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        m_search_->breakIter = (UBreakIterator *) breakiter;
139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_breakiterator_ = breakiter;
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst BreakIterator * SearchIterator::getBreakIterator(void) const
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_breakiterator_;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setText(const UnicodeString &text, UErrorCode &status)
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (text.length() == 0) {
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ILLEGAL_ARGUMENT_ERROR;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_text_        = text;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->text = m_text_.getBuffer();
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->textLength = m_text_.length();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setText(CharacterIterator &text, UErrorCode &status)
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.getText(m_text_);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setText(m_text_, status);
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UnicodeString & SearchIterator::getText(void) const
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_text_;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// operator overloading ----------------------------------------------
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool SearchIterator::operator==(const SearchIterator &that) const
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this == &that) {
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (m_breakiterator_            == that.m_breakiterator_ &&
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isCanonicalMatch == that.m_search_->isCanonicalMatch &&
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isOverlap        == that.m_search_->isOverlap &&
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            m_search_->elementComparisonType == that.m_search_->elementComparisonType &&
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->matchedIndex     == that.m_search_->matchedIndex &&
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->matchedLength    == that.m_search_->matchedLength &&
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->textLength       == that.m_search_->textLength &&
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            getOffset() == that.getOffset() &&
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (uprv_memcmp(m_search_->text, that.m_search_->text,
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              m_search_->textLength * sizeof(UChar)) == 0));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// public methods ----------------------------------------------------
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::first(UErrorCode &status)
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setOffset(0, status);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return handleNext(0, status);
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::following(int32_t position,
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      UErrorCode &status)
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setOffset(position, status);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return handleNext(position, status);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::last(UErrorCode &status)
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setOffset(m_search_->textLength, status);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return handlePrev(m_search_->textLength, status);
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::preceding(int32_t position,
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      UErrorCode &status)
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setOffset(position, status);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return handlePrev(position, status);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::next(UErrorCode &status)
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t offset = getOffset();
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = m_search_->matchedIndex;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t     matchlength = m_search_->matchedLength;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->reset = FALSE;
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (m_search_->isForwardSearching == TRUE) {
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t textlength = m_search_->textLength;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (offset == textlength || matchindex == textlength ||
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                (matchindex != USEARCH_DONE &&
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchindex + matchlength >= textlength)) {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // not enough characters to match
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                setMatchNotFound();
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return USEARCH_DONE;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // switching direction.
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // if matchedIndex == USEARCH_DONE, it means that either a
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // setOffset has been called or that previous ran off the text
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // string. the iterator would have been set to offset 0 if a
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // match is not found.
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isForwardSearching = TRUE;
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (m_search_->matchedIndex != USEARCH_DONE) {
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // there's no need to set the collation element iterator
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // the next call to next will set the offset.
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return matchindex;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchlength > 0) {
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // if matchlength is 0 we are at the start of the iteration
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (m_search_->isOverlap) {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                offset ++;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                offset += matchlength;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return handleNext(offset, status);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return USEARCH_DONE;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t SearchIterator::previous(UErrorCode &status)
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t offset;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (m_search_->reset) {
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            offset                       = m_search_->textLength;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isForwardSearching = FALSE;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->reset              = FALSE;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            setOffset(offset, status);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            offset = getOffset();
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex = m_search_->matchedIndex;
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (m_search_->isForwardSearching == TRUE) {
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // switching direction.
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // if matchedIndex == USEARCH_DONE, it means that either a
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // setOffset has been called or that next ran off the text
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // string. the iterator would have been set to offset textLength if
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // a match is not found.
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            m_search_->isForwardSearching = FALSE;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != USEARCH_DONE) {
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return matchindex;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (offset == 0 || matchindex == 0) {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // not enough characters to match
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                setMatchNotFound();
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return USEARCH_DONE;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != USEARCH_DONE) {
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (m_search_->isOverlap) {
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                matchindex += m_search_->matchedLength - 2;
318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return handlePrev(matchindex, status);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return handlePrev(offset, status);
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return USEARCH_DONE;
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::reset()
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchNotFound();
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setOffset(0, status);
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isOverlap          = FALSE;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isCanonicalMatch   = FALSE;
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    m_search_->elementComparisonType = 0;
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isForwardSearching = TRUE;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->reset              = TRUE;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// protected constructors and destructors -----------------------------
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator::SearchIterator()
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_                     = (USearch *)uprv_malloc(sizeof(USearch));
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->breakIter          = NULL;
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isOverlap          = FALSE;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isCanonicalMatch   = FALSE;
34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    m_search_->elementComparisonType = 0;
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isForwardSearching = TRUE;
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->reset              = TRUE;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedIndex       = USEARCH_DONE;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedLength      = 0;
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->text               = NULL;
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->textLength         = 0;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_breakiterator_              = NULL;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator::SearchIterator(const UnicodeString &text,
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     BreakIterator *breakiter) :
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     m_breakiterator_(breakiter),
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     m_text_(text)
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_                     = (USearch *)uprv_malloc(sizeof(USearch));
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->breakIter          = NULL;
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isOverlap          = FALSE;
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isCanonicalMatch   = FALSE;
36850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    m_search_->elementComparisonType = 0;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isForwardSearching = TRUE;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->reset              = TRUE;
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedIndex       = USEARCH_DONE;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedLength      = 0;
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->text               = m_text_.getBuffer();
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->textLength         = text.length();
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator::SearchIterator(CharacterIterator &text,
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               BreakIterator     *breakiter) :
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               m_breakiterator_(breakiter)
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_                     = (USearch *)uprv_malloc(sizeof(USearch));
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->breakIter          = NULL;
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isOverlap          = FALSE;
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isCanonicalMatch   = FALSE;
38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    m_search_->elementComparisonType = 0;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->isForwardSearching = TRUE;
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->reset              = TRUE;
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedIndex       = USEARCH_DONE;
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedLength      = 0;
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.getText(m_text_);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->text               = m_text_.getBuffer();
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->textLength         = m_text_.length();
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_breakiterator_             = breakiter;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// protected methods ------------------------------------------------------
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator & SearchIterator::operator=(const SearchIterator &that)
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this != &that) {
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_breakiterator_            = that.m_breakiterator_;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_text_                     = that.m_text_;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->breakIter        = that.m_search_->breakIter;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->isCanonicalMatch = that.m_search_->isCanonicalMatch;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->isOverlap        = that.m_search_->isOverlap;
40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        m_search_->elementComparisonType = that.m_search_->elementComparisonType;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->matchedIndex     = that.m_search_->matchedIndex;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->matchedLength    = that.m_search_->matchedLength;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->text             = that.m_search_->text;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_search_->textLength       = that.m_search_->textLength;
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *this;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setMatchLength(int32_t length)
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedLength = length;
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setMatchStart(int32_t position)
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_search_->matchedIndex = position;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid SearchIterator::setMatchNotFound()
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchStart(USEARCH_DONE);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchLength(0);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // by default no errors should be returned here since offsets are within
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // range.
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (m_search_->isForwardSearching) {
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setOffset(m_search_->textLength, status);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setOffset(0, status);
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
444