1/*
2 ********************************************************************************
3 * Copyright (C) 2003-2013, International Business Machines Corporation
4 * and others. All Rights Reserved.
5 ********************************************************************************
6 *
7 * File BUDDHCAL.H
8 *
9 * Modification History:
10 *
11 *   Date        Name        Description
12 *   05/13/2003  srl          copied from gregocal.h
13 *   06/29/2007  srl          copied from buddhcal.h
14 ********************************************************************************
15 */
16
17#ifndef TAIWNCAL_H
18#define TAIWNCAL_H
19
20#include "unicode/utypes.h"
21
22#if !UCONFIG_NO_FORMATTING
23
24#include "unicode/calendar.h"
25#include "unicode/gregocal.h"
26
27U_NAMESPACE_BEGIN
28
29/**
30 * Concrete class which provides the Taiwan calendar.
31 * <P>
32 * <code>TaiwanCalendar</code> is a subclass of <code>GregorianCalendar</code>
33 * that numbers years since 1912
34 * <p>
35 * The Taiwan calendar is identical to the Gregorian calendar in all respects
36 * except for the year and era.  Years are numbered since 1912 AD (Gregorian),
37 * so that 1912 AD (Gregorian) is equivalent to 1 MINGUO (Minguo Era) and 1998 AD is 87 MINGUO.
38 * <p>
39 * The Taiwan Calendar has two eras: <code>BEFORE_MINGUO</code> and <code>MINGUO</code>.
40 * <p>
41 * @internal
42 */
43class TaiwanCalendar : public GregorianCalendar {
44public:
45
46    /**
47     * Useful constants for TaiwanCalendar.  Only one Era.
48     * @internal
49     */
50    enum EEras {
51       BEFORE_MINGUO = 0,
52       MINGUO  = 1
53    };
54
55    /**
56     * Constructs a TaiwanCalendar based on the current time in the default time zone
57     * with the given locale.
58     *
59     * @param aLocale  The given locale.
60     * @param success  Indicates the status of TaiwanCalendar object construction.
61     *                 Returns U_ZERO_ERROR if constructed successfully.
62     * @internal
63     */
64    TaiwanCalendar(const Locale& aLocale, UErrorCode& success);
65
66
67    /**
68     * Destructor
69     * @internal
70     */
71    virtual ~TaiwanCalendar();
72
73    /**
74     * Copy constructor
75     * @param source    the object to be copied.
76     * @internal
77     */
78    TaiwanCalendar(const TaiwanCalendar& source);
79
80    /**
81     * Default assignment operator
82     * @param right    the object to be copied.
83     * @internal
84     */
85    TaiwanCalendar& operator=(const TaiwanCalendar& right);
86
87    /**
88     * Create and return a polymorphic copy of this calendar.
89     * @return    return a polymorphic copy of this calendar.
90     * @internal
91     */
92    virtual Calendar* clone(void) const;
93
94public:
95    /**
96     * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
97     * override. This method is to implement a simple version of RTTI, since not all C++
98     * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
99     * this method.
100     *
101     * @return   The class ID for this object. All objects of a given class have the
102     *           same class ID. Objects of other classes have different class IDs.
103     * @internal
104     */
105    virtual UClassID getDynamicClassID(void) const;
106
107    /**
108     * Return the class ID for this class. This is useful only for comparing to a return
109     * value from getDynamicClassID(). For example:
110     *
111     *      Base* polymorphic_pointer = createPolymorphicObject();
112     *      if (polymorphic_pointer->getDynamicClassID() ==
113     *          Derived::getStaticClassID()) ...
114     *
115     * @return   The class ID for all objects of this class.
116     * @internal
117     */
118    U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
119
120    /**
121     * return the calendar type, "Taiwan".
122     *
123     * @return calendar type
124     * @internal
125     */
126    virtual const char * getType() const;
127
128private:
129    TaiwanCalendar(); // default constructor not implemented
130
131 protected:
132     /**
133     * Return the extended year defined by the current fields.  This will
134     * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
135     * as UCAL_ERA) specific to the calendar system, depending on which set of
136     * fields is newer.
137     * @return the extended year
138     * @internal
139     */
140    virtual int32_t handleGetExtendedYear();
141    /**
142     * Subclasses may override this method to compute several fields
143     * specific to each calendar system.
144     * @internal
145     */
146    virtual void handleComputeFields(int32_t julianDay, UErrorCode& status);
147    /**
148     * Subclass API for defining limits of different types.
149     * @param field one of the field numbers
150     * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
151     * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
152     * @internal
153     */
154    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
155
156    /**
157     * Returns TRUE because the Taiwan Calendar does have a default century
158     * @internal
159     */
160    virtual UBool haveDefaultCentury() const;
161
162    /**
163     * Returns the date of the start of the default century
164     * @return start of century - in milliseconds since epoch, 1970
165     * @internal
166     */
167    virtual UDate defaultCenturyStart() const;
168
169    /**
170     * Returns the year in which the default century begins
171     * @internal
172     */
173    virtual int32_t defaultCenturyStartYear() const;
174};
175
176U_NAMESPACE_END
177
178#endif /* #if !UCONFIG_NO_FORMATTING */
179
180#endif // _TAIWNCAL
181//eof
182
183