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