1// Copyright (C) 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4**********************************************************************
5* Copyright (c) 2004-2006, International Business Machines
6* Corporation and others.  All Rights Reserved.
7**********************************************************************
8* Author: Alan Liu
9* Created: April 26, 2004
10* Since: ICU 3.0
11**********************************************************************
12*/
13#ifndef __CURRENCYAMOUNT_H__
14#define __CURRENCYAMOUNT_H__
15
16#include "unicode/utypes.h"
17
18#if !UCONFIG_NO_FORMATTING
19
20#include "unicode/measure.h"
21#include "unicode/currunit.h"
22
23/**
24 * \file
25 * \brief C++ API: Currency Amount Object.
26 */
27
28U_NAMESPACE_BEGIN
29
30/**
31 *
32 * A currency together with a numeric amount, such as 200 USD.
33 *
34 * @author Alan Liu
35 * @stable ICU 3.0
36 */
37class U_I18N_API CurrencyAmount: public Measure {
38 public:
39    /**
40     * Construct an object with the given numeric amount and the given
41     * ISO currency code.
42     * @param amount a numeric object; amount.isNumeric() must be TRUE
43     * @param isoCode the 3-letter ISO 4217 currency code; must not be
44     * NULL and must have length 3
45     * @param ec input-output error code. If the amount or the isoCode
46     * is invalid, then this will be set to a failing value.
47     * @stable ICU 3.0
48     */
49    CurrencyAmount(const Formattable& amount, const UChar* isoCode,
50                   UErrorCode &ec);
51
52    /**
53     * Construct an object with the given numeric amount and the given
54     * ISO currency code.
55     * @param amount the amount of the given currency
56     * @param isoCode the 3-letter ISO 4217 currency code; must not be
57     * NULL and must have length 3
58     * @param ec input-output error code. If the isoCode is invalid,
59     * then this will be set to a failing value.
60     * @stable ICU 3.0
61     */
62    CurrencyAmount(double amount, const UChar* isoCode,
63                   UErrorCode &ec);
64
65    /**
66     * Copy constructor
67     * @stable ICU 3.0
68     */
69    CurrencyAmount(const CurrencyAmount& other);
70
71    /**
72     * Assignment operator
73     * @stable ICU 3.0
74     */
75    CurrencyAmount& operator=(const CurrencyAmount& other);
76
77    /**
78     * Return a polymorphic clone of this object.  The result will
79     * have the same class as returned by getDynamicClassID().
80     * @stable ICU 3.0
81     */
82    virtual UObject* clone() const;
83
84    /**
85     * Destructor
86     * @stable ICU 3.0
87     */
88    virtual ~CurrencyAmount();
89
90    /**
91     * Returns a unique class ID for this object POLYMORPHICALLY.
92     * This method implements a simple form of RTTI used by ICU.
93     * @return The class ID for this object. All objects of a given
94     * class have the same class ID.  Objects of other classes have
95     * different class IDs.
96     * @stable ICU 3.0
97     */
98    virtual UClassID getDynamicClassID() const;
99
100    /**
101     * Returns the class ID for this class. This is used to compare to
102     * the return value of getDynamicClassID().
103     * @return The class ID for all objects of this class.
104     * @stable ICU 3.0
105     */
106    static UClassID U_EXPORT2 getStaticClassID();
107
108    /**
109     * Return the currency unit object of this object.
110     * @stable ICU 3.0
111     */
112    inline const CurrencyUnit& getCurrency() const;
113
114    /**
115     * Return the ISO currency code of this object.
116     * @stable ICU 3.0
117     */
118    inline const UChar* getISOCurrency() const;
119};
120
121inline const CurrencyUnit& CurrencyAmount::getCurrency() const {
122    return (const CurrencyUnit&) getUnit();
123}
124
125inline const UChar* CurrencyAmount::getISOCurrency() const {
126    return getCurrency().getISOCurrency();
127}
128
129U_NAMESPACE_END
130
131#endif // !UCONFIG_NO_FORMATTING
132#endif // __CURRENCYAMOUNT_H__
133