Home | History | Annotate | Download | only in i18n
      1 /*
      2  ********************************************************************************
      3  * Copyright (C) 2003-2007, International Business Machines Corporation
      4  * and others. All Rights Reserved.
      5  ********************************************************************************
      6  *
      7  * File BUDDHCAL.H
      8  *
      9  * Modification History:
     10  *
     11  *   Date        Name        Description
     12  *   05/13/2003  srl          copied from gregocal.h
     13  ********************************************************************************
     14  */
     15 
     16 #ifndef BUDDHCAL_H
     17 #define BUDDHCAL_H
     18 
     19 #include "unicode/utypes.h"
     20 
     21 #if !UCONFIG_NO_FORMATTING
     22 
     23 #include "unicode/calendar.h"
     24 #include "unicode/gregocal.h"
     25 
     26 U_NAMESPACE_BEGIN
     27 
     28 /**
     29  * Concrete class which provides the Buddhist calendar.
     30  * <P>
     31  * <code>BuddhistCalendar</code> is a subclass of <code>GregorianCalendar</code>
     32  * that numbers years since the birth of the Buddha.  This is the civil calendar
     33  * in some predominantly Buddhist countries such as Thailand, and it is used for
     34  * religious purposes elsewhere.
     35  * <p>
     36  * The Buddhist calendar is identical to the Gregorian calendar in all respects
     37  * except for the year and era.  Years are numbered since the birth of the
     38  * Buddha in 543 BC (Gregorian), so that 1 AD (Gregorian) is equivalent to 544
     39  * BE (Buddhist Era) and 1998 AD is 2541 BE.
     40  * <p>
     41  * The Buddhist Calendar has only one allowable era: <code>BE</code>.  If the
     42  * calendar is not in lenient mode (see <code>setLenient</code>), dates before
     43  * 1/1/1 BE are rejected as an illegal argument.
     44  * <p>
     45  * @internal
     46  */
     47 class BuddhistCalendar : public GregorianCalendar {
     48 public:
     49 
     50     /**
     51      * Useful constants for BuddhistCalendar.  Only one Era.
     52      * @internal
     53      */
     54     enum EEras {
     55        BE
     56     };
     57 
     58     /**
     59      * Constructs a BuddhistCalendar based on the current time in the default time zone
     60      * with the given locale.
     61      *
     62      * @param aLocale  The given locale.
     63      * @param success  Indicates the status of BuddhistCalendar object construction.
     64      *                 Returns U_ZERO_ERROR if constructed successfully.
     65      * @internal
     66      */
     67     BuddhistCalendar(const Locale& aLocale, UErrorCode& success);
     68 
     69 
     70     /**
     71      * Destructor
     72      * @internal
     73      */
     74     virtual ~BuddhistCalendar();
     75 
     76     /**
     77      * Copy constructor
     78      * @param source    the object to be copied.
     79      * @internal
     80      */
     81     BuddhistCalendar(const BuddhistCalendar& source);
     82 
     83     /**
     84      * Default assignment operator
     85      * @param right    the object to be copied.
     86      * @internal
     87      */
     88     BuddhistCalendar& operator=(const BuddhistCalendar& right);
     89 
     90     /**
     91      * Create and return a polymorphic copy of this calendar.
     92      * @return    return a polymorphic copy of this calendar.
     93      * @internal
     94      */
     95     virtual Calendar* clone(void) const;
     96 
     97 public:
     98     /**
     99      * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
    100      * override. This method is to implement a simple version of RTTI, since not all C++
    101      * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
    102      * this method.
    103      *
    104      * @return   The class ID for this object. All objects of a given class have the
    105      *           same class ID. Objects of other classes have different class IDs.
    106      * @internal
    107      */
    108     virtual UClassID getDynamicClassID(void) const;
    109 
    110     /**
    111      * Return the class ID for this class. This is useful only for comparing to a return
    112      * value from getDynamicClassID(). For example:
    113      *
    114      *      Base* polymorphic_pointer = createPolymorphicObject();
    115      *      if (polymorphic_pointer->getDynamicClassID() ==
    116      *          Derived::getStaticClassID()) ...
    117      *
    118      * @return   The class ID for all objects of this class.
    119      * @internal
    120      */
    121     U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
    122 
    123     /**
    124      * return the calendar type, "buddhist".
    125      *
    126      * @return calendar type
    127      * @internal
    128      */
    129     virtual const char * getType() const;
    130 
    131 private:
    132     BuddhistCalendar(); // default constructor not implemented
    133 
    134  protected:
    135     /**
    136      * Return the extended year defined by the current fields.  This will
    137      * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
    138      * as UCAL_ERA) specific to the calendar system, depending on which set of
    139      * fields is newer.
    140      * @return the extended year
    141      * @internal
    142      */
    143     virtual int32_t handleGetExtendedYear();
    144     /**
    145      * Subclasses may override this method to compute several fields
    146      * specific to each calendar system.
    147      * @internal
    148      */
    149     virtual void handleComputeFields(int32_t julianDay, UErrorCode& status);
    150     /**
    151      * Subclass API for defining limits of different types.
    152      * @param field one of the field numbers
    153      * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
    154      * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
    155      * @internal
    156      */
    157     virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
    158         /**
    159      * Return the Julian day number of day before the first day of the
    160      * given month in the given extended year.  Subclasses should override
    161      * this method to implement their calendar system.
    162      * @param eyear the extended year
    163      * @param month the zero-based month, or 0 if useMonth is false
    164      * @param useMonth if false, compute the day before the first day of
    165      * the given year, otherwise, compute the day before the first day of
    166      * the given month
    167      * @param return the Julian day number of the day before the first
    168      * day of the given month and year
    169      * @internal
    170      */
    171     virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
    172                                             UBool useMonth) const;
    173 
    174     /**
    175      * Returns TRUE because the Buddhist Calendar does have a default century
    176      * @internal
    177      */
    178     virtual UBool haveDefaultCentury() const;
    179 
    180     /**
    181      * Returns the date of the start of the default century
    182      * @return start of century - in milliseconds since epoch, 1970
    183      * @internal
    184      */
    185     virtual UDate defaultCenturyStart() const;
    186 
    187     /**
    188      * Returns the year in which the default century begins
    189      * @internal
    190      */
    191     virtual int32_t defaultCenturyStartYear() const;
    192 
    193  private: // default century stuff.
    194     /**
    195      * The system maintains a static default century start date.  This is initialized
    196      * the first time it is used.  Before then, it is set to SYSTEM_DEFAULT_CENTURY to
    197      * indicate an uninitialized state.  Once the system default century date and year
    198      * are set, they do not change.
    199      */
    200     static UDate         fgSystemDefaultCenturyStart;
    201 
    202     /**
    203      * See documentation for systemDefaultCenturyStart.
    204      */
    205     static int32_t          fgSystemDefaultCenturyStartYear;
    206 
    207     /**
    208      * Default value that indicates the defaultCenturyStartYear is unitialized
    209      */
    210     static const int32_t    fgSystemDefaultCenturyYear;
    211 
    212     /**
    213      * start of default century, as a date
    214      */
    215     static const UDate        fgSystemDefaultCentury;
    216 
    217     /**
    218      * Returns the beginning date of the 100-year window that dates
    219      * with 2-digit years are considered to fall within.
    220      */
    221     UDate         internalGetDefaultCenturyStart(void) const;
    222 
    223     /**
    224      * Returns the first year of the 100-year window that dates with
    225      * 2-digit years are considered to fall within.
    226      */
    227     int32_t          internalGetDefaultCenturyStartYear(void) const;
    228 
    229     /**
    230      * Initializes the 100-year window that dates with 2-digit years
    231      * are considered to fall within so that its start date is 80 years
    232      * before the current time.
    233      */
    234     static void  initializeSystemDefaultCentury(void);
    235 };
    236 
    237 U_NAMESPACE_END
    238 
    239 #endif /* #if !UCONFIG_NO_FORMATTING */
    240 
    241 #endif // _GREGOCAL
    242 //eof
    243 
    244