Spaces:
Sleeping
Sleeping
// © 2016 and later: Unicode, Inc. and others. | |
// License & terms of use: http://www.unicode.org/copyright.html | |
/* | |
******************************************************************************* | |
* | |
* Copyright (C) 2012-2016, International Business Machines | |
* Corporation and others. All Rights Reserved. | |
* | |
******************************************************************************* | |
* file name: listformatter.h | |
* encoding: UTF-8 | |
* tab size: 8 (not used) | |
* indentation:4 | |
* | |
* created on: 20120426 | |
* created by: Umesh P. Nair | |
*/ | |
U_NAMESPACE_BEGIN | |
class FieldPositionHandler; | |
class FormattedListData; | |
class ListFormatter; | |
/** @internal */ | |
class Hashtable; | |
/** @internal */ | |
struct ListFormatInternal; | |
/* The following can't be #ifndef U_HIDE_INTERNAL_API, needed for other .h file declarations */ | |
/** | |
* @internal | |
* \cond | |
*/ | |
struct ListFormatData : public UMemory { | |
UnicodeString twoPattern; | |
UnicodeString startPattern; | |
UnicodeString middlePattern; | |
UnicodeString endPattern; | |
Locale locale; | |
ListFormatData(const UnicodeString& two, const UnicodeString& start, const UnicodeString& middle, const UnicodeString& end, | |
const Locale& loc) : | |
twoPattern(two), startPattern(start), middlePattern(middle), endPattern(end), locale(loc) {} | |
}; | |
/** \endcond */ | |
/** | |
* \file | |
* \brief C++ API: API for formatting a list. | |
*/ | |
/** | |
* An immutable class containing the result of a list formatting operation. | |
* | |
* Instances of this class are immutable and thread-safe. | |
* | |
* When calling nextPosition(): | |
* The fields are returned from start to end. The special field category | |
* UFIELD_CATEGORY_LIST_SPAN is used to indicate which argument | |
* was inserted at the given position. The span category will | |
* always occur before the corresponding instance of UFIELD_CATEGORY_LIST | |
* in the nextPosition() iterator. | |
* | |
* Not intended for public subclassing. | |
* | |
* @stable ICU 64 | |
*/ | |
class U_I18N_API FormattedList : public UMemory, public FormattedValue { | |
public: | |
/** | |
* Default constructor; makes an empty FormattedList. | |
* @stable ICU 64 | |
*/ | |
FormattedList() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} | |
/** | |
* Move constructor: Leaves the source FormattedList in an undefined state. | |
* @stable ICU 64 | |
*/ | |
FormattedList(FormattedList&& src) noexcept; | |
/** | |
* Destruct an instance of FormattedList. | |
* @stable ICU 64 | |
*/ | |
virtual ~FormattedList() override; | |
/** Copying not supported; use move constructor instead. */ | |
FormattedList(const FormattedList&) = delete; | |
/** Copying not supported; use move assignment instead. */ | |
FormattedList& operator=(const FormattedList&) = delete; | |
/** | |
* Move assignment: Leaves the source FormattedList in an undefined state. | |
* @stable ICU 64 | |
*/ | |
FormattedList& operator=(FormattedList&& src) noexcept; | |
/** @copydoc FormattedValue::toString() */ | |
UnicodeString toString(UErrorCode& status) const override; | |
/** @copydoc FormattedValue::toTempString() */ | |
UnicodeString toTempString(UErrorCode& status) const override; | |
/** @copydoc FormattedValue::appendTo() */ | |
Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override; | |
/** @copydoc FormattedValue::nextPosition() */ | |
UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override; | |
private: | |
FormattedListData *fData; | |
UErrorCode fErrorCode; | |
explicit FormattedList(FormattedListData *results) | |
: fData(results), fErrorCode(U_ZERO_ERROR) {} | |
explicit FormattedList(UErrorCode errorCode) | |
: fData(nullptr), fErrorCode(errorCode) {} | |
friend class ListFormatter; | |
}; | |
/** | |
* An immutable class for formatting a list, using data from CLDR (or supplied | |
* separately). | |
* | |
* Example: Input data ["Alice", "Bob", "Charlie", "Delta"] will be formatted | |
* as "Alice, Bob, Charlie and Delta" in English. | |
* | |
* The ListFormatter class is not intended for public subclassing. | |
* @stable ICU 50 | |
*/ | |
class U_I18N_API ListFormatter : public UObject{ | |
public: | |
/** | |
* Copy constructor. | |
* @stable ICU 52 | |
*/ | |
ListFormatter(const ListFormatter&); | |
/** | |
* Assignment operator. | |
* @stable ICU 52 | |
*/ | |
ListFormatter& operator=(const ListFormatter& other); | |
/** | |
* Creates a ListFormatter appropriate for the default locale. | |
* | |
* @param errorCode ICU error code, set if no data available for default locale. | |
* @return Pointer to a ListFormatter object for the default locale, | |
* created from internal data derived from CLDR data. | |
* @stable ICU 50 | |
*/ | |
static ListFormatter* createInstance(UErrorCode& errorCode); | |
/** | |
* Creates a ListFormatter appropriate for a locale. | |
* | |
* @param locale The locale. | |
* @param errorCode ICU error code, set if no data available for the given locale. | |
* @return A ListFormatter object created from internal data derived from | |
* CLDR data. | |
* @stable ICU 50 | |
*/ | |
static ListFormatter* createInstance(const Locale& locale, UErrorCode& errorCode); | |
/** | |
* Creates a ListFormatter for the given locale, list type, and style. | |
* | |
* @param locale The locale. | |
* @param type The type of list formatting to use. | |
* @param width The width of formatting to use. | |
* @param errorCode ICU error code, set if no data available for the given locale. | |
* @return A ListFormatter object created from internal data derived from CLDR data. | |
* @stable ICU 67 | |
*/ | |
static ListFormatter* createInstance( | |
const Locale& locale, UListFormatterType type, UListFormatterWidth width, UErrorCode& errorCode); | |
/** | |
* Destructor. | |
* | |
* @stable ICU 50 | |
*/ | |
virtual ~ListFormatter(); | |
/** | |
* Formats a list of strings. | |
* | |
* @param items An array of strings to be combined and formatted. | |
* @param n_items Length of the array items. | |
* @param appendTo The string to which the result should be appended to. | |
* @param errorCode ICU error code, set if there is an error. | |
* @return Formatted string combining the elements of items, appended to appendTo. | |
* @stable ICU 50 | |
*/ | |
UnicodeString& format(const UnicodeString items[], int32_t n_items, | |
UnicodeString& appendTo, UErrorCode& errorCode) const; | |
/** | |
* Formats a list of strings to a FormattedList, which exposes field | |
* position information. The FormattedList contains more information than | |
* a FieldPositionIterator. | |
* | |
* @param items An array of strings to be combined and formatted. | |
* @param n_items Length of the array items. | |
* @param errorCode ICU error code returned here. | |
* @return A FormattedList containing field information. | |
* @stable ICU 64 | |
*/ | |
FormattedList formatStringsToValue( | |
const UnicodeString items[], | |
int32_t n_items, | |
UErrorCode& errorCode) const; | |
/** | |
@internal for MeasureFormat | |
*/ | |
UnicodeString& format( | |
const UnicodeString items[], | |
int32_t n_items, | |
UnicodeString& appendTo, | |
int32_t index, | |
int32_t &offset, | |
UErrorCode& errorCode) const; | |
/** | |
* @internal constructor made public for testing. | |
*/ | |
ListFormatter(const ListFormatData &data, UErrorCode &errorCode); | |
/** | |
* @internal constructor made public for testing. | |
*/ | |
ListFormatter(const ListFormatInternal* listFormatterInternal); | |
private: | |
/** | |
* Creates a ListFormatter appropriate for a locale and style. | |
* | |
* @param locale The locale. | |
* @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short" | |
*/ | |
static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode); | |
static void initializeHash(UErrorCode& errorCode); | |
static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode); | |
struct U_HIDDEN ListPatternsSink; | |
static ListFormatInternal* loadListFormatInternal(const Locale& locale, const char* style, UErrorCode& errorCode); | |
ListFormatter() = delete; | |
ListFormatInternal* owned; | |
const ListFormatInternal* data; | |
}; | |
U_NAMESPACE_END | |