16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2003-2013, International Business Machines Corporation
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * File BUDDHCAL.H
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   05/13/2003  srl          copied from gregocal.h
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef BUDDHCAL_H
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define BUDDHCAL_H
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gregocal.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Concrete class which provides the Buddhist calendar.
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>BuddhistCalendar</code> is a subclass of <code>GregorianCalendar</code>
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that numbers years since the birth of the Buddha.  This is the civil calendar
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in some predominantly Buddhist countries such as Thailand, and it is used for
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * religious purposes elsewhere.
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The Buddhist calendar is identical to the Gregorian calendar in all respects
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * except for the year and era.  Years are numbered since the birth of the
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Buddha in 543 BC (Gregorian), so that 1 AD (Gregorian) is equivalent to 544
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * BE (Buddhist Era) and 1998 AD is 2541 BE.
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The Buddhist Calendar has only one allowable era: <code>BE</code>.  If the
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * calendar is not in lenient mode (see <code>setLenient</code>), dates before
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1/1/1 BE are rejected as an illegal argument.
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass BuddhistCalendar : public GregorianCalendar {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Useful constants for BuddhistCalendar.  Only one Era.
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum EEras {
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       BE
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a BuddhistCalendar based on the current time in the default time zone
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with the given locale.
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param aLocale  The given locale.
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param success  Indicates the status of BuddhistCalendar object construction.
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 Returns U_ZERO_ERROR if constructed successfully.
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BuddhistCalendar(const Locale& aLocale, UErrorCode& success);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Destructor
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~BuddhistCalendar();
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Copy constructor
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source    the object to be copied.
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BuddhistCalendar(const BuddhistCalendar& source);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Default assignment operator
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param right    the object to be copied.
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BuddhistCalendar& operator=(const BuddhistCalendar& right);
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Create and return a polymorphic copy of this calendar.
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    return a polymorphic copy of this calendar.
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual Calendar* clone(void) const;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * override. This method is to implement a simple version of RTTI, since not all C++
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method.
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   The class ID for this object. All objects of a given class have the
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *           same class ID. Objects of other classes have different class IDs.
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID(void) const;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the class ID for this class. This is useful only for comparing to a return
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * value from getDynamicClassID(). For example:
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      Base* polymorphic_pointer = createPolymorphicObject();
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      if (polymorphic_pointer->getDynamicClassID() ==
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *          Derived::getStaticClassID()) ...
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   The class ID for all objects of this class.
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return the calendar type, "buddhist".
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return calendar type
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual const char * getType() const;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BuddhistCalendar(); // default constructor not implemented
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected:
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the extended year defined by the current fields.  This will
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as UCAL_ERA) specific to the calendar system, depending on which set of
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * fields is newer.
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the extended year
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetExtendedYear();
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclasses may override this method to compute several fields
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specific to each calendar system.
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void handleComputeFields(int32_t julianDay, UErrorCode& status);
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Subclass API for defining limits of different types.
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param field one of the field numbers
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the Julian day number of day before the first day of the
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * given month in the given extended year.  Subclasses should override
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method to implement their calendar system.
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param eyear the extended year
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param month the zero-based month, or 0 if useMonth is false
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param useMonth if false, compute the day before the first day of
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the given year, otherwise, compute the day before the first day of
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the given month
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param return the Julian day number of the day before the first
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * day of the given month and year
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            UBool useMonth) const;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns TRUE because the Buddhist Calendar does have a default century
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool haveDefaultCentury() const;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the date of the start of the default century
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return start of century - in milliseconds since epoch, 1970
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UDate defaultCenturyStart() const;
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the year in which the default century begins
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t defaultCenturyStartYear() const;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // _GREGOCAL
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
201