/*
*******************************************************************************
* Copyright (C) 2015, International Business Machines
* Corporation and others.  All Rights Reserved.
*******************************************************************************
* digitaffix.h
*
* created on: 2015jan06
* created by: Travis Keep
*/

#ifndef __DIGITAFFIX_H__
#define __DIGITAFFIX_H__

#include "unicode/unistr.h"
#include "unicode/unum.h"
#include "unicode/uobject.h"
#include "unicode/utypes.h"

U_NAMESPACE_BEGIN

class FieldPositionHandler;

/**
 * A prefix or suffix of a formatted number.
 */
class U_I18N_API DigitAffix : public UMemory {
public:

    /**
     * Creates an empty DigitAffix.
     */
    DigitAffix();

    /**
     * Creates a DigitAffix containing given UChars where all of it has
     * a field type of fieldId.
     */
    DigitAffix(
            const UChar *value,
            int32_t charCount,
            int32_t fieldId=UNUM_FIELD_COUNT);

    /**
     * Makes this affix be the empty string.
     */
    void remove();

    /**
     * Append value to this affix. If fieldId is present, the appended
     * string is considered to be the type fieldId.
     */
    void appendUChar(UChar value, int32_t fieldId=UNUM_FIELD_COUNT);

    /**
     * Append value to this affix. If fieldId is present, the appended
     * string is considered to be the type fieldId.
     */
    void append(const UnicodeString &value, int32_t fieldId=UNUM_FIELD_COUNT);

    /**
     * Sets this affix to given string. The entire string
     * is considered to be the type fieldId.
     */
    void setTo(const UnicodeString &value, int32_t fieldId=UNUM_FIELD_COUNT);

    /**
     * Append value to this affix. If fieldId is present, the appended
     * string is considered to be the type fieldId.
     */
    void append(const UChar *value, int32_t charCount, int32_t fieldId=UNUM_FIELD_COUNT);

    /**
     * Formats this affix.
     */
    UnicodeString &format(
            FieldPositionHandler &handler, UnicodeString &appendTo) const;
    int32_t countChar32() const { return fAffix.countChar32(); }

    /**
     * Returns this affix as a unicode string.
     */
    const UnicodeString & toString() const { return fAffix; }

    /**
     * Returns TRUE if this object equals rhs.
     */
    UBool equals(const DigitAffix &rhs) const {
        return ((fAffix == rhs.fAffix) && (fAnnotations == rhs.fAnnotations));
    }
private:
    UnicodeString fAffix;
    UnicodeString fAnnotations;
};


U_NAMESPACE_END

#endif  // __DIGITAFFIX_H__
