1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ******************************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Copyright (C) 2003-2008, International Business Machines Corporation
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and others. All Rights Reserved.
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ******************************************************************************
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * File PERSNCAL.H
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Modification History:
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Date        Name        Description
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   9/23/2003 mehran        posted to icu-design
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *****************************************************************************
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef PERSNCAL_H
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define PERSNCAL_H
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FORMATTING
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/calendar.h"
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>PersianCalendar</code> is a subclass of <code>Calendar</code>
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * that implements the Persian calendar.  It is used as the official
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * calendar in Iran.  This calendar is also known as the "Hijri Shamsi"
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * calendar, since it starts at the time of Mohammed's emigration (or
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * "hijra") to Medinah on Thursday, July 15, 622 AD (Julian) and is a
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * solar calendar system (or "shamsi").
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The Persian calendar is strictly solar, and thus a Persian year has twelve
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * solar months. A Persian year is about 365 days long, except in leap years
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * which is 366 days long.
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The six first months of Persian Calendar are 31 days long. The next five
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * months are 30 days long. The last month is 29 days long in normal years,
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and 30 days long in leap years.
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @see GregorianCalendar
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @author Mehran Mehr
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @internal
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class PersianCalendar : public Calendar {
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Constants...
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Constants for the months
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  enum EMonths {
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Farvardin, the 1st month of the Persian year.
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FARVARDIN = 0,
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Ordibehesht, the 2nd month of the Persian year.
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ORDIBEHESHT = 1,
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Khordad, the 3rd month of the Persian year.
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    KHORDAD = 2,
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Tir, the 4th month of the Persian year.
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TIR = 3,
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Mordad, the 5th month of the Persian year.
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    MORDAD = 4,
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Shahrivar, the 6th month of the Persian year.
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    SHAHRIVAR = 5,
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Mehr, the 7th month of the Persian year.
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    MEHR = 6,
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Aban, the 8th month of the Persian year.
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ABAN = 7,
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Azar, the 9th month of the Persian year.
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    AZAR = 8,
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Dei, the 10th month of the Persian year.
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    DEI = 9,
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Bahman, the 11th month of the Persian year.
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    BAHMAN = 10,
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Constant for Esfand, the 12th month of the Persian year.
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ESFAND = 11,
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PERSIAN_MONTH_MAX
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  };
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Constructors...
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Constructs a PersianCalendar based on the current time in the default time zone
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * with the given locale.
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param aLocale  The given locale.
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param success  Indicates the status of PersianCalendar object construction.
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *                 Returns U_ZERO_ERROR if constructed successfully.
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  PersianCalendar(const Locale& aLocale, UErrorCode &success);
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Copy Constructor
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  PersianCalendar(const PersianCalendar& other);
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Destructor.
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual ~PersianCalendar();
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // TODO: copy c'tor, etc
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // clone
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual Calendar* clone() const;
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private:
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Determine whether a year is a leap year in the Persian calendar
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static UBool isLeapYear(int32_t year);
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Return the day # on which the given year starts.  Days are counted
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * from the Hijri epoch, origin 0.
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  int32_t yearStart(int32_t year);
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Return the day # on which the given month starts.  Days are counted
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * from the Hijri epoch, origin 0.
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param year  The hijri shamsi year
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param year  The hijri shamsi month, 0-based
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  int32_t monthStart(int32_t year, int32_t month) const;
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //----------------------------------------------------------------------
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Calendar framework
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //----------------------------------------------------------------------
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) protected:
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Return the length (in days) of the given month.
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param year  The hijri shamsi year
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param year  The hijri shamsi month, 0-based
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const;
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Return the number of days in the given Persian year
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t handleGetYearLength(int32_t extendedYear) const;
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Functions for converting from field values to milliseconds....
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Return JD of start of given month/year
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const;
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // Functions for converting from milliseconds to field values
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  //-------------------------------------------------------------------------
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t handleGetExtendedYear();
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Override Calendar to compute several fields specific to the Persian
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * calendar system.  These are:
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <ul><li>ERA
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <li>YEAR
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <li>MONTH
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <li>DAY_OF_MONTH
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <li>DAY_OF_YEAR
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * <li>EXTENDED_YEAR</ul>
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * method is called. The getGregorianXxx() methods return Gregorian
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * calendar equivalents for the given Julian day.
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  // UObject stuff
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @return   The class ID for this object. All objects of a given class have the
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *           same class ID. Objects of other classes have different class IDs.
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual UClassID getDynamicClassID(void) const;
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Return the class ID for this class. This is useful only for comparing to a return
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * value from getDynamicClassID(). For example:
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *      Base* polymorphic_pointer = createPolymorphicObject();
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *      if (polymorphic_pointer->getDynamicClassID() ==
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *          Derived::getStaticClassID()) ...
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @return   The class ID for all objects of this class.
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * return the calendar type, "persian".
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @return calendar type
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual const char * getType() const;
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private:
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  PersianCalendar(); // default constructor not implemented
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) protected:
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * (Overrides Calendar) Return true if the current date for this Calendar is in
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Daylight Savings Time. Recognizes DST_OFFSET, if it is set.
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @param status Fill-in parameter which receives the status of this operation.
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @return   True if the current date for this Calendar is in Daylight Savings Time,
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   *           false, otherwise.
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual UBool inDaylightTime(UErrorCode& status) const;
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Returns TRUE because the Persian Calendar does have a default century
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual UBool haveDefaultCentury() const;
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Returns the date of the start of the default century
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @return start of century - in milliseconds since epoch, 1970
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual UDate defaultCenturyStart() const;
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Returns the year in which the default century begins
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * @internal
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  virtual int32_t defaultCenturyStartYear() const;
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private: // default century stuff.
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * The system maintains a static default century start date.  This is initialized
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * the first time it is used.  Before then, it is set to SYSTEM_DEFAULT_CENTURY to
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * indicate an uninitialized state.  Once the system default century date and year
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * are set, they do not change.
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static UDate         fgSystemDefaultCenturyStart;
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * See documentation for systemDefaultCenturyStart.
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static int32_t          fgSystemDefaultCenturyStartYear;
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Default value that indicates the defaultCenturyStartYear is unitialized
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static const int32_t    fgSystemDefaultCenturyYear;
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * start of default century, as a date
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static const UDate        fgSystemDefaultCentury;
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Returns the beginning date of the 100-year window that dates
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * with 2-digit years are considered to fall within.
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  UDate         internalGetDefaultCenturyStart(void) const;
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Returns the first year of the 100-year window that dates with
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * 2-digit years are considered to fall within.
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  int32_t          internalGetDefaultCenturyStartYear(void) const;
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  /**
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * Initializes the 100-year window that dates with 2-digit years
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * are considered to fall within so that its start date is 80 years
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   * before the current time.
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   */
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  static void  initializeSystemDefaultCentury(void);
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
365