tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

persncal.h (7995B)


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