1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (c) 2003-2010, International Business Machines
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Corporation and others.  All Rights Reserved.
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Author: Alan Liu
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Created: July 21 2003
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Since: ICU 2.8
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef OLSONTZ_H
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define OLSONTZ_H
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FORMATTING
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/basictz.h"
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct UResourceBundle;
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class SimpleTimeZone;
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * A time zone based on the Olson tz database.  Olson time zones change
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * behavior over time.  The raw offset, rules, presence or absence of
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * daylight savings time, and even the daylight savings amount can all
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * vary.
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This class uses a resource bundle named "zoneinfo".  Zoneinfo is a
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * table containing different kinds of resources.  In several places,
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * zones are referred to using integers.  A zone's integer is a number
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * from 0..n-1, where n is the number of zones, with the zones sorted
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in lexicographic order.
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 1. Zones.  These have keys corresponding to the Olson IDs, e.g.,
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * "Asia/Shanghai".  Each resource describes the behavior of the given
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * zone.  Zones come in two different formats.
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   a. Zone (table).  A zone is a table resource contains several
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   type of resources below:
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - typeOffsets:intvector (Required)
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Sets of UTC raw/dst offset pairs in seconds.  Entries at
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   2n represents raw offset and 2n+1 represents dst offset
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   paired with the raw offset at 2n.  The very first pair represents
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   the initial zone offset (before the first transition) always.
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - trans:intvector (Optional)
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   List of transition times represented by 32bit seconds from the
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   epoch (1970-01-01T00:00Z) in ascending order.
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - transPre32/transPost32:intvector (Optional)
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   List of transition times before/after 32bit minimum seconds.
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Each time is represented by a pair of 32bit integer.
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - typeMap:bin (Optional)
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Array of bytes representing the mapping between each transition
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   time (transPre32/trans/transPost32) and its corresponding offset
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   data (typeOffsets).
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - finalRule:string (Optional)
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   If a recurrent transition rule is applicable to a zone forever
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   after the final transition time, finalRule represents the rule
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   in Rules data.
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - finalRaw:int (Optional)
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   When finalRule is available, finalRaw is required and specifies
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   the raw (base) offset of the rule.
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - finalYear:int (Optional)
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   When finalRule is available, finalYear is required and specifies
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   the start year of the rule.
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   - links:intvector (Optional)
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   When this zone data is shared with other zones, links specifies
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   all zones including the zone itself.  Each zone is referenced by
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   integer index.
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  b. Link (int, length 1).  A link zone is an int resource.  The
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  integer is the zone number of the target zone.  The key of this
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  resource is an alternate name for the target zone.  This data
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *  is corresponding to Link data in the tz database.
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 2. Rules.  These have keys corresponding to the Olson rule IDs,
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * with an underscore prepended, e.g., "_EU".  Each resource describes
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the behavior of the given rule using an intvector, containing the
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * onset list, the cessation list, and the DST savings.  The onset and
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * cessation lists consist of the month, dowim, dow, time, and time
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * mode.  The end result is that the 11 integers describing the rule
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * can be passed directly into the SimpleTimeZone 13-argument
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * constructor (the other two arguments will be the raw offset, taken
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * from the complex zone element 5, and the ID string, which is not
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * used), with the times and the DST savings multiplied by 1000 to
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * scale from seconds to milliseconds.
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 3. Regions.  An array specifies mapping between zones and regions.
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Each item is either a 2-letter ISO country code or "001"
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * (UN M.49 - World).  This data is generated from "zone.tab"
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in the tz database.
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class U_I18N_API OlsonTimeZone: public BasicTimeZone {
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Construct from a resource bundle.
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param top the top-level zoneinfo resource bundle.  This is used
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * to lookup the rule that `res' may refer to, if there is one.
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param res the resource bundle of the zone to be constructed
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ec input-output error code
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    OlsonTimeZone(const UResourceBundle* top,
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                  const UResourceBundle* res, UErrorCode& ec);
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Copy constructor
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    OlsonTimeZone(const OlsonTimeZone& other);
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Destructor
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual ~OlsonTimeZone();
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Assignment operator
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    OlsonTimeZone& operator=(const OlsonTimeZone& other);
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns true if the two TimeZone objects are equal.
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool operator==(const TimeZone& other) const;
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual TimeZone* clone() const;
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UClassID U_EXPORT2 getStaticClassID();
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UClassID getDynamicClassID() const;
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  Do not call this; prefer getOffset(UDate,...).
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month,
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              int32_t day, uint8_t dayOfWeek,
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              int32_t millis, UErrorCode& ec) const;
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  Do not call this; prefer getOffset(UDate,...).
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month,
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              int32_t day, uint8_t dayOfWeek,
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              int32_t millis, int32_t monthLength,
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              UErrorCode& ec) const;
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                   int32_t& dstOffset, UErrorCode& ec) const;
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * BasicTimeZone API.
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) /*const*/;
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  This method has no effect since objects of this
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * class are quasi-immutable (the base class allows the ID to be
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * changed).
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void setRawOffset(int32_t offsetMillis);
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  For a historical zone, the raw offset can change
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * over time, so this API is not useful.  In order to approximate
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * expected behavior, this method returns the raw offset for the
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * current moment in time.
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t getRawOffset() const;
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  For a historical zone, whether DST is used or
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * not varies over time.  In order to approximate expected
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * behavior, this method returns TRUE if DST is observed at any
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * point in the current year.
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool useDaylightTime() const;
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool inDaylightTime(UDate date, UErrorCode& ec) const;
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t getDSTSavings() const;
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TimeZone API.  Also comare historic transitions.
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool hasSameRules(const TimeZone& other) const;
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * BasicTimeZone API.
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Gets the first time zone transition after the base time.
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param base      The base time.
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param inclusive Whether the base time is inclusive or not.
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result    Receives the first transition after the base time.
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return  TRUE if the transition is found.
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) /*const*/;
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * BasicTimeZone API.
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Gets the most recent time zone transition before the base time.
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param base      The base time.
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param inclusive Whether the base time is inclusive or not.
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result    Receives the most recent transition before the base time.
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return  TRUE if the transition is found.
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) /*const*/;
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * BasicTimeZone API.
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the number of <code>TimeZoneRule</code>s which represents time transitions,
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for this time zone, that is, all <code>TimeZoneRule</code>s for this time zone except
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>InitialTimeZoneRule</code>.  The return value range is 0 or any positive value.
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status    Receives error status code.
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return The number of <code>TimeZoneRule</code>s representing time transitions.
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t countTransitionRules(UErrorCode& status) /*const*/;
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Gets the <code>InitialTimeZoneRule</code> and the set of <code>TimeZoneRule</code>
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * which represent time transitions for this time zone.  On successful return,
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the argument initial points to non-NULL <code>InitialTimeZoneRule</code> and
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the array trsrules is filled with 0 or multiple <code>TimeZoneRule</code>
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * instances up to the size specified by trscount.  The results are referencing the
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * rule instance held by this time zone instance.  Therefore, after this time zone
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is destructed, they are no longer available.
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param initial       Receives the initial timezone rule
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param trsrules      Receives the timezone transition rules
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param trscount      On input, specify the size of the array 'transitions' receiving
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                      the timezone transition rules.  On output, actual number of
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                      rules filled in the array will be set.
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status        Receives error status code.
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @draft ICU 3.8
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) /*const*/;
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Default constructor.  Creates a time zone with an empty ID and
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a fixed GMT offset of zero.
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    OlsonTimeZone();
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void constructEmpty();
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void getHistoricalOffset(UDate date, UBool local,
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t& rawoff, int32_t& dstoff) const;
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t transitionCount() const;
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int64_t transitionTimeInSeconds(int16_t transIdx) const;
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    double transitionTime(int16_t transIdx) const;
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Following 3 methods return an offset at the given transition time index.
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * When the index is negative, return the initial offset.
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t zoneOffsetAt(int16_t transIdx) const;
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t rawOffsetAt(int16_t transIdx) const;
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t dstOffsetAt(int16_t transIdx) const;
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Following methods return the initial offset.
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t initialRawOffset() const;
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t initialDstOffset() const;
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Number of transitions in each time range
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t transitionCountPre32;
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t transitionCount32;
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t transitionCountPost32;
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Time of each transition in seconds from 1970 epoch before 32bit second range (<= 1900).
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Each transition in this range is represented by a pair of int32_t.
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Length is transitionCount int32_t's.  NULL if no transitions in this range.
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const int32_t *transitionTimesPre32; // alias into res; do not delete
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Time of each transition in seconds from 1970 epoch in 32bit second range.
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Length is transitionCount int32_t's.  NULL if no transitions in this range.
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const int32_t *transitionTimes32; // alias into res; do not delete
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Time of each transition in seconds from 1970 epoch after 32bit second range (>= 2038).
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Each transition in this range is represented by a pair of int32_t.
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Length is transitionCount int32_t's.  NULL if no transitions in this range.
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const int32_t *transitionTimesPost32; // alias into res; do not delete
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Number of types, 1..255
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t typeCount;
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Offset from GMT in seconds for each type.
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Length is typeCount int32_t's.  At least one type (a pair of int32_t)
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is required.
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const int32_t *typeOffsets; // alias into res; do not delete
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Type description data, consisting of transitionCount uint8_t
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * type indices (from 0..typeCount-1).
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Length is transitionCount int16_t's.  NULL if no transitions.
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint8_t *typeMapData; // alias into res; do not delete
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * A SimpleTimeZone that governs the behavior for date >= finalMillis.
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    SimpleTimeZone *finalZone; // owned, may be NULL
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * For date >= finalMillis, the finalZone will be used.
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    double finalStartMillis;
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * For year >= finalYear, the finalZone will be used.
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t finalStartYear;
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* BasicTimeZone support */
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void clearTransitionRules(void);
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void deleteTransitionRules(void);
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void initTransitionRules(UErrorCode& status);
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    InitialTimeZoneRule *initialRule;
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TimeZoneTransition  *firstTZTransition;
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t             firstTZTransitionIdx;
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TimeZoneTransition  *firstFinalTZTransition;
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TimeArrayTimeZoneRule   **historicRules;
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t             historicRuleCount;
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    SimpleTimeZone      *finalZoneWithStartYear; // hack
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool               transitionRulesInitialized;
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int16_t
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::transitionCount() const {
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return transitionCountPre32 + transitionCount32 + transitionCountPost32;
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline double
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::transitionTime(int16_t transIdx) const {
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return (double)transitionTimeInSeconds(transIdx) * U_MILLIS_PER_SECOND;
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::zoneOffsetAt(int16_t transIdx) const {
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t typeIdx = (transIdx >= 0 ? typeMapData[transIdx] : 0) << 1;
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return typeOffsets[typeIdx] + typeOffsets[typeIdx + 1];
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::rawOffsetAt(int16_t transIdx) const {
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t typeIdx = (transIdx >= 0 ? typeMapData[transIdx] : 0) << 1;
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return typeOffsets[typeIdx];
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::dstOffsetAt(int16_t transIdx) const {
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int16_t typeIdx = (transIdx >= 0 ? typeMapData[transIdx] : 0) << 1;
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return typeOffsets[typeIdx + 1];
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::initialRawOffset() const {
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return typeOffsets[0];
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)OlsonTimeZone::initialDstOffset() const {
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return typeOffsets[1];
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif // !UCONFIG_NO_FORMATTING
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif // OLSONTZ_H
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//eof
428