1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 2007-2012, International Business Machines Corporation and 427f654740f2a26ad62a5c155af9199af9e69b889claireho* others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h" // for 'typeid' to work 927f654740f2a26ad62a5c155af9199af9e69b889claireho 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tzrule.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucal.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "gregoimp.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uarrsort.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UComparator function for sorting start times 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t U_CALLCONV 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareDates(const void * /*context*/, const void *left, const void *right) { 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate l = *((UDate*)left); 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate r = *((UDate*)right); 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t res = l < r ? -1 : (l == r ? 0 : 1); 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return res; 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::TimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings) 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject(), fName(name), fRawOffset(rawOffset), fDSTSavings(dstSavings) { 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::TimeZoneRule(const TimeZoneRule& source) 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject(source), fName(source.fName), fRawOffset(source.fRawOffset), fDSTSavings(source.fDSTSavings) { 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::~TimeZoneRule() { 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule& 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::operator=(const TimeZoneRule& right) { 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this != &right) { 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fName = right.fName; 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRawOffset = right.fRawOffset; 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDSTSavings = right.fDSTSavings; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::operator==(const TimeZoneRule& that) const { 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((this == &that) || 5727f654740f2a26ad62a5c155af9199af9e69b889claireho (typeid(*this) == typeid(that) && 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fName == that.fName && 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRawOffset == that.fRawOffset && 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDSTSavings == that.fDSTSavings)); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::operator!=(const TimeZoneRule& that) const { 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !operator==(that); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::getName(UnicodeString& name) const { 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = fName; 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return name; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::getRawOffset(void) const { 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fRawOffset; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::getDSTSavings(void) const { 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fDSTSavings; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRule::isEquivalentTo(const TimeZoneRule& other) const { 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((this == &other) || 8727f654740f2a26ad62a5c155af9199af9e69b889claireho (typeid(*this) == typeid(other) && 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRawOffset == other.fRawOffset && 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDSTSavings == other.fDSTSavings)); 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(InitialTimeZoneRule) 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::InitialTimeZoneRule(const UnicodeString& name, 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rawOffset, 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dstSavings) 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(name, rawOffset, dstSavings) { 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::InitialTimeZoneRule(const InitialTimeZoneRule& source) 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(source) { 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::~InitialTimeZoneRule() { 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule* 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::clone(void) const { 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new InitialTimeZoneRule(*this); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule& 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::operator=(const InitialTimeZoneRule& right) { 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this != &right) { 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZoneRule::operator=(right); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::operator==(const TimeZoneRule& that) const { 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((this == &that) || 12427f654740f2a26ad62a5c155af9199af9e69b889claireho (typeid(*this) == typeid(that) && 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZoneRule::operator==(that))); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::operator!=(const TimeZoneRule& that) const { 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !operator==(that); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::isEquivalentTo(const TimeZoneRule& other) const { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &other) { 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 13827f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) != typeid(other) || TimeZoneRule::isEquivalentTo(other) == FALSE) { 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::getFirstStart(int32_t /*prevRawOffset*/, 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevDSTSavings*/, 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& /*result*/) const { 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInitialTimeZoneRule::getFinalStart(int32_t /*prevRawOffset*/, 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevDSTSavings*/, 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& /*result*/) const { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInitialTimeZoneRule::getNextStart(UDate /*base*/, 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevRawOffset*/, 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevDSTSavings*/, 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool /*inclusive*/, 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& /*result*/) const { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoInitialTimeZoneRule::getPreviousStart(UDate /*base*/, 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevRawOffset*/, 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t /*prevDSTSavings*/, 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool /*inclusive*/, 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& /*result*/) const { 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(AnnualTimeZoneRule) 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t AnnualTimeZoneRule::MAX_YEAR = 0x7FFFFFFF; /* max signed int32 */ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::AnnualTimeZoneRule(const UnicodeString& name, 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rawOffset, 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dstSavings, 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DateTimeRule& dateTimeRule, 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t startYear, 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t endYear) 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(name, rawOffset, dstSavings), fDateTimeRule(new DateTimeRule(dateTimeRule)), 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear(startYear), fEndYear(endYear) { 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::AnnualTimeZoneRule(const UnicodeString& name, 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rawOffset, 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dstSavings, 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateTimeRule* dateTimeRule, 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t startYear, 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t endYear) 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(name, rawOffset, dstSavings), fDateTimeRule(dateTimeRule), 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear(startYear), fEndYear(endYear) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::AnnualTimeZoneRule(const AnnualTimeZoneRule& source) 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(source), fDateTimeRule(new DateTimeRule(*(source.fDateTimeRule))), 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear(source.fStartYear), fEndYear(source.fEndYear) { 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::~AnnualTimeZoneRule() { 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fDateTimeRule; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule* 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::clone(void) const { 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new AnnualTimeZoneRule(*this); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule& 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::operator=(const AnnualTimeZoneRule& right) { 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this != &right) { 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZoneRule::operator=(right); 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fDateTimeRule; 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDateTimeRule = right.fDateTimeRule->clone(); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear = right.fStartYear; 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fEndYear = right.fEndYear; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::operator==(const TimeZoneRule& that) const { 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &that) { 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 23227f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) != typeid(that)) { 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AnnualTimeZoneRule *atzr = (AnnualTimeZoneRule*)&that; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (*fDateTimeRule == *(atzr->fDateTimeRule) && 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear == atzr->fStartYear && 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fEndYear == atzr->fEndYear); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::operator!=(const TimeZoneRule& that) const { 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !operator==(that); 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst DateTimeRule* 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getRule() const { 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fDateTimeRule; 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getStartYear() const { 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fStartYear; 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getEndYear() const { 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fEndYear; 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getStartInYear(int32_t year, 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevRawOffset, 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate &result) const { 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (year < fStartYear || year > fEndYear) { 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double ruleDay; 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateTimeRule::DateRuleType type = fDateTimeRule->getDateRuleType(); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (type == DateTimeRule::DOM) { 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay = Grego::fieldsToDay(year, fDateTimeRule->getRuleMonth(), fDateTimeRule->getRuleDayOfMonth()); 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool after = TRUE; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (type == DateTimeRule::DOW) { 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Normalize DOW rule into DOW_GEQ_DOM or DOW_LEQ_DOM 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t weeks = fDateTimeRule->getRuleWeekInMonth(); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (weeks > 0) { 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay = Grego::fieldsToDay(year, fDateTimeRule->getRuleMonth(), 1); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay += 7 * (weeks - 1); 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru after = FALSE; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay = Grego::fieldsToDay(year, fDateTimeRule->getRuleMonth(), 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Grego::monthLength(year, fDateTimeRule->getRuleMonth())); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay += 7 * (weeks + 1); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t month = fDateTimeRule->getRuleMonth(); 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dom = fDateTimeRule->getRuleDayOfMonth(); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (type == DateTimeRule::DOW_LEQ_DOM) { 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru after = FALSE; 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle Feb <=29 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (month == UCAL_FEBRUARY && dom == 29 && !Grego::isLeapYear(year)) { 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dom--; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay = Grego::fieldsToDay(year, month, dom); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dow = Grego::dayOfWeek(ruleDay); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t delta = fDateTimeRule->getRuleDayOfWeek() - dow; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (after) { 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = delta < 0 ? delta + 7 : delta; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = delta > 0 ? delta - 7 : delta; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleDay += delta; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ruleDay*U_MILLIS_PER_DAY + fDateTimeRule->getRuleMillisInDay(); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fDateTimeRule->getTimeRuleType() != DateTimeRule::UTC_TIME) { 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result -= prevRawOffset; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fDateTimeRule->getTimeRuleType() == DateTimeRule::WALL_TIME) { 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result -= prevDSTSavings; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule& other) const { 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &other) { 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 32427f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) != typeid(other) || TimeZoneRule::isEquivalentTo(other) == FALSE) { 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AnnualTimeZoneRule* that = (AnnualTimeZoneRule*)&other; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (*fDateTimeRule == *(that->fDateTimeRule) && 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartYear == that->fStartYear && 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fEndYear == that->fEndYear); 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getFirstStart(int32_t prevRawOffset, 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getStartInYear(fStartYear, prevRawOffset, prevDSTSavings, result); 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAnnualTimeZoneRule::getFinalStart(int32_t prevRawOffset, 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fEndYear == MAX_YEAR) { 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getStartInYear(fEndYear, prevRawOffset, prevDSTSavings, result); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 35150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoAnnualTimeZoneRule::getNextStart(UDate base, 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevRawOffset, 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool inclusive, 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t year, month, dom, dow, doy, mid; 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Grego::timeToFields(base, year, month, dom, dow, doy, mid); 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (year < fStartYear) { 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getFirstStart(prevRawOffset, prevDSTSavings, result); 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate tmp; 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getStartInYear(year, prevRawOffset, prevDSTSavings, tmp)) { 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tmp < base || (!inclusive && (tmp == base))) { 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Return the next one 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getStartInYear(year + 1, prevRawOffset, prevDSTSavings, result); 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = tmp; 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 37550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoAnnualTimeZoneRule::getPreviousStart(UDate base, 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevRawOffset, 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool inclusive, 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t year, month, dom, dow, doy, mid; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Grego::timeToFields(base, year, month, dom, dow, doy, mid); 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (year > fEndYear) { 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getFinalStart(prevRawOffset, prevDSTSavings, result); 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate tmp; 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getStartInYear(year, prevRawOffset, prevDSTSavings, tmp)) { 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tmp > base || (!inclusive && (tmp == base))) { 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Return the previous one 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getStartInYear(year - 1, prevRawOffset, prevDSTSavings, result); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = tmp; 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(TimeArrayTimeZoneRule) 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::TimeArrayTimeZoneRule(const UnicodeString& name, 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rawOffset, 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dstSavings, 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UDate* startTimes, 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numStartTimes, 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateTimeRule::TimeRuleType timeRuleType) 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(name, rawOffset, dstSavings), fTimeRuleType(timeRuleType), 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartTimes(NULL) { 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru initStartTimes(startTimes, numStartTimes, status); 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //TODO - status? 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::TimeArrayTimeZoneRule(const TimeArrayTimeZoneRule& source) 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: TimeZoneRule(source), fTimeRuleType(source.fTimeRuleType), fStartTimes(NULL) { 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru initStartTimes(source.fStartTimes, source.fNumStartTimes, status); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //TODO - status? 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::~TimeArrayTimeZoneRule() { 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes != NULL && fStartTimes != fLocalStartTimes) { 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(fStartTimes); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule* 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::clone(void) const { 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new TimeArrayTimeZoneRule(*this); 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule& 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::operator=(const TimeArrayTimeZoneRule& right) { 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this != &right) { 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZoneRule::operator=(right); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru initStartTimes(right.fStartTimes, right.fNumStartTimes, status); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //TODO - status? 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fTimeRuleType = right.fTimeRuleType; 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::operator==(const TimeZoneRule& that) const { 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &that) { 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 45127f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) != typeid(that) || TimeZoneRule::operator==(that) == FALSE) { 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeArrayTimeZoneRule *tatzr = (TimeArrayTimeZoneRule*)&that; 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fTimeRuleType != tatzr->fTimeRuleType || 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNumStartTimes != tatzr->fNumStartTimes) { 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Compare start times 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool res = TRUE; 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < fNumStartTimes; i++) { 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes[i] != tatzr->fStartTimes[i]) { 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru res = FALSE; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return res; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::operator!=(const TimeZoneRule& that) const { 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !operator==(that); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateTimeRule::TimeRuleType 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::getTimeType(void) const { 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fTimeRuleType; 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::getStartTimeAt(int32_t index, UDate& result) const { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (index >= fNumStartTimes || index < 0) { 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fStartTimes[index]; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::countStartTimes(void) const { 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fNumStartTimes; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule& other) const { 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &other) { 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 49927f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) != typeid(other) || TimeZoneRule::isEquivalentTo(other) == FALSE) { 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeArrayTimeZoneRule* that = (TimeArrayTimeZoneRule*)&other; 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fTimeRuleType != that->fTimeRuleType || 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNumStartTimes != that->fNumStartTimes) { 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Compare start times 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool res = TRUE; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < fNumStartTimes; i++) { 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes[i] != that->fStartTimes[i]) { 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru res = FALSE; 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return res; 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::getFirstStart(int32_t prevRawOffset, 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNumStartTimes <= 0 || fStartTimes == NULL) { 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = getUTC(fStartTimes[0], prevRawOffset, prevDSTSavings); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::getFinalStart(int32_t prevRawOffset, 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNumStartTimes <= 0 || fStartTimes == NULL) { 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = getUTC(fStartTimes[fNumStartTimes - 1], prevRawOffset, prevDSTSavings); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 54150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoTimeArrayTimeZoneRule::getNextStart(UDate base, 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevRawOffset, 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool inclusive, 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = fNumStartTimes - 1; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; i >= 0; i--) { 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate time = getUTC(fStartTimes[i], prevRawOffset, prevDSTSavings); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (time < base || (!inclusive && time == base)) { 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = time; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i == fNumStartTimes - 1) { 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 56150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoTimeArrayTimeZoneRule::getPreviousStart(UDate base, 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevRawOffset, 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prevDSTSavings, 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool inclusive, 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate& result) const { 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = fNumStartTimes - 1; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; i >= 0; i--) { 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate time = getUTC(fStartTimes[i], prevRawOffset, prevDSTSavings); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (time < base || (inclusive && time == base)) { 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = time; 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---- private methods ------ 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::initStartTimes(const UDate source[], int32_t size, UErrorCode& status) { 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Free old array 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes != NULL && fStartTimes != fLocalStartTimes) { 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(fStartTimes); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Allocate new one if needed 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (size > TIMEARRAY_STACK_BUFFER_SIZE) { 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartTimes = (UDate*)uprv_malloc(sizeof(UDate)*size); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes == NULL) { 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNumStartTimes = 0; 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fStartTimes = (UDate*)fLocalStartTimes; 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(fStartTimes, source, sizeof(UDate)*size); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNumStartTimes = size; 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Sort dates 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_sortArray(fStartTimes, fNumStartTimes, (int32_t)sizeof(UDate), compareDates, NULL, TRUE, &status); 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fStartTimes != NULL && fStartTimes != fLocalStartTimes) { 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(fStartTimes); 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNumStartTimes = 0; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeArrayTimeZoneRule::getUTC(UDate time, int32_t raw, int32_t dst) const { 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fTimeRuleType != DateTimeRule::UTC_TIME) { 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time -= raw; 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fTimeRuleType == DateTimeRule::WALL_TIME) { 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru time -= dst; 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return time; 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 628