1*0e209d39SAndroid Build Coastguard Worker // © 2018 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #ifndef ERARULES_H_ 5*0e209d39SAndroid Build Coastguard Worker #define ERARULES_H_ 6*0e209d39SAndroid Build Coastguard Worker 7*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 8*0e209d39SAndroid Build Coastguard Worker 9*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 10*0e209d39SAndroid Build Coastguard Worker 11*0e209d39SAndroid Build Coastguard Worker #include "unicode/localpointer.h" 12*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 13*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h" 14*0e209d39SAndroid Build Coastguard Worker 15*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker // Export an explicit template instantiation of LocalMemory used as a data member of EraRules. 18*0e209d39SAndroid Build Coastguard Worker // When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. 19*0e209d39SAndroid Build Coastguard Worker // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. 20*0e209d39SAndroid Build Coastguard Worker #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 21*0e209d39SAndroid Build Coastguard Worker #if defined(_MSC_VER) 22*0e209d39SAndroid Build Coastguard Worker // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= 23*0e209d39SAndroid Build Coastguard Worker #pragma warning(push) 24*0e209d39SAndroid Build Coastguard Worker #pragma warning(disable: 4661) 25*0e209d39SAndroid Build Coastguard Worker #endif 26*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API LocalPointerBase<int32_t>; 27*0e209d39SAndroid Build Coastguard Worker template class U_I18N_API LocalMemory<int32_t>; 28*0e209d39SAndroid Build Coastguard Worker #if defined(_MSC_VER) 29*0e209d39SAndroid Build Coastguard Worker #pragma warning(pop) 30*0e209d39SAndroid Build Coastguard Worker #endif 31*0e209d39SAndroid Build Coastguard Worker #endif 32*0e209d39SAndroid Build Coastguard Worker 33*0e209d39SAndroid Build Coastguard Worker class U_I18N_API EraRules : public UMemory { 34*0e209d39SAndroid Build Coastguard Worker public: 35*0e209d39SAndroid Build Coastguard Worker ~EraRules(); 36*0e209d39SAndroid Build Coastguard Worker 37*0e209d39SAndroid Build Coastguard Worker static EraRules* createInstance(const char *calType, UBool includeTentativeEra, UErrorCode& status); 38*0e209d39SAndroid Build Coastguard Worker 39*0e209d39SAndroid Build Coastguard Worker /** 40*0e209d39SAndroid Build Coastguard Worker * Gets number of effective eras 41*0e209d39SAndroid Build Coastguard Worker * @return number of effective eras 42*0e209d39SAndroid Build Coastguard Worker */ getNumberOfEras()43*0e209d39SAndroid Build Coastguard Worker inline int32_t getNumberOfEras() const { 44*0e209d39SAndroid Build Coastguard Worker return numEras; 45*0e209d39SAndroid Build Coastguard Worker } 46*0e209d39SAndroid Build Coastguard Worker 47*0e209d39SAndroid Build Coastguard Worker /** 48*0e209d39SAndroid Build Coastguard Worker * Gets start date of an era 49*0e209d39SAndroid Build Coastguard Worker * @param eraIdx Era index 50*0e209d39SAndroid Build Coastguard Worker * @param fields Receives date fields. The result includes values of year, month, 51*0e209d39SAndroid Build Coastguard Worker * day of month in this order. When an era has no start date, the result 52*0e209d39SAndroid Build Coastguard Worker * will be January 1st in year whose value is minimum integer. 53*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 54*0e209d39SAndroid Build Coastguard Worker */ 55*0e209d39SAndroid Build Coastguard Worker void getStartDate(int32_t eraIdx, int32_t (&fields)[3], UErrorCode& status) const; 56*0e209d39SAndroid Build Coastguard Worker 57*0e209d39SAndroid Build Coastguard Worker /** 58*0e209d39SAndroid Build Coastguard Worker * Gets start year of an era 59*0e209d39SAndroid Build Coastguard Worker * @param eraIdx Era index 60*0e209d39SAndroid Build Coastguard Worker * @param status Receives status. 61*0e209d39SAndroid Build Coastguard Worker * @return The first year of an era. When a era has no start date, minimum int32 62*0e209d39SAndroid Build Coastguard Worker * value is returned. 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker int32_t getStartYear(int32_t eraIdx, UErrorCode& status) const; 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Returns era index for the specified year/month/day. 68*0e209d39SAndroid Build Coastguard Worker * @param year Year 69*0e209d39SAndroid Build Coastguard Worker * @param month Month (1-base) 70*0e209d39SAndroid Build Coastguard Worker * @param day Day of month 71*0e209d39SAndroid Build Coastguard Worker * @param status Receives status 72*0e209d39SAndroid Build Coastguard Worker * @return era index (or 0, when the specified date is before the first era) 73*0e209d39SAndroid Build Coastguard Worker */ 74*0e209d39SAndroid Build Coastguard Worker int32_t getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCode& status) const; 75*0e209d39SAndroid Build Coastguard Worker 76*0e209d39SAndroid Build Coastguard Worker /** 77*0e209d39SAndroid Build Coastguard Worker * Gets the current era index. This is calculated only once for an instance of 78*0e209d39SAndroid Build Coastguard Worker * EraRules. The current era calculation is based on the default time zone at 79*0e209d39SAndroid Build Coastguard Worker * the time of instantiation. 80*0e209d39SAndroid Build Coastguard Worker * 81*0e209d39SAndroid Build Coastguard Worker * @return era index of current era (or 0, when current date is before the first era) 82*0e209d39SAndroid Build Coastguard Worker */ getCurrentEraIndex()83*0e209d39SAndroid Build Coastguard Worker inline int32_t getCurrentEraIndex() const { 84*0e209d39SAndroid Build Coastguard Worker return currentEra; 85*0e209d39SAndroid Build Coastguard Worker } 86*0e209d39SAndroid Build Coastguard Worker 87*0e209d39SAndroid Build Coastguard Worker private: 88*0e209d39SAndroid Build Coastguard Worker EraRules(LocalMemory<int32_t>& eraStartDates, int32_t numEra); 89*0e209d39SAndroid Build Coastguard Worker 90*0e209d39SAndroid Build Coastguard Worker void initCurrentEra(); 91*0e209d39SAndroid Build Coastguard Worker 92*0e209d39SAndroid Build Coastguard Worker LocalMemory<int32_t> startDates; 93*0e209d39SAndroid Build Coastguard Worker int32_t numEras; 94*0e209d39SAndroid Build Coastguard Worker int32_t currentEra; 95*0e209d39SAndroid Build Coastguard Worker }; 96*0e209d39SAndroid Build Coastguard Worker 97*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 98*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 99*0e209d39SAndroid Build Coastguard Worker #endif /* ERARULES_H_ */ 100