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