xref: /aosp_15_r20/external/icu/libicu/cts_headers/islamcal.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker  ********************************************************************************
5*0e209d39SAndroid Build Coastguard Worker  * Copyright (C) 2003-2013, International Business Machines Corporation
6*0e209d39SAndroid Build Coastguard Worker  * and others. All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker  ******************************************************************************
8*0e209d39SAndroid Build Coastguard Worker  *
9*0e209d39SAndroid Build Coastguard Worker  * File ISLAMCAL.H
10*0e209d39SAndroid Build Coastguard Worker  *
11*0e209d39SAndroid Build Coastguard Worker  * Modification History:
12*0e209d39SAndroid Build Coastguard Worker  *
13*0e209d39SAndroid Build Coastguard Worker  *   Date        Name        Description
14*0e209d39SAndroid Build Coastguard Worker  *   10/14/2003  srl         ported from java IslamicCalendar
15*0e209d39SAndroid Build Coastguard Worker  *****************************************************************************
16*0e209d39SAndroid Build Coastguard Worker  */
17*0e209d39SAndroid Build Coastguard Worker 
18*0e209d39SAndroid Build Coastguard Worker #ifndef ISLAMCAL_H
19*0e209d39SAndroid Build Coastguard Worker #define ISLAMCAL_H
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
22*0e209d39SAndroid Build Coastguard Worker 
23*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
24*0e209d39SAndroid Build Coastguard Worker 
25*0e209d39SAndroid Build Coastguard Worker #include "unicode/calendar.h"
26*0e209d39SAndroid Build Coastguard Worker 
27*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
28*0e209d39SAndroid Build Coastguard Worker 
29*0e209d39SAndroid Build Coastguard Worker /**
30*0e209d39SAndroid Build Coastguard Worker  * <code>IslamicCalendar</code> is a subclass of <code>Calendar</code>
31*0e209d39SAndroid Build Coastguard Worker  * that implements the Islamic civil and religious calendars.  It
32*0e209d39SAndroid Build Coastguard Worker  * is used as the civil calendar in most of the Arab world and the
33*0e209d39SAndroid Build Coastguard Worker  * liturgical calendar of the Islamic faith worldwide.  This calendar
34*0e209d39SAndroid Build Coastguard Worker  * is also known as the "Hijri" calendar, since it starts at the time
35*0e209d39SAndroid Build Coastguard Worker  * of Mohammed's emigration (or "hijra") to Medinah on Thursday,
36*0e209d39SAndroid Build Coastguard Worker  * July 15, 622 AD (Julian).
37*0e209d39SAndroid Build Coastguard Worker  * <p>
38*0e209d39SAndroid Build Coastguard Worker  * The Islamic calendar is strictly lunar, and thus an Islamic year of twelve
39*0e209d39SAndroid Build Coastguard Worker  * lunar months does not correspond to the solar year used by most other
40*0e209d39SAndroid Build Coastguard Worker  * calendar systems, including the Gregorian.  An Islamic year is, on average,
41*0e209d39SAndroid Build Coastguard Worker  * about 354 days long, so each successive Islamic year starts about 11 days
42*0e209d39SAndroid Build Coastguard Worker  * earlier in the corresponding Gregorian year.
43*0e209d39SAndroid Build Coastguard Worker  * <p>
44*0e209d39SAndroid Build Coastguard Worker  * Each month of the calendar starts when the new moon's crescent is visible
45*0e209d39SAndroid Build Coastguard Worker  * at sunset.  However, in order to keep the time fields in this class
46*0e209d39SAndroid Build Coastguard Worker  * synchronized with those of the other calendars and with local clock time,
47*0e209d39SAndroid Build Coastguard Worker  * we treat days and months as beginning at midnight,
48*0e209d39SAndroid Build Coastguard Worker  * roughly 6 hours after the corresponding sunset.
49*0e209d39SAndroid Build Coastguard Worker  * <p>
50*0e209d39SAndroid Build Coastguard Worker  * There are two main variants of the Islamic calendar in existence.  The first
51*0e209d39SAndroid Build Coastguard Worker  * is the <em>civil</em> calendar, which uses a fixed cycle of alternating 29-
52*0e209d39SAndroid Build Coastguard Worker  * and 30-day months, with a leap day added to the last month of 11 out of
53*0e209d39SAndroid Build Coastguard Worker  * every 30 years.  This calendar is easily calculated and thus predictable in
54*0e209d39SAndroid Build Coastguard Worker  * advance, so it is used as the civil calendar in a number of Arab countries.
55*0e209d39SAndroid Build Coastguard Worker  * This is the default behavior of a newly-created <code>IslamicCalendar</code>
56*0e209d39SAndroid Build Coastguard Worker  * object. This calendar variant is implemented in the IslamicCivilCalendar
57*0e209d39SAndroid Build Coastguard Worker  * class.
58*0e209d39SAndroid Build Coastguard Worker  * <p>
59*0e209d39SAndroid Build Coastguard Worker  * The Islamic <em>religious</em> calendar, however, is based on the <em>observation</em>
60*0e209d39SAndroid Build Coastguard Worker  * of the crescent moon.  It is thus affected by the position at which the
61*0e209d39SAndroid Build Coastguard Worker  * observations are made, seasonal variations in the time of sunset, the
62*0e209d39SAndroid Build Coastguard Worker  * eccentricities of the moon's orbit, and even the weather at the observation
63*0e209d39SAndroid Build Coastguard Worker  * site.  This makes it impossible to calculate in advance, and it causes the
64*0e209d39SAndroid Build Coastguard Worker  * start of a month in the religious calendar to differ from the civil calendar
65*0e209d39SAndroid Build Coastguard Worker  * by up to three days.
66*0e209d39SAndroid Build Coastguard Worker  * <p>
67*0e209d39SAndroid Build Coastguard Worker  * Using astronomical calculations for the position of the sun and moon, the
68*0e209d39SAndroid Build Coastguard Worker  * moon's illumination, and other factors, it is possible to determine the start
69*0e209d39SAndroid Build Coastguard Worker  * of a lunar month with a fairly high degree of certainty.  However, these
70*0e209d39SAndroid Build Coastguard Worker  * calculations are extremely complicated and thus slow, so most algorithms,
71*0e209d39SAndroid Build Coastguard Worker  * including the one used here, are only approximations of the true astronomical
72*0e209d39SAndroid Build Coastguard Worker  * calculations.  At present, the approximations used in this class are fairly
73*0e209d39SAndroid Build Coastguard Worker  * simplistic; they will be improved in later versions of the code.
74*0e209d39SAndroid Build Coastguard Worker  * <p>
75*0e209d39SAndroid Build Coastguard Worker  *
76*0e209d39SAndroid Build Coastguard Worker  * @see GregorianCalendar
77*0e209d39SAndroid Build Coastguard Worker  *
78*0e209d39SAndroid Build Coastguard Worker  * @author Laura Werner
79*0e209d39SAndroid Build Coastguard Worker  * @author Alan Liu
80*0e209d39SAndroid Build Coastguard Worker  * @author Steven R. Loomis
81*0e209d39SAndroid Build Coastguard Worker  * @internal
82*0e209d39SAndroid Build Coastguard Worker  */
83*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IslamicCalendar : public Calendar {
84*0e209d39SAndroid Build Coastguard Worker  public:
85*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
86*0e209d39SAndroid Build Coastguard Worker   // Constants...
87*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
88*0e209d39SAndroid Build Coastguard Worker   /**
89*0e209d39SAndroid Build Coastguard Worker    * Constants for the months
90*0e209d39SAndroid Build Coastguard Worker    * @internal
91*0e209d39SAndroid Build Coastguard Worker    */
92*0e209d39SAndroid Build Coastguard Worker   enum EMonths {
93*0e209d39SAndroid Build Coastguard Worker     /**
94*0e209d39SAndroid Build Coastguard Worker      * Constant for Muharram, the 1st month of the Islamic year.
95*0e209d39SAndroid Build Coastguard Worker      * @internal
96*0e209d39SAndroid Build Coastguard Worker      */
97*0e209d39SAndroid Build Coastguard Worker     MUHARRAM = 0,
98*0e209d39SAndroid Build Coastguard Worker 
99*0e209d39SAndroid Build Coastguard Worker     /**
100*0e209d39SAndroid Build Coastguard Worker      * Constant for Safar, the 2nd month of the Islamic year.
101*0e209d39SAndroid Build Coastguard Worker      * @internal
102*0e209d39SAndroid Build Coastguard Worker      */
103*0e209d39SAndroid Build Coastguard Worker     SAFAR = 1,
104*0e209d39SAndroid Build Coastguard Worker 
105*0e209d39SAndroid Build Coastguard Worker     /**
106*0e209d39SAndroid Build Coastguard Worker      * Constant for Rabi' al-awwal (or Rabi' I), the 3rd month of the Islamic year.
107*0e209d39SAndroid Build Coastguard Worker      * @internal
108*0e209d39SAndroid Build Coastguard Worker      */
109*0e209d39SAndroid Build Coastguard Worker     RABI_1 = 2,
110*0e209d39SAndroid Build Coastguard Worker 
111*0e209d39SAndroid Build Coastguard Worker     /**
112*0e209d39SAndroid Build Coastguard Worker      * Constant for Rabi' al-thani or (Rabi' II), the 4th month of the Islamic year.
113*0e209d39SAndroid Build Coastguard Worker      * @internal
114*0e209d39SAndroid Build Coastguard Worker      */
115*0e209d39SAndroid Build Coastguard Worker     RABI_2 = 3,
116*0e209d39SAndroid Build Coastguard Worker 
117*0e209d39SAndroid Build Coastguard Worker     /**
118*0e209d39SAndroid Build Coastguard Worker      * Constant for Jumada al-awwal or (Jumada I), the 5th month of the Islamic year.
119*0e209d39SAndroid Build Coastguard Worker      * @internal
120*0e209d39SAndroid Build Coastguard Worker      */
121*0e209d39SAndroid Build Coastguard Worker     JUMADA_1 = 4,
122*0e209d39SAndroid Build Coastguard Worker 
123*0e209d39SAndroid Build Coastguard Worker     /**
124*0e209d39SAndroid Build Coastguard Worker      * Constant for Jumada al-thani or (Jumada II), the 6th month of the Islamic year.
125*0e209d39SAndroid Build Coastguard Worker      * @internal
126*0e209d39SAndroid Build Coastguard Worker      */
127*0e209d39SAndroid Build Coastguard Worker     JUMADA_2 = 5,
128*0e209d39SAndroid Build Coastguard Worker 
129*0e209d39SAndroid Build Coastguard Worker     /**
130*0e209d39SAndroid Build Coastguard Worker      * Constant for Rajab, the 7th month of the Islamic year.
131*0e209d39SAndroid Build Coastguard Worker      * @internal
132*0e209d39SAndroid Build Coastguard Worker      */
133*0e209d39SAndroid Build Coastguard Worker     RAJAB = 6,
134*0e209d39SAndroid Build Coastguard Worker 
135*0e209d39SAndroid Build Coastguard Worker     /**
136*0e209d39SAndroid Build Coastguard Worker      * Constant for Sha'ban, the 8th month of the Islamic year.
137*0e209d39SAndroid Build Coastguard Worker      * @internal
138*0e209d39SAndroid Build Coastguard Worker      */
139*0e209d39SAndroid Build Coastguard Worker     SHABAN = 7,
140*0e209d39SAndroid Build Coastguard Worker 
141*0e209d39SAndroid Build Coastguard Worker     /**
142*0e209d39SAndroid Build Coastguard Worker      * Constant for Ramadan, the 9th month of the Islamic year.
143*0e209d39SAndroid Build Coastguard Worker      * @internal
144*0e209d39SAndroid Build Coastguard Worker      */
145*0e209d39SAndroid Build Coastguard Worker     RAMADAN = 8,
146*0e209d39SAndroid Build Coastguard Worker 
147*0e209d39SAndroid Build Coastguard Worker     /**
148*0e209d39SAndroid Build Coastguard Worker      * Constant for Shawwal, the 10th month of the Islamic year.
149*0e209d39SAndroid Build Coastguard Worker      * @internal
150*0e209d39SAndroid Build Coastguard Worker      */
151*0e209d39SAndroid Build Coastguard Worker     SHAWWAL = 9,
152*0e209d39SAndroid Build Coastguard Worker 
153*0e209d39SAndroid Build Coastguard Worker     /**
154*0e209d39SAndroid Build Coastguard Worker      * Constant for Dhu al-Qi'dah, the 11th month of the Islamic year.
155*0e209d39SAndroid Build Coastguard Worker      * @internal
156*0e209d39SAndroid Build Coastguard Worker      */
157*0e209d39SAndroid Build Coastguard Worker     DHU_AL_QIDAH = 10,
158*0e209d39SAndroid Build Coastguard Worker 
159*0e209d39SAndroid Build Coastguard Worker     /**
160*0e209d39SAndroid Build Coastguard Worker      * Constant for Dhu al-Hijjah, the 12th month of the Islamic year.
161*0e209d39SAndroid Build Coastguard Worker      * @internal
162*0e209d39SAndroid Build Coastguard Worker      */
163*0e209d39SAndroid Build Coastguard Worker     DHU_AL_HIJJAH = 11,
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker     ISLAMIC_MONTH_MAX
166*0e209d39SAndroid Build Coastguard Worker   };
167*0e209d39SAndroid Build Coastguard Worker 
168*0e209d39SAndroid Build Coastguard Worker 
169*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
170*0e209d39SAndroid Build Coastguard Worker   // Constructors...
171*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
172*0e209d39SAndroid Build Coastguard Worker 
173*0e209d39SAndroid Build Coastguard Worker   /**
174*0e209d39SAndroid Build Coastguard Worker    * Constructs an IslamicCalendar based on the current time in the default time zone
175*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
176*0e209d39SAndroid Build Coastguard Worker    *
177*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
178*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of IslamicCalendar object construction.
179*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
180*0e209d39SAndroid Build Coastguard Worker    * @internal
181*0e209d39SAndroid Build Coastguard Worker    */
182*0e209d39SAndroid Build Coastguard Worker   IslamicCalendar(const Locale& aLocale, UErrorCode &success);
183*0e209d39SAndroid Build Coastguard Worker 
184*0e209d39SAndroid Build Coastguard Worker   /**
185*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
186*0e209d39SAndroid Build Coastguard Worker    * @internal
187*0e209d39SAndroid Build Coastguard Worker    */
188*0e209d39SAndroid Build Coastguard Worker   IslamicCalendar(const IslamicCalendar& other) = default;
189*0e209d39SAndroid Build Coastguard Worker 
190*0e209d39SAndroid Build Coastguard Worker   /**
191*0e209d39SAndroid Build Coastguard Worker    * Destructor.
192*0e209d39SAndroid Build Coastguard Worker    * @internal
193*0e209d39SAndroid Build Coastguard Worker    */
194*0e209d39SAndroid Build Coastguard Worker   virtual ~IslamicCalendar();
195*0e209d39SAndroid Build Coastguard Worker 
196*0e209d39SAndroid Build Coastguard Worker   // clone
197*0e209d39SAndroid Build Coastguard Worker   virtual IslamicCalendar* clone() const override;
198*0e209d39SAndroid Build Coastguard Worker 
199*0e209d39SAndroid Build Coastguard Worker  protected:
200*0e209d39SAndroid Build Coastguard Worker   /**
201*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given year starts.  Days are counted
202*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
203*0e209d39SAndroid Build Coastguard Worker    */
204*0e209d39SAndroid Build Coastguard Worker   virtual int64_t yearStart(int32_t year) const;
205*0e209d39SAndroid Build Coastguard Worker 
206*0e209d39SAndroid Build Coastguard Worker   /**
207*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given month starts.  Days are counted
208*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
209*0e209d39SAndroid Build Coastguard Worker    *
210*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
211*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
212*0e209d39SAndroid Build Coastguard Worker    */
213*0e209d39SAndroid Build Coastguard Worker   virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const;
214*0e209d39SAndroid Build Coastguard Worker 
215*0e209d39SAndroid Build Coastguard Worker 
216*0e209d39SAndroid Build Coastguard Worker   //----------------------------------------------------------------------
217*0e209d39SAndroid Build Coastguard Worker   // Calendar framework
218*0e209d39SAndroid Build Coastguard Worker   //----------------------------------------------------------------------
219*0e209d39SAndroid Build Coastguard Worker  protected:
220*0e209d39SAndroid Build Coastguard Worker   /**
221*0e209d39SAndroid Build Coastguard Worker    * @internal
222*0e209d39SAndroid Build Coastguard Worker    */
223*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override;
224*0e209d39SAndroid Build Coastguard Worker 
225*0e209d39SAndroid Build Coastguard Worker   /**
226*0e209d39SAndroid Build Coastguard Worker    * Return the length (in days) of the given month.
227*0e209d39SAndroid Build Coastguard Worker    *
228*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
229*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
230*0e209d39SAndroid Build Coastguard Worker    * @internal
231*0e209d39SAndroid Build Coastguard Worker    */
232*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override;
233*0e209d39SAndroid Build Coastguard Worker 
234*0e209d39SAndroid Build Coastguard Worker   /**
235*0e209d39SAndroid Build Coastguard Worker    * Return the number of days in the given Islamic year
236*0e209d39SAndroid Build Coastguard Worker    * @internal
237*0e209d39SAndroid Build Coastguard Worker    */
238*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetYearLength(int32_t extendedYear) const override;
239*0e209d39SAndroid Build Coastguard Worker 
240*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
241*0e209d39SAndroid Build Coastguard Worker   // Functions for converting from field values to milliseconds....
242*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
243*0e209d39SAndroid Build Coastguard Worker 
244*0e209d39SAndroid Build Coastguard Worker   // Return JD of start of given month/year
245*0e209d39SAndroid Build Coastguard Worker   /**
246*0e209d39SAndroid Build Coastguard Worker    * @internal
247*0e209d39SAndroid Build Coastguard Worker    */
248*0e209d39SAndroid Build Coastguard Worker   virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override;
249*0e209d39SAndroid Build Coastguard Worker 
250*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
251*0e209d39SAndroid Build Coastguard Worker   // Functions for converting from milliseconds to field values
252*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
253*0e209d39SAndroid Build Coastguard Worker 
254*0e209d39SAndroid Build Coastguard Worker   /**
255*0e209d39SAndroid Build Coastguard Worker    * @internal
256*0e209d39SAndroid Build Coastguard Worker    */
257*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetExtendedYear(UErrorCode& status) override;
258*0e209d39SAndroid Build Coastguard Worker 
259*0e209d39SAndroid Build Coastguard Worker   /**
260*0e209d39SAndroid Build Coastguard Worker    * Override Calendar to compute several fields specific to the Islamic
261*0e209d39SAndroid Build Coastguard Worker    * calendar system.  These are:
262*0e209d39SAndroid Build Coastguard Worker    *
263*0e209d39SAndroid Build Coastguard Worker    * <ul><li>ERA
264*0e209d39SAndroid Build Coastguard Worker    * <li>YEAR
265*0e209d39SAndroid Build Coastguard Worker    * <li>MONTH
266*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_MONTH
267*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_YEAR
268*0e209d39SAndroid Build Coastguard Worker    * <li>EXTENDED_YEAR</ul>
269*0e209d39SAndroid Build Coastguard Worker    *
270*0e209d39SAndroid Build Coastguard Worker    * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
271*0e209d39SAndroid Build Coastguard Worker    * method is called. The getGregorianXxx() methods return Gregorian
272*0e209d39SAndroid Build Coastguard Worker    * calendar equivalents for the given Julian day.
273*0e209d39SAndroid Build Coastguard Worker    * @internal
274*0e209d39SAndroid Build Coastguard Worker    */
275*0e209d39SAndroid Build Coastguard Worker   virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
276*0e209d39SAndroid Build Coastguard Worker 
277*0e209d39SAndroid Build Coastguard Worker   /**
278*0e209d39SAndroid Build Coastguard Worker    * Return the epoc.
279*0e209d39SAndroid Build Coastguard Worker    * @internal
280*0e209d39SAndroid Build Coastguard Worker    */
281*0e209d39SAndroid Build Coastguard Worker   virtual int32_t getEpoc() const;
282*0e209d39SAndroid Build Coastguard Worker 
283*0e209d39SAndroid Build Coastguard Worker   // UObject stuff
284*0e209d39SAndroid Build Coastguard Worker  public:
285*0e209d39SAndroid Build Coastguard Worker   /**
286*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
287*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
288*0e209d39SAndroid Build Coastguard Worker    * @internal
289*0e209d39SAndroid Build Coastguard Worker    */
290*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
291*0e209d39SAndroid Build Coastguard Worker 
292*0e209d39SAndroid Build Coastguard Worker   /**
293*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
294*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
295*0e209d39SAndroid Build Coastguard Worker    *
296*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
297*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
298*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
299*0e209d39SAndroid Build Coastguard Worker    *
300*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
301*0e209d39SAndroid Build Coastguard Worker    * @internal
302*0e209d39SAndroid Build Coastguard Worker    */
303*0e209d39SAndroid Build Coastguard Worker   /*U_I18N_API*/ static UClassID U_EXPORT2 getStaticClassID();
304*0e209d39SAndroid Build Coastguard Worker 
305*0e209d39SAndroid Build Coastguard Worker   /**
306*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "islamic".
307*0e209d39SAndroid Build Coastguard Worker    *
308*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
309*0e209d39SAndroid Build Coastguard Worker    * @internal
310*0e209d39SAndroid Build Coastguard Worker    */
311*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
312*0e209d39SAndroid Build Coastguard Worker 
313*0e209d39SAndroid Build Coastguard Worker   /**
314*0e209d39SAndroid Build Coastguard Worker    * @return      The related Gregorian year; will be obtained by modifying the value
315*0e209d39SAndroid Build Coastguard Worker    *              obtained by get from UCAL_EXTENDED_YEAR field
316*0e209d39SAndroid Build Coastguard Worker    * @internal
317*0e209d39SAndroid Build Coastguard Worker    */
318*0e209d39SAndroid Build Coastguard Worker   virtual int32_t getRelatedYear(UErrorCode &status) const override;
319*0e209d39SAndroid Build Coastguard Worker 
320*0e209d39SAndroid Build Coastguard Worker   /**
321*0e209d39SAndroid Build Coastguard Worker    * @param year  The related Gregorian year to set; will be modified as necessary then
322*0e209d39SAndroid Build Coastguard Worker    *              set in UCAL_EXTENDED_YEAR field
323*0e209d39SAndroid Build Coastguard Worker    * @internal
324*0e209d39SAndroid Build Coastguard Worker    */
325*0e209d39SAndroid Build Coastguard Worker   virtual void setRelatedYear(int32_t year) override;
326*0e209d39SAndroid Build Coastguard Worker 
327*0e209d39SAndroid Build Coastguard Worker   /**
328*0e209d39SAndroid Build Coastguard Worker    * Returns true if the date is in a leap year.
329*0e209d39SAndroid Build Coastguard Worker    *
330*0e209d39SAndroid Build Coastguard Worker    * @param status        ICU Error Code
331*0e209d39SAndroid Build Coastguard Worker    * @return       True if the date in the fields is in a Temporal proposal
332*0e209d39SAndroid Build Coastguard Worker    *               defined leap year. False otherwise.
333*0e209d39SAndroid Build Coastguard Worker    */
334*0e209d39SAndroid Build Coastguard Worker   virtual bool inTemporalLeapYear(UErrorCode &status) const override;
335*0e209d39SAndroid Build Coastguard Worker 
336*0e209d39SAndroid Build Coastguard Worker  private:
337*0e209d39SAndroid Build Coastguard Worker   IslamicCalendar() = delete; // default constructor not implemented
338*0e209d39SAndroid Build Coastguard Worker 
339*0e209d39SAndroid Build Coastguard Worker   // Default century.
340*0e209d39SAndroid Build Coastguard Worker  protected:
341*0e209d39SAndroid Build Coastguard Worker 
342*0e209d39SAndroid Build Coastguard Worker   DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY
343*0e209d39SAndroid Build Coastguard Worker };
344*0e209d39SAndroid Build Coastguard Worker 
345*0e209d39SAndroid Build Coastguard Worker /*
346*0e209d39SAndroid Build Coastguard Worker  * IslamicCivilCalendar is one of the two main variants of the Islamic calendar.
347*0e209d39SAndroid Build Coastguard Worker  * The <em>civil</em> calendar, which uses a fixed cycle of alternating 29-
348*0e209d39SAndroid Build Coastguard Worker  * and 30-day months, with a leap day added to the last month of 11 out of
349*0e209d39SAndroid Build Coastguard Worker  * every 30 years.  This calendar is easily calculated and thus predictable in
350*0e209d39SAndroid Build Coastguard Worker  * advance, so it is used as the civil calendar in a number of Arab countries.
351*0e209d39SAndroid Build Coastguard Worker  * This calendar is referring as "Islamic calendar, tabular (intercalary years
352*0e209d39SAndroid Build Coastguard Worker  * [2,5,7,10,13,16,18,21,24,26,29]- civil epoch" in CLDR.
353*0e209d39SAndroid Build Coastguard Worker  */
354*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IslamicCivilCalendar : public IslamicCalendar {
355*0e209d39SAndroid Build Coastguard Worker  public:
356*0e209d39SAndroid Build Coastguard Worker   /**
357*0e209d39SAndroid Build Coastguard Worker    * Constructs an IslamicCivilCalendar based on the current time in the default time zone
358*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
359*0e209d39SAndroid Build Coastguard Worker    *
360*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
361*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of IslamicCivilCalendar object construction.
362*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
363*0e209d39SAndroid Build Coastguard Worker    * @internal
364*0e209d39SAndroid Build Coastguard Worker    */
365*0e209d39SAndroid Build Coastguard Worker   IslamicCivilCalendar(const Locale& aLocale, UErrorCode &success);
366*0e209d39SAndroid Build Coastguard Worker 
367*0e209d39SAndroid Build Coastguard Worker   /**
368*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
369*0e209d39SAndroid Build Coastguard Worker    * @internal
370*0e209d39SAndroid Build Coastguard Worker    */
371*0e209d39SAndroid Build Coastguard Worker   IslamicCivilCalendar(const IslamicCivilCalendar& other) = default;
372*0e209d39SAndroid Build Coastguard Worker 
373*0e209d39SAndroid Build Coastguard Worker   /**
374*0e209d39SAndroid Build Coastguard Worker    * Destructor.
375*0e209d39SAndroid Build Coastguard Worker    * @internal
376*0e209d39SAndroid Build Coastguard Worker    */
377*0e209d39SAndroid Build Coastguard Worker   virtual ~IslamicCivilCalendar();
378*0e209d39SAndroid Build Coastguard Worker 
379*0e209d39SAndroid Build Coastguard Worker   // clone
380*0e209d39SAndroid Build Coastguard Worker   virtual IslamicCivilCalendar* clone() const override;
381*0e209d39SAndroid Build Coastguard Worker 
382*0e209d39SAndroid Build Coastguard Worker   /**
383*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
384*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
385*0e209d39SAndroid Build Coastguard Worker    * @internal
386*0e209d39SAndroid Build Coastguard Worker    */
387*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
388*0e209d39SAndroid Build Coastguard Worker 
389*0e209d39SAndroid Build Coastguard Worker   /**
390*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
391*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
392*0e209d39SAndroid Build Coastguard Worker    *
393*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
394*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
395*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
396*0e209d39SAndroid Build Coastguard Worker    *
397*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
398*0e209d39SAndroid Build Coastguard Worker    * @internal
399*0e209d39SAndroid Build Coastguard Worker    */
400*0e209d39SAndroid Build Coastguard Worker   static UClassID U_EXPORT2 getStaticClassID();
401*0e209d39SAndroid Build Coastguard Worker 
402*0e209d39SAndroid Build Coastguard Worker   /**
403*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "islamic-civil".
404*0e209d39SAndroid Build Coastguard Worker    *
405*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
406*0e209d39SAndroid Build Coastguard Worker    * @internal
407*0e209d39SAndroid Build Coastguard Worker    */
408*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
409*0e209d39SAndroid Build Coastguard Worker 
410*0e209d39SAndroid Build Coastguard Worker  protected:
411*0e209d39SAndroid Build Coastguard Worker   /**
412*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given year starts.  Days are counted
413*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
414*0e209d39SAndroid Build Coastguard Worker    * @internal
415*0e209d39SAndroid Build Coastguard Worker    */
416*0e209d39SAndroid Build Coastguard Worker   virtual int64_t yearStart(int32_t year) const override;
417*0e209d39SAndroid Build Coastguard Worker 
418*0e209d39SAndroid Build Coastguard Worker   /**
419*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given month starts.  Days are counted
420*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
421*0e209d39SAndroid Build Coastguard Worker    *
422*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
423*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
424*0e209d39SAndroid Build Coastguard Worker    * @internal
425*0e209d39SAndroid Build Coastguard Worker    */
426*0e209d39SAndroid Build Coastguard Worker   virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override;
427*0e209d39SAndroid Build Coastguard Worker 
428*0e209d39SAndroid Build Coastguard Worker   /**
429*0e209d39SAndroid Build Coastguard Worker    * Return the length (in days) of the given month.
430*0e209d39SAndroid Build Coastguard Worker    *
431*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
432*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
433*0e209d39SAndroid Build Coastguard Worker    * @internal
434*0e209d39SAndroid Build Coastguard Worker    */
435*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override;
436*0e209d39SAndroid Build Coastguard Worker 
437*0e209d39SAndroid Build Coastguard Worker   /**
438*0e209d39SAndroid Build Coastguard Worker    * Return the number of days in the given Islamic year
439*0e209d39SAndroid Build Coastguard Worker    * @internal
440*0e209d39SAndroid Build Coastguard Worker    */
441*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetYearLength(int32_t extendedYear) const override;
442*0e209d39SAndroid Build Coastguard Worker 
443*0e209d39SAndroid Build Coastguard Worker   /**
444*0e209d39SAndroid Build Coastguard Worker    * Override Calendar to compute several fields specific to the Islamic
445*0e209d39SAndroid Build Coastguard Worker    * calendar system.  These are:
446*0e209d39SAndroid Build Coastguard Worker    *
447*0e209d39SAndroid Build Coastguard Worker    * <ul><li>ERA
448*0e209d39SAndroid Build Coastguard Worker    * <li>YEAR
449*0e209d39SAndroid Build Coastguard Worker    * <li>MONTH
450*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_MONTH
451*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_YEAR
452*0e209d39SAndroid Build Coastguard Worker    * <li>EXTENDED_YEAR</ul>
453*0e209d39SAndroid Build Coastguard Worker    *
454*0e209d39SAndroid Build Coastguard Worker    * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
455*0e209d39SAndroid Build Coastguard Worker    * method is called. The getGregorianXxx() methods return Gregorian
456*0e209d39SAndroid Build Coastguard Worker    * calendar equivalents for the given Julian day.
457*0e209d39SAndroid Build Coastguard Worker    * @internal
458*0e209d39SAndroid Build Coastguard Worker    */
459*0e209d39SAndroid Build Coastguard Worker   virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
460*0e209d39SAndroid Build Coastguard Worker };
461*0e209d39SAndroid Build Coastguard Worker 
462*0e209d39SAndroid Build Coastguard Worker /*
463*0e209d39SAndroid Build Coastguard Worker  * IslamicTBLACalendar calendar.
464*0e209d39SAndroid Build Coastguard Worker  * This is a subclass of IslamicCivilCalendar. The only differences in the
465*0e209d39SAndroid Build Coastguard Worker  * calendar math is it uses different epoch.
466*0e209d39SAndroid Build Coastguard Worker  * This calendar is referring as "Islamic calendar, tabular (intercalary years
467*0e209d39SAndroid Build Coastguard Worker  * [2,5,7,10,13,16,18,21,24,26,29] - astronomical epoch" in CLDR.
468*0e209d39SAndroid Build Coastguard Worker  */
469*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IslamicTBLACalendar : public IslamicCivilCalendar {
470*0e209d39SAndroid Build Coastguard Worker  public:
471*0e209d39SAndroid Build Coastguard Worker   /**
472*0e209d39SAndroid Build Coastguard Worker    * Constructs an IslamicTBLACalendar based on the current time in the default time zone
473*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
474*0e209d39SAndroid Build Coastguard Worker    *
475*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
476*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of IslamicTBLACalendar object construction.
477*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
478*0e209d39SAndroid Build Coastguard Worker    * @internal
479*0e209d39SAndroid Build Coastguard Worker    */
480*0e209d39SAndroid Build Coastguard Worker   IslamicTBLACalendar(const Locale& aLocale, UErrorCode &success);
481*0e209d39SAndroid Build Coastguard Worker 
482*0e209d39SAndroid Build Coastguard Worker   /**
483*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
484*0e209d39SAndroid Build Coastguard Worker    * @internal
485*0e209d39SAndroid Build Coastguard Worker    */
486*0e209d39SAndroid Build Coastguard Worker   IslamicTBLACalendar(const IslamicTBLACalendar& other) = default;
487*0e209d39SAndroid Build Coastguard Worker 
488*0e209d39SAndroid Build Coastguard Worker   /**
489*0e209d39SAndroid Build Coastguard Worker    * Destructor.
490*0e209d39SAndroid Build Coastguard Worker    * @internal
491*0e209d39SAndroid Build Coastguard Worker    */
492*0e209d39SAndroid Build Coastguard Worker   virtual ~IslamicTBLACalendar();
493*0e209d39SAndroid Build Coastguard Worker 
494*0e209d39SAndroid Build Coastguard Worker   /**
495*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
496*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
497*0e209d39SAndroid Build Coastguard Worker    * @internal
498*0e209d39SAndroid Build Coastguard Worker    */
499*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
500*0e209d39SAndroid Build Coastguard Worker 
501*0e209d39SAndroid Build Coastguard Worker   /**
502*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
503*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
504*0e209d39SAndroid Build Coastguard Worker    *
505*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
506*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
507*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
508*0e209d39SAndroid Build Coastguard Worker    *
509*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
510*0e209d39SAndroid Build Coastguard Worker    * @internal
511*0e209d39SAndroid Build Coastguard Worker    */
512*0e209d39SAndroid Build Coastguard Worker   static UClassID U_EXPORT2 getStaticClassID();
513*0e209d39SAndroid Build Coastguard Worker 
514*0e209d39SAndroid Build Coastguard Worker   /**
515*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "islamic-tbla".
516*0e209d39SAndroid Build Coastguard Worker    *
517*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
518*0e209d39SAndroid Build Coastguard Worker    * @internal
519*0e209d39SAndroid Build Coastguard Worker    */
520*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
521*0e209d39SAndroid Build Coastguard Worker 
522*0e209d39SAndroid Build Coastguard Worker   // clone
523*0e209d39SAndroid Build Coastguard Worker   virtual IslamicTBLACalendar* clone() const override;
524*0e209d39SAndroid Build Coastguard Worker 
525*0e209d39SAndroid Build Coastguard Worker  protected:
526*0e209d39SAndroid Build Coastguard Worker   /**
527*0e209d39SAndroid Build Coastguard Worker    * Return the epoc.
528*0e209d39SAndroid Build Coastguard Worker    * @internal
529*0e209d39SAndroid Build Coastguard Worker    */
530*0e209d39SAndroid Build Coastguard Worker   virtual int32_t getEpoc() const override;
531*0e209d39SAndroid Build Coastguard Worker };
532*0e209d39SAndroid Build Coastguard Worker 
533*0e209d39SAndroid Build Coastguard Worker /*
534*0e209d39SAndroid Build Coastguard Worker  * IslamicUmalquraCalendar
535*0e209d39SAndroid Build Coastguard Worker  * This calendar is referred as "Islamic calendar, Umm al-Qura" in CLDR.
536*0e209d39SAndroid Build Coastguard Worker  */
537*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IslamicUmalquraCalendar : public IslamicCivilCalendar {
538*0e209d39SAndroid Build Coastguard Worker  public:
539*0e209d39SAndroid Build Coastguard Worker   /**
540*0e209d39SAndroid Build Coastguard Worker    * Constructs an IslamicUmalquraCalendar based on the current time in the default time zone
541*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
542*0e209d39SAndroid Build Coastguard Worker    *
543*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
544*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of IslamicUmalquraCalendar object construction.
545*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
546*0e209d39SAndroid Build Coastguard Worker    * @internal
547*0e209d39SAndroid Build Coastguard Worker    */
548*0e209d39SAndroid Build Coastguard Worker   IslamicUmalquraCalendar(const Locale& aLocale, UErrorCode &success);
549*0e209d39SAndroid Build Coastguard Worker 
550*0e209d39SAndroid Build Coastguard Worker   /**
551*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
552*0e209d39SAndroid Build Coastguard Worker    * @internal
553*0e209d39SAndroid Build Coastguard Worker    */
554*0e209d39SAndroid Build Coastguard Worker   IslamicUmalquraCalendar(const IslamicUmalquraCalendar& other) = default;
555*0e209d39SAndroid Build Coastguard Worker 
556*0e209d39SAndroid Build Coastguard Worker   /**
557*0e209d39SAndroid Build Coastguard Worker    * Destructor.
558*0e209d39SAndroid Build Coastguard Worker    * @internal
559*0e209d39SAndroid Build Coastguard Worker    */
560*0e209d39SAndroid Build Coastguard Worker   virtual ~IslamicUmalquraCalendar();
561*0e209d39SAndroid Build Coastguard Worker 
562*0e209d39SAndroid Build Coastguard Worker   /**
563*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
564*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
565*0e209d39SAndroid Build Coastguard Worker    * @internal
566*0e209d39SAndroid Build Coastguard Worker    */
567*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
568*0e209d39SAndroid Build Coastguard Worker 
569*0e209d39SAndroid Build Coastguard Worker   /**
570*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
571*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
572*0e209d39SAndroid Build Coastguard Worker    *
573*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
574*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
575*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
576*0e209d39SAndroid Build Coastguard Worker    *
577*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
578*0e209d39SAndroid Build Coastguard Worker    * @internal
579*0e209d39SAndroid Build Coastguard Worker    */
580*0e209d39SAndroid Build Coastguard Worker   static UClassID U_EXPORT2 getStaticClassID();
581*0e209d39SAndroid Build Coastguard Worker 
582*0e209d39SAndroid Build Coastguard Worker   /**
583*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "islamic-umalqura".
584*0e209d39SAndroid Build Coastguard Worker    *
585*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
586*0e209d39SAndroid Build Coastguard Worker    * @internal
587*0e209d39SAndroid Build Coastguard Worker    */
588*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
589*0e209d39SAndroid Build Coastguard Worker 
590*0e209d39SAndroid Build Coastguard Worker   // clone
591*0e209d39SAndroid Build Coastguard Worker   virtual IslamicUmalquraCalendar* clone() const override;
592*0e209d39SAndroid Build Coastguard Worker 
593*0e209d39SAndroid Build Coastguard Worker  protected:
594*0e209d39SAndroid Build Coastguard Worker   /**
595*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given year starts.  Days are counted
596*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
597*0e209d39SAndroid Build Coastguard Worker    * @internal
598*0e209d39SAndroid Build Coastguard Worker    */
599*0e209d39SAndroid Build Coastguard Worker   virtual int64_t yearStart(int32_t year) const override;
600*0e209d39SAndroid Build Coastguard Worker 
601*0e209d39SAndroid Build Coastguard Worker   /**
602*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given month starts.  Days are counted
603*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
604*0e209d39SAndroid Build Coastguard Worker    *
605*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
606*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
607*0e209d39SAndroid Build Coastguard Worker    * @internal
608*0e209d39SAndroid Build Coastguard Worker    */
609*0e209d39SAndroid Build Coastguard Worker   virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override;
610*0e209d39SAndroid Build Coastguard Worker 
611*0e209d39SAndroid Build Coastguard Worker   /**
612*0e209d39SAndroid Build Coastguard Worker    * Return the length (in days) of the given month.
613*0e209d39SAndroid Build Coastguard Worker    *
614*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri year
615*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri month, 0-based
616*0e209d39SAndroid Build Coastguard Worker    * @internal
617*0e209d39SAndroid Build Coastguard Worker    */
618*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override;
619*0e209d39SAndroid Build Coastguard Worker 
620*0e209d39SAndroid Build Coastguard Worker   /**
621*0e209d39SAndroid Build Coastguard Worker    * Return the number of days in the given Islamic year
622*0e209d39SAndroid Build Coastguard Worker    * @internal
623*0e209d39SAndroid Build Coastguard Worker    */
624*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetYearLength(int32_t extendedYear) const override;
625*0e209d39SAndroid Build Coastguard Worker 
626*0e209d39SAndroid Build Coastguard Worker   /**
627*0e209d39SAndroid Build Coastguard Worker    * Override Calendar to compute several fields specific to the Islamic
628*0e209d39SAndroid Build Coastguard Worker    * calendar system.  These are:
629*0e209d39SAndroid Build Coastguard Worker    *
630*0e209d39SAndroid Build Coastguard Worker    * <ul><li>ERA
631*0e209d39SAndroid Build Coastguard Worker    * <li>YEAR
632*0e209d39SAndroid Build Coastguard Worker    * <li>MONTH
633*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_MONTH
634*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_YEAR
635*0e209d39SAndroid Build Coastguard Worker    * <li>EXTENDED_YEAR</ul>
636*0e209d39SAndroid Build Coastguard Worker    *
637*0e209d39SAndroid Build Coastguard Worker    * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
638*0e209d39SAndroid Build Coastguard Worker    * method is called. The getGregorianXxx() methods return Gregorian
639*0e209d39SAndroid Build Coastguard Worker    * calendar equivalents for the given Julian day.
640*0e209d39SAndroid Build Coastguard Worker    * @internal
641*0e209d39SAndroid Build Coastguard Worker    */
642*0e209d39SAndroid Build Coastguard Worker   virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
643*0e209d39SAndroid Build Coastguard Worker };
644*0e209d39SAndroid Build Coastguard Worker 
645*0e209d39SAndroid Build Coastguard Worker 
646*0e209d39SAndroid Build Coastguard Worker /*
647*0e209d39SAndroid Build Coastguard Worker  * IslamicRGSACalendar
648*0e209d39SAndroid Build Coastguard Worker  * Islamic calendar, Saudi Arabia sighting. Since the calendar depends on the
649*0e209d39SAndroid Build Coastguard Worker  * sighting, it is impossible to implement by algorithm ahead of time. It is
650*0e209d39SAndroid Build Coastguard Worker  * currently identical to IslamicCalendar except the getType will return
651*0e209d39SAndroid Build Coastguard Worker  * "islamic-rgsa".
652*0e209d39SAndroid Build Coastguard Worker  */
653*0e209d39SAndroid Build Coastguard Worker class U_I18N_API IslamicRGSACalendar : public IslamicCalendar {
654*0e209d39SAndroid Build Coastguard Worker  public:
655*0e209d39SAndroid Build Coastguard Worker   /**
656*0e209d39SAndroid Build Coastguard Worker    * Constructs an IslamicRGSACalendar based on the current time in the default time zone
657*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
658*0e209d39SAndroid Build Coastguard Worker    *
659*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
660*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of IslamicRGSACalendar object construction.
661*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
662*0e209d39SAndroid Build Coastguard Worker    * @internal
663*0e209d39SAndroid Build Coastguard Worker    */
664*0e209d39SAndroid Build Coastguard Worker   IslamicRGSACalendar(const Locale& aLocale, UErrorCode &success);
665*0e209d39SAndroid Build Coastguard Worker 
666*0e209d39SAndroid Build Coastguard Worker   /**
667*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
668*0e209d39SAndroid Build Coastguard Worker    * @internal
669*0e209d39SAndroid Build Coastguard Worker    */
670*0e209d39SAndroid Build Coastguard Worker   IslamicRGSACalendar(const IslamicRGSACalendar& other) = default;
671*0e209d39SAndroid Build Coastguard Worker 
672*0e209d39SAndroid Build Coastguard Worker   /**
673*0e209d39SAndroid Build Coastguard Worker    * Destructor.
674*0e209d39SAndroid Build Coastguard Worker    * @internal
675*0e209d39SAndroid Build Coastguard Worker    */
676*0e209d39SAndroid Build Coastguard Worker   virtual ~IslamicRGSACalendar();
677*0e209d39SAndroid Build Coastguard Worker 
678*0e209d39SAndroid Build Coastguard Worker   /**
679*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
680*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
681*0e209d39SAndroid Build Coastguard Worker    * @internal
682*0e209d39SAndroid Build Coastguard Worker    */
683*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
684*0e209d39SAndroid Build Coastguard Worker 
685*0e209d39SAndroid Build Coastguard Worker   /**
686*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
687*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
688*0e209d39SAndroid Build Coastguard Worker    *
689*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
690*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
691*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
692*0e209d39SAndroid Build Coastguard Worker    *
693*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
694*0e209d39SAndroid Build Coastguard Worker    * @internal
695*0e209d39SAndroid Build Coastguard Worker    */
696*0e209d39SAndroid Build Coastguard Worker   static UClassID U_EXPORT2 getStaticClassID();
697*0e209d39SAndroid Build Coastguard Worker 
698*0e209d39SAndroid Build Coastguard Worker   /**
699*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "islamic-rgsa".
700*0e209d39SAndroid Build Coastguard Worker    *
701*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
702*0e209d39SAndroid Build Coastguard Worker    * @internal
703*0e209d39SAndroid Build Coastguard Worker    */
704*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
705*0e209d39SAndroid Build Coastguard Worker 
706*0e209d39SAndroid Build Coastguard Worker   // clone
707*0e209d39SAndroid Build Coastguard Worker   virtual IslamicRGSACalendar* clone() const override;
708*0e209d39SAndroid Build Coastguard Worker };
709*0e209d39SAndroid Build Coastguard Worker 
710*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
711*0e209d39SAndroid Build Coastguard Worker 
712*0e209d39SAndroid Build Coastguard Worker #endif
713*0e209d39SAndroid Build Coastguard Worker #endif
714