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