xref: /aosp_15_r20/external/icu/libicu/cts_headers/persncal.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 PERSNCAL.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  *   9/23/2003 mehran        posted to icu-design
15*0e209d39SAndroid Build Coastguard Worker  *****************************************************************************
16*0e209d39SAndroid Build Coastguard Worker  */
17*0e209d39SAndroid Build Coastguard Worker 
18*0e209d39SAndroid Build Coastguard Worker #ifndef PERSNCAL_H
19*0e209d39SAndroid Build Coastguard Worker #define PERSNCAL_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>PersianCalendar</code> is a subclass of <code>Calendar</code>
31*0e209d39SAndroid Build Coastguard Worker  * that implements the Persian calendar.  It is used as the official
32*0e209d39SAndroid Build Coastguard Worker  * calendar in Iran.  This calendar is also known as the "Hijri Shamsi"
33*0e209d39SAndroid Build Coastguard Worker  * calendar, since it starts at the time of Mohammed's emigration (or
34*0e209d39SAndroid Build Coastguard Worker  * "hijra") to Medinah on Thursday, July 15, 622 AD (Julian) and is a
35*0e209d39SAndroid Build Coastguard Worker  * solar calendar system (or "shamsi").
36*0e209d39SAndroid Build Coastguard Worker  * <p>
37*0e209d39SAndroid Build Coastguard Worker  * The Persian calendar is strictly solar, and thus a Persian year has twelve
38*0e209d39SAndroid Build Coastguard Worker  * solar months. A Persian year is about 365 days long, except in leap years
39*0e209d39SAndroid Build Coastguard Worker  * which is 366 days long.
40*0e209d39SAndroid Build Coastguard Worker  * <p>
41*0e209d39SAndroid Build Coastguard Worker  * The six first months of Persian Calendar are 31 days long. The next five
42*0e209d39SAndroid Build Coastguard Worker  * months are 30 days long. The last month is 29 days long in normal years,
43*0e209d39SAndroid Build Coastguard Worker  * and 30 days long in leap years.
44*0e209d39SAndroid Build Coastguard Worker  *
45*0e209d39SAndroid Build Coastguard Worker  * @see GregorianCalendar
46*0e209d39SAndroid Build Coastguard Worker  *
47*0e209d39SAndroid Build Coastguard Worker  * @author Mehran Mehr
48*0e209d39SAndroid Build Coastguard Worker  * @internal
49*0e209d39SAndroid Build Coastguard Worker  */
50*0e209d39SAndroid Build Coastguard Worker class PersianCalendar : public Calendar {
51*0e209d39SAndroid Build Coastguard Worker  public:
52*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
53*0e209d39SAndroid Build Coastguard Worker   // Constants...
54*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
55*0e209d39SAndroid Build Coastguard Worker   /**
56*0e209d39SAndroid Build Coastguard Worker    * Constants for the months
57*0e209d39SAndroid Build Coastguard Worker    * @internal
58*0e209d39SAndroid Build Coastguard Worker    */
59*0e209d39SAndroid Build Coastguard Worker   enum EMonths {
60*0e209d39SAndroid Build Coastguard Worker     /**
61*0e209d39SAndroid Build Coastguard Worker      * Constant for Farvardin, the 1st month of the Persian year.
62*0e209d39SAndroid Build Coastguard Worker      * @internal
63*0e209d39SAndroid Build Coastguard Worker      */
64*0e209d39SAndroid Build Coastguard Worker     FARVARDIN = 0,
65*0e209d39SAndroid Build Coastguard Worker 
66*0e209d39SAndroid Build Coastguard Worker     /**
67*0e209d39SAndroid Build Coastguard Worker      * Constant for Ordibehesht, the 2nd month of the Persian year.
68*0e209d39SAndroid Build Coastguard Worker      * @internal
69*0e209d39SAndroid Build Coastguard Worker      */
70*0e209d39SAndroid Build Coastguard Worker     ORDIBEHESHT = 1,
71*0e209d39SAndroid Build Coastguard Worker 
72*0e209d39SAndroid Build Coastguard Worker     /**
73*0e209d39SAndroid Build Coastguard Worker      * Constant for Khordad, the 3rd month of the Persian year.
74*0e209d39SAndroid Build Coastguard Worker      * @internal
75*0e209d39SAndroid Build Coastguard Worker      */
76*0e209d39SAndroid Build Coastguard Worker     KHORDAD = 2,
77*0e209d39SAndroid Build Coastguard Worker 
78*0e209d39SAndroid Build Coastguard Worker     /**
79*0e209d39SAndroid Build Coastguard Worker      * Constant for Tir, the 4th month of the Persian year.
80*0e209d39SAndroid Build Coastguard Worker      * @internal
81*0e209d39SAndroid Build Coastguard Worker      */
82*0e209d39SAndroid Build Coastguard Worker     TIR = 3,
83*0e209d39SAndroid Build Coastguard Worker 
84*0e209d39SAndroid Build Coastguard Worker     /**
85*0e209d39SAndroid Build Coastguard Worker      * Constant for Mordad, the 5th month of the Persian year.
86*0e209d39SAndroid Build Coastguard Worker      * @internal
87*0e209d39SAndroid Build Coastguard Worker      */
88*0e209d39SAndroid Build Coastguard Worker     MORDAD = 4,
89*0e209d39SAndroid Build Coastguard Worker 
90*0e209d39SAndroid Build Coastguard Worker     /**
91*0e209d39SAndroid Build Coastguard Worker      * Constant for Shahrivar, the 6th month of the Persian year.
92*0e209d39SAndroid Build Coastguard Worker      * @internal
93*0e209d39SAndroid Build Coastguard Worker      */
94*0e209d39SAndroid Build Coastguard Worker     SHAHRIVAR = 5,
95*0e209d39SAndroid Build Coastguard Worker 
96*0e209d39SAndroid Build Coastguard Worker     /**
97*0e209d39SAndroid Build Coastguard Worker      * Constant for Mehr, the 7th month of the Persian year.
98*0e209d39SAndroid Build Coastguard Worker      * @internal
99*0e209d39SAndroid Build Coastguard Worker      */
100*0e209d39SAndroid Build Coastguard Worker     MEHR = 6,
101*0e209d39SAndroid Build Coastguard Worker 
102*0e209d39SAndroid Build Coastguard Worker     /**
103*0e209d39SAndroid Build Coastguard Worker      * Constant for Aban, the 8th month of the Persian year.
104*0e209d39SAndroid Build Coastguard Worker      * @internal
105*0e209d39SAndroid Build Coastguard Worker      */
106*0e209d39SAndroid Build Coastguard Worker     ABAN = 7,
107*0e209d39SAndroid Build Coastguard Worker 
108*0e209d39SAndroid Build Coastguard Worker     /**
109*0e209d39SAndroid Build Coastguard Worker      * Constant for Azar, the 9th month of the Persian year.
110*0e209d39SAndroid Build Coastguard Worker      * @internal
111*0e209d39SAndroid Build Coastguard Worker      */
112*0e209d39SAndroid Build Coastguard Worker     AZAR = 8,
113*0e209d39SAndroid Build Coastguard Worker 
114*0e209d39SAndroid Build Coastguard Worker     /**
115*0e209d39SAndroid Build Coastguard Worker      * Constant for Dei, the 10th month of the Persian year.
116*0e209d39SAndroid Build Coastguard Worker      * @internal
117*0e209d39SAndroid Build Coastguard Worker      */
118*0e209d39SAndroid Build Coastguard Worker     DEI = 9,
119*0e209d39SAndroid Build Coastguard Worker 
120*0e209d39SAndroid Build Coastguard Worker     /**
121*0e209d39SAndroid Build Coastguard Worker      * Constant for Bahman, the 11th month of the Persian year.
122*0e209d39SAndroid Build Coastguard Worker      * @internal
123*0e209d39SAndroid Build Coastguard Worker      */
124*0e209d39SAndroid Build Coastguard Worker     BAHMAN = 10,
125*0e209d39SAndroid Build Coastguard Worker 
126*0e209d39SAndroid Build Coastguard Worker     /**
127*0e209d39SAndroid Build Coastguard Worker      * Constant for Esfand, the 12th month of the Persian year.
128*0e209d39SAndroid Build Coastguard Worker      * @internal
129*0e209d39SAndroid Build Coastguard Worker      */
130*0e209d39SAndroid Build Coastguard Worker     ESFAND = 11,
131*0e209d39SAndroid Build Coastguard Worker 
132*0e209d39SAndroid Build Coastguard Worker     PERSIAN_MONTH_MAX
133*0e209d39SAndroid Build Coastguard Worker   };
134*0e209d39SAndroid Build Coastguard Worker 
135*0e209d39SAndroid Build Coastguard Worker 
136*0e209d39SAndroid Build Coastguard Worker 
137*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
138*0e209d39SAndroid Build Coastguard Worker   // Constructors...
139*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
140*0e209d39SAndroid Build Coastguard Worker 
141*0e209d39SAndroid Build Coastguard Worker   /**
142*0e209d39SAndroid Build Coastguard Worker    * Constructs a PersianCalendar based on the current time in the default time zone
143*0e209d39SAndroid Build Coastguard Worker    * with the given locale.
144*0e209d39SAndroid Build Coastguard Worker    *
145*0e209d39SAndroid Build Coastguard Worker    * @param aLocale  The given locale.
146*0e209d39SAndroid Build Coastguard Worker    * @param success  Indicates the status of PersianCalendar object construction.
147*0e209d39SAndroid Build Coastguard Worker    *                 Returns U_ZERO_ERROR if constructed successfully.
148*0e209d39SAndroid Build Coastguard Worker    * @internal
149*0e209d39SAndroid Build Coastguard Worker    */
150*0e209d39SAndroid Build Coastguard Worker   PersianCalendar(const Locale& aLocale, UErrorCode &success);
151*0e209d39SAndroid Build Coastguard Worker 
152*0e209d39SAndroid Build Coastguard Worker   /**
153*0e209d39SAndroid Build Coastguard Worker    * Copy Constructor
154*0e209d39SAndroid Build Coastguard Worker    * @internal
155*0e209d39SAndroid Build Coastguard Worker    */
156*0e209d39SAndroid Build Coastguard Worker   PersianCalendar(const PersianCalendar& other);
157*0e209d39SAndroid Build Coastguard Worker 
158*0e209d39SAndroid Build Coastguard Worker   /**
159*0e209d39SAndroid Build Coastguard Worker    * Destructor.
160*0e209d39SAndroid Build Coastguard Worker    * @internal
161*0e209d39SAndroid Build Coastguard Worker    */
162*0e209d39SAndroid Build Coastguard Worker   virtual ~PersianCalendar();
163*0e209d39SAndroid Build Coastguard Worker 
164*0e209d39SAndroid Build Coastguard Worker   // TODO: copy c'tor, etc
165*0e209d39SAndroid Build Coastguard Worker 
166*0e209d39SAndroid Build Coastguard Worker   // clone
167*0e209d39SAndroid Build Coastguard Worker   virtual PersianCalendar* clone() const override;
168*0e209d39SAndroid Build Coastguard Worker 
169*0e209d39SAndroid Build Coastguard Worker  private:
170*0e209d39SAndroid Build Coastguard Worker   /**
171*0e209d39SAndroid Build Coastguard Worker    * Determine whether a year is a leap year in the Persian calendar
172*0e209d39SAndroid Build Coastguard Worker    */
173*0e209d39SAndroid Build Coastguard Worker   static UBool isLeapYear(int32_t year);
174*0e209d39SAndroid Build Coastguard Worker 
175*0e209d39SAndroid Build Coastguard Worker   /**
176*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given year starts.  Days are counted
177*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
178*0e209d39SAndroid Build Coastguard Worker    */
179*0e209d39SAndroid Build Coastguard Worker   int32_t yearStart(int32_t year, UErrorCode& status);
180*0e209d39SAndroid Build Coastguard Worker 
181*0e209d39SAndroid Build Coastguard Worker   /**
182*0e209d39SAndroid Build Coastguard Worker    * Return the day # on which the given month starts.  Days are counted
183*0e209d39SAndroid Build Coastguard Worker    * from the Hijri epoch, origin 0.
184*0e209d39SAndroid Build Coastguard Worker    *
185*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri shamsi year
186*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri shamsi month, 0-based
187*0e209d39SAndroid Build Coastguard Worker    */
188*0e209d39SAndroid Build Coastguard Worker   int32_t monthStart(int32_t year, int32_t month, UErrorCode& status) const;
189*0e209d39SAndroid Build Coastguard Worker 
190*0e209d39SAndroid Build Coastguard Worker   //----------------------------------------------------------------------
191*0e209d39SAndroid Build Coastguard Worker   // Calendar framework
192*0e209d39SAndroid Build Coastguard Worker   //----------------------------------------------------------------------
193*0e209d39SAndroid Build Coastguard Worker  protected:
194*0e209d39SAndroid Build Coastguard Worker   /**
195*0e209d39SAndroid Build Coastguard Worker    * @internal
196*0e209d39SAndroid Build Coastguard Worker    */
197*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override;
198*0e209d39SAndroid Build Coastguard Worker 
199*0e209d39SAndroid Build Coastguard Worker   /**
200*0e209d39SAndroid Build Coastguard Worker    * Return the length (in days) of the given month.
201*0e209d39SAndroid Build Coastguard Worker    *
202*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri shamsi year
203*0e209d39SAndroid Build Coastguard Worker    * @param year  The hijri shamsi month, 0-based
204*0e209d39SAndroid Build Coastguard Worker    * @internal
205*0e209d39SAndroid Build Coastguard Worker    */
206*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override;
207*0e209d39SAndroid Build Coastguard Worker 
208*0e209d39SAndroid Build Coastguard Worker   /**
209*0e209d39SAndroid Build Coastguard Worker    * Return the number of days in the given Persian year
210*0e209d39SAndroid Build Coastguard Worker    * @internal
211*0e209d39SAndroid Build Coastguard Worker    */
212*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetYearLength(int32_t extendedYear) const override;
213*0e209d39SAndroid Build Coastguard Worker 
214*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
215*0e209d39SAndroid Build Coastguard Worker   // Functions for converting from field values to milliseconds....
216*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
217*0e209d39SAndroid Build Coastguard Worker 
218*0e209d39SAndroid Build Coastguard Worker   // Return JD of start of given month/year
219*0e209d39SAndroid Build Coastguard Worker   /**
220*0e209d39SAndroid Build Coastguard Worker    * @internal
221*0e209d39SAndroid Build Coastguard Worker    */
222*0e209d39SAndroid Build Coastguard Worker   virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override;
223*0e209d39SAndroid Build Coastguard Worker 
224*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
225*0e209d39SAndroid Build Coastguard Worker   // Functions for converting from milliseconds to field values
226*0e209d39SAndroid Build Coastguard Worker   //-------------------------------------------------------------------------
227*0e209d39SAndroid Build Coastguard Worker 
228*0e209d39SAndroid Build Coastguard Worker   /**
229*0e209d39SAndroid Build Coastguard Worker    * @internal
230*0e209d39SAndroid Build Coastguard Worker    */
231*0e209d39SAndroid Build Coastguard Worker   virtual int32_t handleGetExtendedYear(UErrorCode& status) override;
232*0e209d39SAndroid Build Coastguard Worker 
233*0e209d39SAndroid Build Coastguard Worker   /**
234*0e209d39SAndroid Build Coastguard Worker    * Override Calendar to compute several fields specific to the Persian
235*0e209d39SAndroid Build Coastguard Worker    * calendar system.  These are:
236*0e209d39SAndroid Build Coastguard Worker    *
237*0e209d39SAndroid Build Coastguard Worker    * <ul><li>ERA
238*0e209d39SAndroid Build Coastguard Worker    * <li>YEAR
239*0e209d39SAndroid Build Coastguard Worker    * <li>MONTH
240*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_MONTH
241*0e209d39SAndroid Build Coastguard Worker    * <li>DAY_OF_YEAR
242*0e209d39SAndroid Build Coastguard Worker    * <li>EXTENDED_YEAR</ul>
243*0e209d39SAndroid Build Coastguard Worker    *
244*0e209d39SAndroid Build Coastguard Worker    * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
245*0e209d39SAndroid Build Coastguard Worker    * method is called. The getGregorianXxx() methods return Gregorian
246*0e209d39SAndroid Build Coastguard Worker    * calendar equivalents for the given Julian day.
247*0e209d39SAndroid Build Coastguard Worker    * @internal
248*0e209d39SAndroid Build Coastguard Worker    */
249*0e209d39SAndroid Build Coastguard Worker   virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
250*0e209d39SAndroid Build Coastguard Worker 
251*0e209d39SAndroid Build Coastguard Worker   // UObject stuff
252*0e209d39SAndroid Build Coastguard Worker  public:
253*0e209d39SAndroid Build Coastguard Worker   /**
254*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for this object. All objects of a given class have the
255*0e209d39SAndroid Build Coastguard Worker    *           same class ID. Objects of other classes have different class IDs.
256*0e209d39SAndroid Build Coastguard Worker    * @internal
257*0e209d39SAndroid Build Coastguard Worker    */
258*0e209d39SAndroid Build Coastguard Worker   virtual UClassID getDynamicClassID() const override;
259*0e209d39SAndroid Build Coastguard Worker 
260*0e209d39SAndroid Build Coastguard Worker   /**
261*0e209d39SAndroid Build Coastguard Worker    * Return the class ID for this class. This is useful only for comparing to a return
262*0e209d39SAndroid Build Coastguard Worker    * value from getDynamicClassID(). For example:
263*0e209d39SAndroid Build Coastguard Worker    *
264*0e209d39SAndroid Build Coastguard Worker    *      Base* polymorphic_pointer = createPolymorphicObject();
265*0e209d39SAndroid Build Coastguard Worker    *      if (polymorphic_pointer->getDynamicClassID() ==
266*0e209d39SAndroid Build Coastguard Worker    *          Derived::getStaticClassID()) ...
267*0e209d39SAndroid Build Coastguard Worker    *
268*0e209d39SAndroid Build Coastguard Worker    * @return   The class ID for all objects of this class.
269*0e209d39SAndroid Build Coastguard Worker    * @internal
270*0e209d39SAndroid Build Coastguard Worker    */
271*0e209d39SAndroid Build Coastguard Worker   U_I18N_API static UClassID U_EXPORT2 getStaticClassID();
272*0e209d39SAndroid Build Coastguard Worker 
273*0e209d39SAndroid Build Coastguard Worker   /**
274*0e209d39SAndroid Build Coastguard Worker    * return the calendar type, "persian".
275*0e209d39SAndroid Build Coastguard Worker    *
276*0e209d39SAndroid Build Coastguard Worker    * @return calendar type
277*0e209d39SAndroid Build Coastguard Worker    * @internal
278*0e209d39SAndroid Build Coastguard Worker    */
279*0e209d39SAndroid Build Coastguard Worker   virtual const char * getType() const override;
280*0e209d39SAndroid Build Coastguard Worker 
281*0e209d39SAndroid Build Coastguard Worker   /**
282*0e209d39SAndroid Build Coastguard Worker    * @return      The related Gregorian year; will be obtained by modifying the value
283*0e209d39SAndroid Build Coastguard Worker    *              obtained by get from UCAL_EXTENDED_YEAR field
284*0e209d39SAndroid Build Coastguard Worker    * @internal
285*0e209d39SAndroid Build Coastguard Worker    */
286*0e209d39SAndroid Build Coastguard Worker   virtual int32_t getRelatedYear(UErrorCode &status) const override;
287*0e209d39SAndroid Build Coastguard Worker 
288*0e209d39SAndroid Build Coastguard Worker   /**
289*0e209d39SAndroid Build Coastguard Worker    * @param year  The related Gregorian year to set; will be modified as necessary then
290*0e209d39SAndroid Build Coastguard Worker    *              set in UCAL_EXTENDED_YEAR field
291*0e209d39SAndroid Build Coastguard Worker    * @internal
292*0e209d39SAndroid Build Coastguard Worker    */
293*0e209d39SAndroid Build Coastguard Worker   virtual void setRelatedYear(int32_t year) override;
294*0e209d39SAndroid Build Coastguard Worker 
295*0e209d39SAndroid Build Coastguard Worker  private:
296*0e209d39SAndroid Build Coastguard Worker   PersianCalendar(); // default constructor not implemented
297*0e209d39SAndroid Build Coastguard Worker 
298*0e209d39SAndroid Build Coastguard Worker  protected:
299*0e209d39SAndroid Build Coastguard Worker   DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY
300*0e209d39SAndroid Build Coastguard Worker };
301*0e209d39SAndroid Build Coastguard Worker 
302*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
303*0e209d39SAndroid Build Coastguard Worker 
304*0e209d39SAndroid Build Coastguard Worker #endif
305*0e209d39SAndroid Build Coastguard Worker #endif
306*0e209d39SAndroid Build Coastguard Worker 
307*0e209d39SAndroid Build Coastguard Worker 
308*0e209d39SAndroid Build Coastguard Worker 
309