/src/icu/source/common/usetiter.cpp
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | // © 2016 and later: Unicode, Inc. and others.  | 
2  |  | // License & terms of use: http://www.unicode.org/copyright.html  | 
3  |  | /*  | 
4  |  | **********************************************************************  | 
5  |  | * Copyright (c) 2002-2006, International Business Machines  | 
6  |  | * Corporation and others.  All Rights Reserved.  | 
7  |  | **********************************************************************  | 
8  |  | */  | 
9  |  | #include "unicode/usetiter.h"  | 
10  |  | #include "unicode/uniset.h"  | 
11  |  | #include "unicode/unistr.h"  | 
12  |  | #include "uvector.h"  | 
13  |  |  | 
14  |  | U_NAMESPACE_BEGIN  | 
15  |  |  | 
16  |  | UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSetIterator)  | 
17  |  |  | 
18  |  | /**  | 
19  |  |  * Create an iterator  | 
20  |  |  * @param set set to iterate over  | 
21  |  |  */  | 
22  | 0  | UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) { | 
23  | 0  |     cpString  = NULL;  | 
24  | 0  |     reset(uSet);  | 
25  | 0  | }  | 
26  |  |  | 
27  |  | /**  | 
28  |  |  * Create an iterator. Convenience for when the contents are to be set later.  | 
29  |  |  */  | 
30  | 0  | UnicodeSetIterator::UnicodeSetIterator() { | 
31  | 0  |     this->set = NULL;  | 
32  | 0  |     cpString  = NULL;  | 
33  | 0  |     reset();  | 
34  | 0  | }  | 
35  |  |  | 
36  | 0  | UnicodeSetIterator::~UnicodeSetIterator() { | 
37  | 0  |     delete cpString;  | 
38  | 0  | }  | 
39  |  |  | 
40  |  | /**  | 
41  |  |  * Returns the next element in the set.  | 
42  |  |  * @return true if there was another element in the set.  | 
43  |  |  * if so, if codepoint == IS_STRING, the value is a string in the string field  | 
44  |  |  * else the value is a single code point in the codepoint field.  | 
45  |  |  * <br>You are guaranteed that the codepoints are in sorted order, and the strings are in sorted order,  | 
46  |  |  * and that all code points are returned before any strings are returned.  | 
47  |  |  * <br>Note also that the codepointEnd is undefined after calling this method.  | 
48  |  |  */  | 
49  | 0  | UBool UnicodeSetIterator::next() { | 
50  | 0  |     if (nextElement <= endElement) { | 
51  | 0  |         codepoint = codepointEnd = nextElement++;  | 
52  | 0  |         string = NULL;  | 
53  | 0  |         return TRUE;  | 
54  | 0  |     }  | 
55  | 0  |     if (range < endRange) { | 
56  | 0  |         loadRange(++range);  | 
57  | 0  |         codepoint = codepointEnd = nextElement++;  | 
58  | 0  |         string = NULL;  | 
59  | 0  |         return TRUE;  | 
60  | 0  |     }  | 
61  |  |  | 
62  | 0  |     if (nextString >= stringCount) return FALSE;  | 
63  | 0  |     codepoint = (UChar32)IS_STRING; // signal that value is actually a string  | 
64  | 0  |     string = (const UnicodeString*) set->strings->elementAt(nextString++);  | 
65  | 0  |     return TRUE;  | 
66  | 0  | }  | 
67  |  |  | 
68  |  | /**  | 
69  |  |  * @return true if there was another element in the set.  | 
70  |  |  * if so, if codepoint == IS_STRING, the value is a string in the string field  | 
71  |  |  * else the value is a range of codepoints in the <codepoint, codepointEnd> fields.  | 
72  |  |  * <br>Note that the codepoints are in sorted order, and the strings are in sorted order,  | 
73  |  |  * and that all code points are returned before any strings are returned.  | 
74  |  |  * <br>You are guaranteed that the ranges are in sorted order, and the strings are in sorted order,  | 
75  |  |  * and that all ranges are returned before any strings are returned.  | 
76  |  |  * <br>You are also guaranteed that ranges are disjoint and non-contiguous.  | 
77  |  |  * <br>Note also that the codepointEnd is undefined after calling this method.  | 
78  |  |  */  | 
79  | 0  | UBool UnicodeSetIterator::nextRange() { | 
80  | 0  |     string = NULL;  | 
81  | 0  |     if (nextElement <= endElement) { | 
82  | 0  |         codepointEnd = endElement;  | 
83  | 0  |         codepoint = nextElement;  | 
84  | 0  |         nextElement = endElement+1;  | 
85  | 0  |         return TRUE;  | 
86  | 0  |     }  | 
87  | 0  |     if (range < endRange) { | 
88  | 0  |         loadRange(++range);  | 
89  | 0  |         codepointEnd = endElement;  | 
90  | 0  |         codepoint = nextElement;  | 
91  | 0  |         nextElement = endElement+1;  | 
92  | 0  |         return TRUE;  | 
93  | 0  |     }  | 
94  |  |  | 
95  | 0  |     if (nextString >= stringCount) return FALSE;  | 
96  | 0  |     codepoint = (UChar32)IS_STRING; // signal that value is actually a string  | 
97  | 0  |     string = (const UnicodeString*) set->strings->elementAt(nextString++);  | 
98  | 0  |     return TRUE;  | 
99  | 0  | }  | 
100  |  |  | 
101  |  | /**  | 
102  |  |  *@param set the set to iterate over. This allows reuse of the iterator.  | 
103  |  |  */  | 
104  | 0  | void UnicodeSetIterator::reset(const UnicodeSet& uSet) { | 
105  | 0  |     this->set = &uSet;  | 
106  | 0  |     reset();  | 
107  | 0  | }  | 
108  |  |  | 
109  |  | /**  | 
110  |  |  * Resets to the start, to allow the iteration to start over again.  | 
111  |  |  */  | 
112  | 0  | void UnicodeSetIterator::reset() { | 
113  | 0  |     if (set == NULL) { | 
114  |  |         // Set up indices to empty iteration  | 
115  | 0  |         endRange = -1;  | 
116  | 0  |         stringCount = 0;  | 
117  | 0  |     } else { | 
118  | 0  |         endRange = set->getRangeCount() - 1;  | 
119  | 0  |         stringCount = set->stringsSize();  | 
120  | 0  |     }  | 
121  | 0  |     range = 0;  | 
122  | 0  |     endElement = -1;  | 
123  | 0  |     nextElement = 0;              | 
124  | 0  |     if (endRange >= 0) { | 
125  | 0  |         loadRange(range);  | 
126  | 0  |     }  | 
127  | 0  |     nextString = 0;  | 
128  | 0  |     string = NULL;  | 
129  | 0  | }  | 
130  |  |  | 
131  | 0  | void UnicodeSetIterator::loadRange(int32_t iRange) { | 
132  | 0  |     nextElement = set->getRangeStart(iRange);  | 
133  | 0  |     endElement = set->getRangeEnd(iRange);  | 
134  | 0  | }  | 
135  |  |  | 
136  |  |  | 
137  | 0  | const UnicodeString& UnicodeSetIterator::getString()  { | 
138  | 0  |     if (string==NULL && codepoint!=(UChar32)IS_STRING) { | 
139  | 0  |        if (cpString == NULL) { | 
140  | 0  |           cpString = new UnicodeString();  | 
141  | 0  |        }  | 
142  | 0  |        if (cpString != NULL) { | 
143  | 0  |           cpString->setTo((UChar32)codepoint);  | 
144  | 0  |        }  | 
145  | 0  |        string = cpString;  | 
146  | 0  |     }  | 
147  | 0  |     return *string;  | 
148  | 0  | }  | 
149  |  |  | 
150  |  | U_NAMESPACE_END  | 
151  |  |  | 
152  |  | //eof  |