diff --git a/icu4c/source/samples/search/srchiter.cpp b/icu4c/source/samples/search/srchiter.cpp deleted file mode 100644 index 2d722f19b0..0000000000 --- a/icu4c/source/samples/search/srchiter.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2000 IBM and others. All rights reserved. -********************************************************************** -* Date Name Description -* 03/22/2000 helena Creation. -********************************************************************** -*/ - -#include "unicode/brkiter.h" -#include "unicode/schriter.h" -#include "srchiter.h" - - -int32_t const SearchIterator::DONE = -1; -int32_t const SearchIterator::BEFORE = -2; - -SearchIterator::SearchIterator(void) : - index(0), - length(0), - target(0), - backward(FALSE), /* going forward */ - breaker(NULL), - overlap(TRUE) -{ - UErrorCode status = U_ZERO_ERROR; - this->breaker = BreakIterator::createCharacterInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) return; -} - -SearchIterator::SearchIterator(CharacterIterator* target, - BreakIterator* breaker) : - index(0), - length(0), - target(0), - backward(FALSE), /* going forward */ - breaker(NULL), - overlap(TRUE) -{ - this->target = target; - - this->breaker = breaker; - this->breaker->adoptText(this->target); - - index = this->target->startIndex(); - length = 0; -} - -SearchIterator::SearchIterator(const SearchIterator& other) : - length(other.length), - target(0), - backward(other.backward), /* going forward */ - breaker(NULL), - overlap(other.overlap) -{ - index = other.target->startIndex(); - this->target = other.target->clone(); - - this->breaker = ((BreakIterator&)other.breaker).clone(); - this->breaker->adoptText(this->target); -} - -SearchIterator::~SearchIterator() -{ - // deletion of breaker will delete target - if (breaker != NULL) { - delete breaker; - breaker = 0; - } -} - -UBool SearchIterator::operator == (const SearchIterator& that) const -{ - if (this == &that) return TRUE; - if (*that.breaker != *breaker) return FALSE; - else if (*that.target != *target) return FALSE; - else if (that.backward != backward) return FALSE; - else if (that.index != index) return FALSE; - else if (that.length != length) return FALSE; - else if (that.overlap != overlap) return FALSE; - else return TRUE; -} - -int32_t SearchIterator::first(void) -{ - setIndex(SearchIterator::BEFORE); - return next(); -} - -int32_t SearchIterator::following(int32_t pos) -{ - setIndex(pos); - return next(); -} - -int32_t SearchIterator::last(void) -{ - setIndex(SearchIterator::DONE); - return previous(); -} - -int32_t SearchIterator::preceding(int32_t pos) -{ - setIndex(pos); - return previous(); -} - -int32_t SearchIterator::next(void) -{ - if (index == SearchIterator::BEFORE){ - // Starting at the beginning of the text - index = target->startIndex(); - } else if (index == SearchIterator::DONE) { - return SearchIterator::DONE; - } else if (length > 0) { - // Finding the next match after a previous one - index += overlap ? 1 : length; - } - index -= 1; - backward = FALSE; - - do { - UErrorCode status = U_ZERO_ERROR; - length = 0; - index = handleNext(index + 1, status); - if (U_FAILURE(status)) - { - return SearchIterator::DONE; - } - } while (index != SearchIterator::DONE && !isBreakUnit(index, index+length)); - - return index; -} - -int32_t SearchIterator::previous(void) -{ - if (index == SearchIterator::DONE) { - index = target->endIndex(); - } else if (index == SearchIterator::BEFORE) { - return SearchIterator::DONE; - } else if (length > 0) { - // Finding the previous match before a following one - index = overlap ? index + length - 1 : index; - } - index += 1; - backward = TRUE; - - do { - UErrorCode status = U_ZERO_ERROR; - length = 0; - index = handlePrev(index - 1, status); - if (U_FAILURE(status)) - { - return SearchIterator::DONE; - } - } while (index != SearchIterator::DONE && !isBreakUnit(index, index+length)); - - if (index == SearchIterator::DONE) { - index = SearchIterator::BEFORE; - } - return getIndex(); -} - - -int32_t SearchIterator::getIndex() const -{ - return index == SearchIterator::BEFORE ? SearchIterator::DONE : index; -} - -void SearchIterator::setOverlapping(UBool allowOverlap) -{ - overlap = allowOverlap; -} - -UBool SearchIterator::isOverlapping(void) const -{ - return overlap; -} - -int32_t SearchIterator::getMatchLength(void) const -{ - return length; -} - -void SearchIterator::reset(void) -{ - length = 0; - if (backward == FALSE) { - index = 0; - target->setToStart(); - breaker->first(); - } else { - index = SearchIterator::DONE; - target->setToEnd(); - breaker->last(); - } - overlap = TRUE; -} - -void SearchIterator::setBreakIterator(const BreakIterator* iterator) -{ - CharacterIterator *buffer = target->clone(); - delete breaker; - breaker = iterator->clone(); - breaker->adoptText(buffer); -} - -const BreakIterator& SearchIterator::getBreakIterator(void) const -{ - return *breaker; -} - -void SearchIterator::setTarget(const UnicodeString& newText) -{ - if (target != NULL && target->getDynamicClassID() - == StringCharacterIterator::getStaticClassID()) { - ((StringCharacterIterator*)target)->setText(newText); - } - else { - delete target; - target = new StringCharacterIterator(newText); - target->first(); - breaker->adoptText(target); - } -} - -void SearchIterator::adoptTarget(CharacterIterator* iterator) { - target = iterator; - breaker->adoptText(target); - setIndex(SearchIterator::BEFORE); -} - -const CharacterIterator& SearchIterator::getTarget(void) const -{ - SearchIterator* nonConstThis = (SearchIterator*)this; - - // The iterator is initialized pointing to no text at all, so if this - // function is called while we're in that state, we have to fudge an - // an iterator to return. - if (nonConstThis->target == NULL) - nonConstThis->target = new StringCharacterIterator(""); - return *nonConstThis->target; -} - -void SearchIterator::getMatchedText(UnicodeString& result) -{ - result.remove(); - if (length > 0) { - int i = 0; - for (UChar c = target->setIndex(index); i < length; c = target->next(), i++) - { - result += c; - } - } -} - - -void SearchIterator::setMatchLength(int32_t length) -{ - this->length = length; -} - -void SearchIterator::setIndex(int32_t pos) { - index = pos; - length = 0; -} - -UBool SearchIterator::isBreakUnit(int32_t start, - int32_t end) -{ - if (breaker == NULL) { - return TRUE; - } - UBool startBound = breaker->isBoundary(start); - UBool endBound = (end == target->endIndex()) || breaker->isBoundary(end); - - return startBound && endBound; -} - - - diff --git a/icu4c/source/samples/search/srchiter.h b/icu4c/source/samples/search/srchiter.h deleted file mode 100644 index 489fe22d9d..0000000000 --- a/icu4c/source/samples/search/srchiter.h +++ /dev/null @@ -1,387 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2000 IBM and others. All rights reserved. -********************************************************************** -* Date Name Description -* 03/22/2000 helena Creation. -********************************************************************** -*/ -#ifndef SRCHITER_H -#define SRCHITER_H - -#include "unicode/utypes.h" -#include "unicode/unistr.h" -#include "unicode/chariter.h" -#include "unicode/brkiter.h" - -/** - * SearchIterator is an abstract base class that provides methods - * to search for a pattern within a text string. Instances of - * SearchIterator maintain a current position and scan over - * the target text, returning the indices the pattern is matched - * and the length of each match. - *

