ethpccal.h revision c73f511526464f8e56c242df80552e9b0d94ae3d
1/*
2*******************************************************************************
3* Copyright (C) 2003 - 2013, International Business Machines Corporation and  *
4* others. All Rights Reserved.                                                *
5*******************************************************************************
6*/
7
8#ifndef ETHPCCAL_H
9#define ETHPCCAL_H
10
11#include "unicode/utypes.h"
12
13#if !UCONFIG_NO_FORMATTING
14
15#include "unicode/calendar.h"
16#include "cecal.h"
17
18U_NAMESPACE_BEGIN
19
20/**
21 * Implement the Ethiopic calendar system.
22 * @internal
23 */
24class EthiopicCalendar : public CECalendar {
25
26public:
27    /**
28     * Calendar type - use Amete Alem era for all the time or not
29     * @internal
30     */
31    enum EEraType {
32        AMETE_MIHRET_ERA,
33        AMETE_ALEM_ERA
34    };
35
36    /**
37     * Useful constants for EthiopicCalendar.
38     * @internal
39     */
40    enum EMonths {
41        /**
42         * Constant for መስከረም, the 1st month of the Ethiopic year.
43         */
44        MESKEREM,
45
46        /**
47         * Constant for ጥቅምት, the 2nd month of the Ethiopic year.
48         */
49        TEKEMT,
50
51        /**
52         * Constant for ኅዳር, the 3rd month of the Ethiopic year.
53         */
54        HEDAR,
55
56        /**
57         * Constant for ታኅሣሥ, the 4th month of the Ethiopic year.
58         */
59        TAHSAS,
60
61        /**
62         * Constant for ጥር, the 5th month of the Ethiopic year.
63         */
64        TER,
65
66        /**
67         * Constant for የካቲት, the 6th month of the Ethiopic year.
68         */
69        YEKATIT,
70
71        /**
72         * Constant for መጋቢት, the 7th month of the Ethiopic year.
73         */
74        MEGABIT,
75
76        /**
77         * Constant for ሚያዝያ, the 8th month of the Ethiopic year.
78         */
79        MIAZIA,
80
81        /**
82         * Constant for ግንቦት, the 9th month of the Ethiopic year.
83         */
84        GENBOT,
85
86        /**
87         * Constant for ሰኔ, the 10th month of the Ethiopic year.
88         */
89        SENE,
90
91        /**
92         * Constant for ሐምሌ, the 11th month of the Ethiopic year.
93         */
94        HAMLE,
95
96        /**
97         * Constant for ነሐሴ, the 12th month of the Ethiopic year.
98         */
99        NEHASSA,
100
101        /**
102         * Constant for ጳጉሜን, the 13th month of the Ethiopic year.
103         */
104        PAGUMEN
105    };
106
107    enum EEras {
108        AMETE_ALEM,     // Before the epoch
109        AMETE_MIHRET    // After the epoch
110    };
111
112    /**
113     * Constructs a EthiopicCalendar based on the current time in the default time zone
114     * with the given locale.
115     *
116     * @param aLocale  The given locale.
117     * @param success  Indicates the status of EthiopicCalendar object construction.
118     *                 Returns U_ZERO_ERROR if constructed successfully.
119     * @param type     Whether this Ethiopic calendar use Amete Mihrret (default) or
120     *                 only use Amete Alem for all the time.
121     * @internal
122     */
123    EthiopicCalendar(const Locale& aLocale, UErrorCode& success, EEraType type = AMETE_MIHRET_ERA);
124
125    /**
126     * Copy Constructor
127     * @internal
128     */
129    EthiopicCalendar(const EthiopicCalendar& other);
130
131    /**
132     * Destructor.
133     * @internal
134     */
135    virtual ~EthiopicCalendar();
136
137    /**
138     * Create and return a polymorphic copy of this calendar.
139     * @return    return a polymorphic copy of this calendar.
140     * @internal
141     */
142    virtual Calendar* clone() const;
143
144    /**
145     * return the calendar type, "ethiopic"
146     * @return calendar type
147     * @internal
148     */
149    virtual const char * getType() const;
150
151    /**
152     * Set Alem or Mihret era.
153     * @param onOff Set Amete Alem era if true, otherwise set Amete Mihret era.
154     * @internal
155     */
156    void setAmeteAlemEra (UBool onOff);
157
158    /**
159     * Return true if this calendar is set to the Amete Alem era.
160     * @return true if set to the Amete Alem era.
161     * @internal
162     */
163    UBool isAmeteAlemEra() const;
164
165protected:
166    //-------------------------------------------------------------------------
167    // Calendar framework
168    //-------------------------------------------------------------------------
169
170    /**
171     * Return the extended year defined by the current fields.
172     * @internal
173     */
174    virtual int32_t handleGetExtendedYear();
175
176    /**
177     * Compute fields from the JD
178     * @internal
179     */
180    virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
181
182    /**
183     * Calculate the limit for a specified type of limit and field
184     * @internal
185     */
186    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
187
188    /**
189     * Returns the date of the start of the default century
190     * @return start of century - in milliseconds since epoch, 1970
191     * @internal
192     */
193    virtual UDate defaultCenturyStart() const;
194
195    /**
196     * Returns the year in which the default century begins
197     * @internal
198     */
199    virtual int32_t defaultCenturyStartYear() const;
200
201    /**
202     * Return the date offset from Julian
203     * @internal
204     */
205    virtual int32_t getJDEpochOffset() const;
206
207private:
208    /**
209     * When eraType is AMETE_ALEM_ERA, then this calendar use only AMETE_ALEM
210     * for the era. Otherwise (default), this calendar uses both AMETE_ALEM
211     * and AMETE_MIHRET.
212     *
213     * EXTENDED_YEAR        AMETE_ALEM_ERA     AMETE_MIHRET_ERA
214     *             0       Amete Alem 5500      Amete Alem 5500
215     *             1        Amete Mihret 1      Amete Alem 5501
216     */
217    EEraType eraType;
218
219public:
220    /**
221     * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
222     * override. This method is to implement a simple version of RTTI, since not all C++
223     * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
224     * this method.
225     *
226     * @return   The class ID for this object. All objects of a given class have the
227     *           same class ID. Objects of other classes have different class IDs.
228     * @internal
229     */
230    virtual UClassID getDynamicClassID(void) const;
231
232    /**
233     * Return the class ID for this class. This is useful only for comparing to a return
234     * value from getDynamicClassID(). For example:
235     *
236     *      Base* polymorphic_pointer = createPolymorphicObject();
237     *      if (polymorphic_pointer->getDynamicClassID() ==
238     *          Derived::getStaticClassID()) ...
239     *
240     * @return   The class ID for all objects of this class.
241     * @internal
242     */
243    U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
244
245#if 0
246// We do not want to introduce this API in ICU4C.
247// It was accidentally introduced in ICU4J as a public API.
248
249public:
250    //-------------------------------------------------------------------------
251    // Calendar system Conversion methods...
252    //-------------------------------------------------------------------------
253
254    /**
255     * Convert an Ethiopic year, month, and day to a Julian day.
256     *
257     * @param year the extended year
258     * @param month the month
259     * @param day the day
260     * @return Julian day
261     * @internal
262     */
263    int32_t ethiopicToJD(int32_t year, int32_t month, int32_t day);
264#endif
265};
266
267U_NAMESPACE_END
268#endif /* #if !UCONFIG_NO_FORMATTING */
269#endif /* ETHPCCAL_H */
270//eof
271