1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************* 5 * 6 * Copyright (C) 2002-2012, International Business Machines 7 * Corporation and others. All Rights Reserved. 8 * 9 ******************************************************************************* 10 */ 11 12 #ifndef STRENUM_H 13 #define STRENUM_H 14 15 #include "unicode/uobject.h" 16 #include "unicode/unistr.h" 17 18 /** 19 * \file 20 * \brief C++ API: String Enumeration 21 */ 22 23 U_NAMESPACE_BEGIN 24 25 /** 26 * Base class for 'pure' C++ implementations of uenum api. Adds a 27 * method that returns the next UnicodeString since in C++ this can 28 * be a common storage format for strings. 29 * 30 * <p>The model is that the enumeration is over strings maintained by 31 * a 'service.' At any point, the service might change, invalidating 32 * the enumerator (though this is expected to be rare). The iterator 33 * returns an error if this has occurred. Lack of the error is no 34 * guarantee that the service didn't change immediately after the 35 * call, so the returned string still might not be 'valid' on 36 * subsequent use.</p> 37 * 38 * <p>Strings may take the form of const char*, const char16_t*, or const 39 * UnicodeString*. The type you get is determine by the variant of 40 * 'next' that you call. In general the StringEnumeration is 41 * optimized for one of these types, but all StringEnumerations can 42 * return all types. Returned strings are each terminated with a NUL. 43 * Depending on the service data, they might also include embedded NUL 44 * characters, so API is provided to optionally return the true 45 * length, counting the embedded NULs but not counting the terminating 46 * NUL.</p> 47 * 48 * <p>The pointers returned by next, unext, and snext become invalid 49 * upon any subsequent call to the enumeration's destructor, next, 50 * unext, snext, or reset.</p> 51 * 52 * ICU 2.8 adds some default implementations and helper functions 53 * for subclasses. 54 * 55 * @stable ICU 2.4 56 */ 57 class U_COMMON_API StringEnumeration : public UObject { 58 public: 59 /** 60 * Destructor. 61 * @stable ICU 2.4 62 */ 63 virtual ~StringEnumeration(); 64 65 /** 66 * Clone this object, an instance of a subclass of StringEnumeration. 67 * Clones can be used concurrently in multiple threads. 68 * If a subclass does not implement clone(), or if an error occurs, 69 * then NULL is returned. 70 * The clone functions in all subclasses return a base class pointer 71 * because some compilers do not support covariant (same-as-this) 72 * return types; cast to the appropriate subclass if necessary. 73 * The caller must delete the clone. 74 * 75 * @return a clone of this object 76 * 77 * @see getDynamicClassID 78 * @stable ICU 2.8 79 */ 80 virtual StringEnumeration *clone() const; 81 82 /** 83 * <p>Return the number of elements that the iterator traverses. If 84 * the iterator is out of sync with its service, status is set to 85 * U_ENUM_OUT_OF_SYNC_ERROR, and the return value is zero.</p> 86 * 87 * <p>The return value will not change except possibly as a result of 88 * a subsequent call to reset, or if the iterator becomes out of sync.</p> 89 * 90 * <p>This is a convenience function. It can end up being very 91 * expensive as all the items might have to be pre-fetched 92 * (depending on the storage format of the data being 93 * traversed).</p> 94 * 95 * @param status the error code. 96 * @return number of elements in the iterator. 97 * 98 * @stable ICU 2.4 */ 99 virtual int32_t count(UErrorCode& status) const = 0; 100 101 /** 102 * <p>Returns the next element as a NUL-terminated char*. If there 103 * are no more elements, returns NULL. If the resultLength pointer 104 * is not NULL, the length of the string (not counting the 105 * terminating NUL) is returned at that address. If an error 106 * status is returned, the value at resultLength is undefined.</p> 107 * 108 * <p>The returned pointer is owned by this iterator and must not be 109 * deleted by the caller. The pointer is valid until the next call 110 * to next, unext, snext, reset, or the enumerator's destructor.</p> 111 * 112 * <p>If the iterator is out of sync with its service, status is set 113 * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.</p> 114 * 115 * <p>If the native service string is a char16_t* string, it is 116 * converted to char* with the invariant converter. If the 117 * conversion fails (because a character cannot be converted) then 118 * status is set to U_INVARIANT_CONVERSION_ERROR and the return 119 * value is undefined (though not NULL).</p> 120 * 121 * Starting with ICU 2.8, the default implementation calls snext() 122 * and handles the conversion. 123 * Either next() or snext() must be implemented differently by a subclass. 124 * 125 * @param status the error code. 126 * @param resultLength a pointer to receive the length, can be NULL. 127 * @return a pointer to the string, or NULL. 128 * 129 * @stable ICU 2.4 130 */ 131 virtual const char* next(int32_t *resultLength, UErrorCode& status); 132 133 /** 134 * <p>Returns the next element as a NUL-terminated char16_t*. If there 135 * are no more elements, returns NULL. If the resultLength pointer 136 * is not NULL, the length of the string (not counting the 137 * terminating NUL) is returned at that address. If an error 138 * status is returned, the value at resultLength is undefined.</p> 139 * 140 * <p>The returned pointer is owned by this iterator and must not be 141 * deleted by the caller. The pointer is valid until the next call 142 * to next, unext, snext, reset, or the enumerator's destructor.</p> 143 * 144 * <p>If the iterator is out of sync with its service, status is set 145 * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.</p> 146 * 147 * Starting with ICU 2.8, the default implementation calls snext() 148 * and handles the conversion. 149 * 150 * @param status the error code. 151 * @param resultLength a ponter to receive the length, can be NULL. 152 * @return a pointer to the string, or NULL. 153 * 154 * @stable ICU 2.4 155 */ 156 virtual const char16_t* unext(int32_t *resultLength, UErrorCode& status); 157 158 /** 159 * <p>Returns the next element a UnicodeString*. If there are no 160 * more elements, returns NULL.</p> 161 * 162 * <p>The returned pointer is owned by this iterator and must not be 163 * deleted by the caller. The pointer is valid until the next call 164 * to next, unext, snext, reset, or the enumerator's destructor.</p> 165 * 166 * <p>If the iterator is out of sync with its service, status is set 167 * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.</p> 168 * 169 * Starting with ICU 2.8, the default implementation calls next() 170 * and handles the conversion. 171 * Either next() or snext() must be implemented differently by a subclass. 172 * 173 * @param status the error code. 174 * @return a pointer to the string, or NULL. 175 * 176 * @stable ICU 2.4 177 */ 178 virtual const UnicodeString* snext(UErrorCode& status); 179 180 /** 181 * <p>Resets the iterator. This re-establishes sync with the 182 * service and rewinds the iterator to start at the first 183 * element.</p> 184 * 185 * <p>Previous pointers returned by next, unext, or snext become 186 * invalid, and the value returned by count might change.</p> 187 * 188 * @param status the error code. 189 * 190 * @stable ICU 2.4 191 */ 192 virtual void reset(UErrorCode& status) = 0; 193 194 /** 195 * Compares this enumeration to other to check if both are equal 196 * 197 * @param that The other string enumeration to compare this object to 198 * @return TRUE if the enumerations are equal. FALSE if not. 199 * @stable ICU 3.6 200 */ 201 virtual UBool operator==(const StringEnumeration& that)const; 202 /** 203 * Compares this enumeration to other to check if both are not equal 204 * 205 * @param that The other string enumeration to compare this object to 206 * @return TRUE if the enumerations are equal. FALSE if not. 207 * @stable ICU 3.6 208 */ 209 virtual UBool operator!=(const StringEnumeration& that)const; 210 211 protected: 212 /** 213 * UnicodeString field for use with default implementations and subclasses. 214 * @stable ICU 2.8 215 */ 216 UnicodeString unistr; 217 /** 218 * char * default buffer for use with default implementations and subclasses. 219 * @stable ICU 2.8 220 */ 221 char charsBuffer[32]; 222 /** 223 * char * buffer for use with default implementations and subclasses. 224 * Allocated in constructor and in ensureCharsCapacity(). 225 * @stable ICU 2.8 226 */ 227 char *chars; 228 /** 229 * Capacity of chars, for use with default implementations and subclasses. 230 * @stable ICU 2.8 231 */ 232 int32_t charsCapacity; 233 234 /** 235 * Default constructor for use with default implementations and subclasses. 236 * @stable ICU 2.8 237 */ 238 StringEnumeration(); 239 240 /** 241 * Ensures that chars is at least as large as the requested capacity. 242 * For use with default implementations and subclasses. 243 * 244 * @param capacity Requested capacity. 245 * @param status ICU in/out error code. 246 * @stable ICU 2.8 247 */ 248 void ensureCharsCapacity(int32_t capacity, UErrorCode &status); 249 250 /** 251 * Converts s to Unicode and sets unistr to the result. 252 * For use with default implementations and subclasses, 253 * especially for implementations of snext() in terms of next(). 254 * This is provided with a helper function instead of a default implementation 255 * of snext() to avoid potential infinite loops between next() and snext(). 256 * 257 * For example: 258 * \code 259 * const UnicodeString* snext(UErrorCode& status) { 260 * int32_t resultLength=0; 261 * const char *s=next(&resultLength, status); 262 * return setChars(s, resultLength, status); 263 * } 264 * \endcode 265 * 266 * @param s String to be converted to Unicode. 267 * @param length Length of the string. 268 * @param status ICU in/out error code. 269 * @return A pointer to unistr. 270 * @stable ICU 2.8 271 */ 272 UnicodeString *setChars(const char *s, int32_t length, UErrorCode &status); 273 }; 274 275 U_NAMESPACE_END 276 277 /* STRENUM_H */ 278 #endif 279