1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4*******************************************************************************
5* Copyright (C) 2007-2008, International Business Machines Corporation and         *
6* others. All Rights Reserved.                                                *
7*******************************************************************************
8*/
9#ifndef TZTRANS_H
10#define TZTRANS_H
11
12/**
13 * \file
14 * \brief C++ API: Time zone transition
15 */
16
17#include "unicode/utypes.h"
18
19#if !UCONFIG_NO_FORMATTING
20
21#include "unicode/uobject.h"
22
23U_NAMESPACE_BEGIN
24
25// Forward declaration
26class TimeZoneRule;
27
28/**
29 * <code>TimeZoneTransition</code> is a class representing a time zone transition.
30 * An instance has a time of transition and rules for both before and after the transition.
31 * @stable ICU 3.8
32 */
33class U_I18N_API TimeZoneTransition : public UObject {
34public:
35    /**
36     * Constructs a <code>TimeZoneTransition</code> with the time and the rules before/after
37     * the transition.
38     *
39     * @param time  The time of transition in milliseconds since the base time.
40     * @param from  The time zone rule used before the transition.
41     * @param to    The time zone rule used after the transition.
42     * @stable ICU 3.8
43     */
44    TimeZoneTransition(UDate time, const TimeZoneRule& from, const TimeZoneRule& to);
45
46    /**
47     * Constructs an empty <code>TimeZoneTransition</code>
48     * @stable ICU 3.8
49     */
50    TimeZoneTransition();
51
52    /**
53     * Copy constructor.
54     * @param source    The TimeZoneTransition object to be copied.
55     * @stable ICU 3.8
56     */
57    TimeZoneTransition(const TimeZoneTransition& source);
58
59    /**
60     * Destructor.
61     * @stable ICU 3.8
62     */
63    ~TimeZoneTransition();
64
65    /**
66     * Clone this TimeZoneTransition object polymorphically. The caller owns the result and
67     * should delete it when done.
68     * @return  A copy of the object.
69     * @stable ICU 3.8
70     */
71    TimeZoneTransition* clone(void) const;
72
73    /**
74     * Assignment operator.
75     * @param right The object to be copied.
76     * @stable ICU 3.8
77     */
78    TimeZoneTransition& operator=(const TimeZoneTransition& right);
79
80    /**
81     * Return true if the given TimeZoneTransition objects are semantically equal. Objects
82     * of different subclasses are considered unequal.
83     * @param that  The object to be compared with.
84     * @return  true if the given TimeZoneTransition objects are semantically equal.
85     * @stable ICU 3.8
86     */
87    UBool operator==(const TimeZoneTransition& that) const;
88
89    /**
90     * Return true if the given TimeZoneTransition objects are semantically unequal. Objects
91     * of different subclasses are considered unequal.
92     * @param that  The object to be compared with.
93     * @return  true if the given TimeZoneTransition objects are semantically unequal.
94     * @stable ICU 3.8
95     */
96    UBool operator!=(const TimeZoneTransition& that) const;
97
98    /**
99     * Returns the time of transition in milliseconds.
100     * @return The time of the transition in milliseconds since the 1970 Jan 1 epoch time.
101     * @stable ICU 3.8
102     */
103    UDate getTime(void) const;
104
105    /**
106     * Sets the time of transition in milliseconds.
107     * @param time The time of the transition in milliseconds since the 1970 Jan 1 epoch time.
108     * @stable ICU 3.8
109     */
110    void setTime(UDate time);
111
112    /**
113     * Returns the rule used before the transition.
114     * @return The time zone rule used after the transition.
115     * @stable ICU 3.8
116     */
117    const TimeZoneRule* getFrom(void) const;
118
119    /**
120     * Sets the rule used before the transition.  The caller remains
121     * responsible for deleting the <code>TimeZoneRule</code> object.
122     * @param from The time zone rule used before the transition.
123     * @stable ICU 3.8
124     */
125    void setFrom(const TimeZoneRule& from);
126
127    /**
128     * Adopts the rule used before the transition.  The caller must
129     * not delete the <code>TimeZoneRule</code> object passed in.
130     * @param from The time zone rule used before the transition.
131     * @stable ICU 3.8
132     */
133    void adoptFrom(TimeZoneRule* from);
134
135    /**
136     * Sets the rule used after the transition.  The caller remains
137     * responsible for deleting the <code>TimeZoneRule</code> object.
138     * @param to The time zone rule used after the transition.
139     * @stable ICU 3.8
140     */
141    void setTo(const TimeZoneRule& to);
142
143    /**
144     * Adopts the rule used after the transition.  The caller must
145     * not delete the <code>TimeZoneRule</code> object passed in.
146     * @param to The time zone rule used after the transition.
147     * @stable ICU 3.8
148     */
149    void adoptTo(TimeZoneRule* to);
150
151    /**
152     * Returns the rule used after the transition.
153     * @return The time zone rule used after the transition.
154     * @stable ICU 3.8
155     */
156    const TimeZoneRule* getTo(void) const;
157
158private:
159    UDate   fTime;
160    TimeZoneRule*   fFrom;
161    TimeZoneRule*   fTo;
162
163public:
164    /**
165     * Return the class ID for this class. This is useful only for comparing to
166     * a return value from getDynamicClassID(). For example:
167     * <pre>
168     * .   Base* polymorphic_pointer = createPolymorphicObject();
169     * .   if (polymorphic_pointer->getDynamicClassID() ==
170     * .       erived::getStaticClassID()) ...
171     * </pre>
172     * @return          The class ID for all objects of this class.
173     * @stable ICU 3.8
174     */
175    static UClassID U_EXPORT2 getStaticClassID(void);
176
177    /**
178     * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
179     * method is to implement a simple version of RTTI, since not all C++
180     * compilers support genuine RTTI. Polymorphic operator==() and clone()
181     * methods call this method.
182     *
183     * @return          The class ID for this object. All objects of a
184     *                  given class have the same class ID.  Objects of
185     *                  other classes have different class IDs.
186     * @stable ICU 3.8
187     */
188    virtual UClassID getDynamicClassID(void) const;
189};
190
191U_NAMESPACE_END
192
193#endif /* #if !UCONFIG_NO_FORMATTING */
194
195#endif // TZTRANS_H
196
197//eof
198