154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/*
254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*******************************************************************************
354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*   Copyright (C) 2012-2014, International Business Machines
554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   Corporation and others.  All Rights Reserved.
654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*******************************************************************************
854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   file name:  listformatter.h
954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   encoding:   US-ASCII
1054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   tab size:   8 (not used)
1154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   indentation:4
1254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
1354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   created on: 20120426
1454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   created by: Umesh P. Nair
1554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*/
1654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
1754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifndef __LISTFORMATTER_H__
1854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define __LISTFORMATTER_H__
1954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "unicode/utypes.h"
218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/unistr.h"
2354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/locid.h"
2454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
2554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_BEGIN
2654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
2754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/** @internal */
2854dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusclass Hashtable;
2954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/** @internal */
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct ListFormatInternal;
32fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
33fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/* The following can't be #ifndef U_HIDE_INTERNAL_API, needed for other .h file declarations */
3454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/** @internal */
3554dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstruct ListFormatData : public UMemory {
3654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UnicodeString twoPattern;
3754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UnicodeString startPattern;
3854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UnicodeString middlePattern;
3954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UnicodeString endPattern;
4054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  ListFormatData(const UnicodeString& two, const UnicodeString& start, const UnicodeString& middle, const UnicodeString& end) :
4254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      twoPattern(two), startPattern(start), middlePattern(middle), endPattern(end) {}
4354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius};
4454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/**
4754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * \file
4854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * \brief C++ API: API for formatting a list.
4954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */
5054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
5154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
5254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/**
5354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * An immutable class for formatting a list, using data from CLDR (or supplied
5454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * separately).
5554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *
5654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Example: Input data ["Alice", "Bob", "Charlie", "Delta"] will be formatted
5754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * as "Alice, Bob, Charlie and Delta" in English.
5854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *
5954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * The ListFormatter class is not intended for public subclassing.
60fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * @stable ICU 50
6154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */
6254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusclass U_COMMON_API ListFormatter : public UObject{
6354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
6454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  public:
6559d709d503bab6e2b61931737e662dd293b40578ccornelius
6659d709d503bab6e2b61931737e662dd293b40578ccornelius    /**
6759d709d503bab6e2b61931737e662dd293b40578ccornelius     * Copy constructor.
6859d709d503bab6e2b61931737e662dd293b40578ccornelius     * @draft ICU 52
6959d709d503bab6e2b61931737e662dd293b40578ccornelius     */
7059d709d503bab6e2b61931737e662dd293b40578ccornelius    ListFormatter(const ListFormatter&);
7159d709d503bab6e2b61931737e662dd293b40578ccornelius
7259d709d503bab6e2b61931737e662dd293b40578ccornelius    /**
7359d709d503bab6e2b61931737e662dd293b40578ccornelius     * Assignment operator.
7459d709d503bab6e2b61931737e662dd293b40578ccornelius     * @draft ICU 52
7559d709d503bab6e2b61931737e662dd293b40578ccornelius     */
7659d709d503bab6e2b61931737e662dd293b40578ccornelius    ListFormatter& operator=(const ListFormatter& other);
7759d709d503bab6e2b61931737e662dd293b40578ccornelius
7854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
7954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * Creates a ListFormatter appropriate for the default locale.
8054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *
8154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param errorCode ICU error code, set if no data available for default locale.
8254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @return Pointer to a ListFormatter object for the default locale,
8354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *     created from internal data derived from CLDR data.
84fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * @stable ICU 50
8554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
8654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static ListFormatter* createInstance(UErrorCode& errorCode);
8754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
8854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
8954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * Creates a ListFormatter appropriate for a locale.
9054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *
9154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param locale The locale.
9254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param errorCode ICU error code, set if no data available for the given locale.
9354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @return A ListFormatter object created from internal data derived from
9454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *     CLDR data.
95fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * @stable ICU 50
9654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
9754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static ListFormatter* createInstance(const Locale& locale, UErrorCode& errorCode);
9854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
9959d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef U_HIDE_INTERNAL_API
10059d709d503bab6e2b61931737e662dd293b40578ccornelius    /**
10159d709d503bab6e2b61931737e662dd293b40578ccornelius     * Creates a ListFormatter appropriate for a locale and style.
10259d709d503bab6e2b61931737e662dd293b40578ccornelius     *
10359d709d503bab6e2b61931737e662dd293b40578ccornelius     * @param locale The locale.
10459d709d503bab6e2b61931737e662dd293b40578ccornelius     * @param style the style, either "standard", "duration", or "duration-short"
10559d709d503bab6e2b61931737e662dd293b40578ccornelius     * @param errorCode ICU error code, set if no data available for the given locale.
10659d709d503bab6e2b61931737e662dd293b40578ccornelius     * @return A ListFormatter object created from internal data derived from
10759d709d503bab6e2b61931737e662dd293b40578ccornelius     *     CLDR data.
10859d709d503bab6e2b61931737e662dd293b40578ccornelius     * @internal
10959d709d503bab6e2b61931737e662dd293b40578ccornelius     */
11059d709d503bab6e2b61931737e662dd293b40578ccornelius    static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode);
11159d709d503bab6e2b61931737e662dd293b40578ccornelius#endif  /* U_HIDE_INTERNAL_API */
11254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
11354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
11454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * Destructor.
11554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *
116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * @stable ICU 50
11754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
11854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    virtual ~ListFormatter();
11954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
12054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
12154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
12254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * Formats a list of strings.
12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     *
12454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param items An array of strings to be combined and formatted.
12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param n_items Length of the array items.
12654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param appendTo The string to which the result should be appended to.
12754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param errorCode ICU error code, set if there is an error.
12854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @return Formatted string combining the elements of items, appended to appendTo.
129fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * @stable ICU 50
13054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
13154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UnicodeString& format(const UnicodeString items[], int32_t n_items,
13254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString& appendTo, UErrorCode& errorCode) const;
13354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
13459d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef U_HIDE_INTERNAL_API
13554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
136fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      @internal for MeasureFormat
137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    */
138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString& format(
139fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            const UnicodeString items[],
140fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t n_items,
141fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UnicodeString& appendTo,
142fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t index,
143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t &offset,
144fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UErrorCode& errorCode) const;
145fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
146fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * @internal constructor made public for testing.
147fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ListFormatter(const ListFormatData &data);
149fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
15054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @internal constructor made public for testing.
15154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
152fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ListFormatter(const ListFormatInternal* listFormatterInternal);
15359d709d503bab6e2b61931737e662dd293b40578ccornelius#endif  /* U_HIDE_INTERNAL_API */
15454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
15554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  private:
15654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static void initializeHash(UErrorCode& errorCode);
157fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode);
15854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
15954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ListFormatter();
16054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
161fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ListFormatInternal* owned;
162fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const ListFormatInternal* data;
16354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius};
16454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
16554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_END
16654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
16754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
168