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