- * SearchIterator is an abstract base class that defines a - * protocol for text searching. Subclasses provide concrete implementations of - * various search algorithms. For example, {@link StringSearch} - * implements language-sensitive pattern matching based on the comparison rules - * defined in a {@link RuleBasedCollator} object. - *

- * Internally, SearchIterator scans text using a - * {@link CharacterIterator}, and is thus able to scan text held - * by any object implementing that protocol. A StringCharacterIterator - * is used to scan String objects passed to setText. - *

- * SearchIterator provides an API that is similar to that of - * other text iteration classes such as BreakIterator. Using this - * class, it is easy to scan through text looking for all occurances of a - * given pattern. The following example uses a StringSearch object to - * find all instances of "fox" in the target string. Any other subclass of - * SearchIterator can be used in an identical manner. - *


- * UnicodeString target("The quick brown fox jumped over the lazy fox");
- * UnicodeString pattern("fox");
- *
- * SearchIterator *iter = new StringSearch(pattern, target);
- *
- * for (int pos = iter->first(); pos != SearchIterator::DONE; pos = iter->next()) {
- *     printf("Found match at %d pos, length is %d\n", pos, iter.getMatchLength());
- * }
- * 
- * - * @see StringSearch - */ - -class SearchIterator { -public: - /** - * DONE is returned by previous() and next() after all valid - * matches have been returned, and by first() and last() if - * there are no matches at all. - */ - static const int32_t DONE; - - //======================================================================= - // boilerplate - //======================================================================= - - /** - * Destructor - */ - virtual ~SearchIterator(); - - /** copy constructor */ - SearchIterator(const SearchIterator& other); - - /** - * Equality operator. Returns TRUE if both BreakIterators are of the - * same class, have the same behavior, and iterate over the same text. - */ - virtual UBool operator==(const SearchIterator& that) const; - - /** - * Not-equal operator. If operator== returns TRUE, this returns FALSE, - * and vice versa. - */ - UBool operator!=(const SearchIterator& that) const; - - /** - * Returns a newly-constructed RuleBasedBreakIterator with the same - * behavior, and iterating over the same text, as this one. - */ - virtual SearchIterator* clone(void) const = 0; - - /** - * Return a polymorphic class ID for this object. Different subclasses - * will return distinct unequal values. - * @stable - */ - virtual UClassID getDynamicClassID(void) const = 0; - - /** - * Return the first index at which the target text matches the search - * pattern. The iterator is adjusted so that its current index - * (as returned by {@link #getIndex}) is the match posisition if one was found - * and DONE if one was not. - * - * @return The character index of the first match, or DONE if there - * are no matches. - */ - int32_t first(void); - - /** - * Return the first index greater than pos at which the target - * text matches the search pattern. The iterator is adjusted so that its current index - * (as returned by {@link #getIndex}) is the match posisition if one was found - * and DONE if one was not. - * - * @return The character index of the first match following pos, - * or DONE if there are no matches. - */ - int32_t following(int32_t pos); - - /** - * Return the last index in the target text at which it matches - * the search pattern and adjusts the iteration to point to that position. - * - * @return The index of the first match, or DONE if there - * are no matches. - */ - int32_t last(void); - - /** - * Return the first index less than pos at which the target - * text matches the search pattern. The iterator is adjusted so that its current index - * (as returned by {@link #getIndex}) is the match posisition if one was found - * and DONE if one was not. - * - * @return The character index of the first match preceding pos, - * or DONE if there are no matches. - */ - int32_t preceding(int32_t pos); - - /** - * Return the index of the next point at which the text matches the - * search pattern, starting from the current position - *

- * @return The index of the next match after the current position, - * or DONE if there are no more matches. - * - * @see #first - */ - int32_t next(void); - - /** - * Return the index of the previous point at which the text matches - * the search pattern, starting at the current position - * - * @return The index of the previous match before the current position, - * or DONE if there are no more matches. - */ - int32_t previous(void); - - /** - * Return the current index in the text being searched. - * If the iteration has gone past the end of the text - * (or past the beginning for a backwards search), - * {@link #DONE} is returned. - */ - int32_t getIndex(void) const; - /** - * Determines whether overlapping matches are returned. If this - * property is true, matches that begin within the - * boundry of the previous match are considered valid and will - * be returned. For example, when searching for "abab" in the - * target text "ababab", both offsets 0 and 2 will be returned - * as valid matches if this property is true. - *

- * The default setting of this property is true - */ - void setOverlapping(UBool allowOverlap); - - /** - * Determines whether overlapping matches are returned. - * - * @see #setOverlapping - */ - UBool isOverlapping(void) const; - - /** - * Returns the length of text in the target which matches the search - * pattern. This call returns a valid result only after a successful - * call to {@link #first}, {@link #next}, {@link #previous}, or {@link #last}. - * Just after construction, or after a searching method returns - * DONE, this method will return 0. - * - * @return The length of the match in the target text, or 0 if there - * is no match currently. - */ - int32_t getMatchLength(void) const; - - /** - * Set the BreakIterator that will be used to restrict the points - * at which matches are detected. - * - * @param breaker A {@link java.text.BreakIterator BreakIterator} - * that will be used to restrict the points - * at which matches are detected. If a match is found, but the match's start - * or end index is not a boundary as determined by - * the BreakIterator, the match will be rejected and - * another will be searched for. - * - * If this parameter is null, no break - * detection is attempted. - * - * @see #getBreakIterator - */ - /* HSYS : Check, aliasing or owning */ - void setBreakIterator(const BreakIterator* iterator); - - /** - * Returns the BreakIterator that is used to restrict the points - * at which matches are detected. This will be the same object - * that was passed to the constructor or to setBreakIterator. - * Note that null is a legal value; it means that break - * detection should not be attempted. - * - * @see #setBreakIterator - */ - const BreakIterator& getBreakIterator(void) const; - - /** - * Set the target text which should be searched and resets the - * iterator's position to point before the start of the target text. - * This method is useful if you want to re-use an iterator to - * search for the same pattern within a different body of text. - * - * @see #getTarget - */ - virtual void setTarget(const UnicodeString& newText); - - /** - * Set the target text which should be searched and resets the - * iterator's position to point before the start of the target text. - * This method is useful if you want to re-use an iterator to - * search for the same pattern within a different body of text. - * - * @see #getTarget - */ - virtual void adoptTarget(CharacterIterator* iterator); - /** - * Return the target text which is being searched - * - * @see #setTarget - */ - const CharacterIterator& getTarget(void) const; - - /** Reset the iteration. - */ - virtual void reset(void); - - /** - * Returns the text that was matched by the most recent call to - * {@link #first}, {@link #next}, {@link #previous}, or {@link #last}. - * If the iterator is not pointing at a valid match (e.g. just after - * construction or after DONE has been returned, returns - * an empty string. - */ - void getMatchedText(UnicodeString& result); - - //------------------------------------------------------------------- - // Protected interface for subclasses - //------------------------------------------------------------------- - -protected: - SearchIterator(); - - /** - * Constructor for use by subclasses - *

- * @param target The target text to be searched. This is for internal - * use by this class. Subclasses need to maintain their - * own reference to or iterator over the target text - * for use by their {@link #handleNext handleNext} and - * {@link #handlePrev handlePrev} methods. The target will - * be adopted and owned by the SearchIterator object. - * - * @param breaker A {@link BreakIterator} that is used to restrict the points - * at which matches are detected. If handleNext or - * handlePrev finds a match, but the match's start - * or end index is not a boundary as determined by - * the BreakIterator, the match is rejected and - * handleNext or handlePrev is called again. - * If this parameter is null, no break - * detection is attempted. - * - */ - SearchIterator(CharacterIterator* target, - BreakIterator* breaker); -/** - * Abstract method which subclasses override to provide the mechanism - * for finding the next match in the target text. This allows different - * subclasses to provide different search algorithms. - *

- * If a match is found, the implementation should return the index at - * which the match starts and should call {@link #setMatchLength setMatchLength} - * with the number of characters in the target - * text that make up the match. If no match is found, the method - * should return DONE and should not call setMatchLength. - *

- * @param startAt The index in the target text at which the search - * should start. - * - * @see #setMatchLength - */ - virtual int32_t handleNext(int32_t startAt, UErrorCode& status) = 0; - - /** - * Abstract method which subclasses override to provide the mechanism - * for finding the previous match in the target text. This allows different - * subclasses to provide different search algorithms. - *

- * If a match is found, the implementation should return the index at - * which the match starts and should call {@link #setMatchLength setMatchLength} - * with the number of characters in the target - * text that make up the match. If no match is found, the method - * should return DONE and should not call setMatchLength. - *

- * @param startAt The index in the target text at which the search - * should start. - * - * @see #setMatchLength - */ - virtual int32_t handlePrev(int32_t startAt, UErrorCode& status) = 0; - - /** - * Sets the length of the currently matched string in the target text. - * Subclasses' handleNext and handlePrev - * methods should call this when they find a match in the target text. - */ - void setMatchLength(int32_t length); - - //------------------------------------------------------------------- - // Privates - // -private: - /** - * Class ID - */ - static char fgClassID; -private: - /** - * Private value indicating that the iterator is pointing - * before the beginning of the target text. - */ - static const int32_t BEFORE; - - /** - * Internal method used by preceding and following. Sets the index - * to point to the given position, and clears any state that's - * affected. - */ - void setIndex(int32_t pos); - - /** - * Determine whether the target text bounded by start and - * end is one or more whole units of text as determined by - * the current BreakIterator. - */ - UBool isBreakUnit(int32_t start, int32_t end); - - //------------------------------------------------------------------------- - // Private data... - //------------------------------------------------------------------------- - int32_t index; // Current position in the target text - int32_t length; // Length of matched text, or 0 - UBool overlap; // Return overlapping matches? - CharacterIterator* target; // Target text to be searched - BreakIterator* breaker; // Break iterator to constrain matches - UBool backward; -}; - -inline UBool SearchIterator::operator!=(const SearchIterator& that) const -{ - return !operator==(that); -} -#endif -