Loading...
Searching...
No Matches
timeCode.h
Go to the documentation of this file.
1//
2// Copyright 2026 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_BASE_GF_TIME_CODE_H
8#define PXR_BASE_GF_TIME_CODE_H
9
11
12#include "pxr/pxr.h"
13#include "pxr/base/gf/api.h"
15
16#include <algorithm>
17#include <functional>
18#include <iosfwd>
19
20PXR_NAMESPACE_OPEN_SCOPE
21
29{
30public:
34
39 constexpr GfTimeCode(double time = 0.0) noexcept
40 : _time(time)
41 {};
42
46 explicit constexpr GfTimeCode(GfDuration duration) noexcept
47 : GfTimeCode(duration.GetValue())
48 {}
49
51
54
55 constexpr bool operator==(const GfTimeCode &rhs) const noexcept
56 { return _time == rhs._time; }
57 constexpr bool operator!=(const GfTimeCode &rhs) const noexcept
58 { return _time != rhs._time; }
59 constexpr bool operator<(const GfTimeCode &rhs) const noexcept
60 { return _time < rhs._time; }
61 constexpr bool operator>(const GfTimeCode &rhs) const noexcept
62 { return _time > rhs._time; }
63 constexpr bool operator<=(const GfTimeCode &rhs) const noexcept
64 { return _time <= rhs._time; }
65 constexpr bool operator>=(const GfTimeCode &rhs) const noexcept
66 { return _time >= rhs._time; }
67
70 friend constexpr
72 const double amount) noexcept
73 { return GfTimeCode(t._time * amount); }
74 friend constexpr
75 GfTimeCode operator*(const double amount,
76 const GfTimeCode& t) noexcept
77 { return GfTimeCode(amount * t._time); }
78 friend constexpr
79 GfTimeCode operator/(const GfTimeCode& t,
80 const double amount) noexcept
81 { return GfTimeCode(t._time / amount); }
82
86 constexpr double operator/(const GfTimeCode &rhs) const noexcept
87 { return _time / rhs._time; }
88
93 friend constexpr
95 const GfTimeCode& rhs) noexcept
96 { return GfTimeCode(lhs._time + rhs._time); }
97
99 constexpr GfDuration operator-(const GfTimeCode &rhs) const noexcept
100 { return GfDuration(_time - rhs._time); }
101
103 friend constexpr
105 const GfDuration& rhs) noexcept
106 { return GfTimeCode(lhs._time + rhs.GetValue()); }
108 friend constexpr
110 const GfTimeCode& rhs) noexcept
111 { return GfTimeCode(lhs.GetValue() + rhs._time); }
113 friend constexpr
115 const double rhs) noexcept
116 { return GfTimeCode(lhs._time + rhs); }
118 friend constexpr
119 GfTimeCode operator+(const double lhs,
120 const GfTimeCode& rhs) noexcept
121 { return GfTimeCode(lhs + rhs._time); }
122
124 friend constexpr
126 const GfDuration& rhs) noexcept
127 { return GfTimeCode(lhs._time - rhs.GetValue()); }
129 friend constexpr
131 const GfTimeCode& rhs) noexcept
132 { return GfTimeCode(lhs.GetValue() - rhs._time); }
134 friend constexpr
136 const double rhs) noexcept
137 { return GfTimeCode(lhs._time - rhs); }
139 friend constexpr
140 GfTimeCode operator-(const double lhs,
141 const GfTimeCode& rhs) noexcept
142 { return GfTimeCode(lhs - rhs._time); }
143
145 constexpr GfTimeCode operator-() const noexcept
146 { return GfTimeCode(-_time); }
147
149 explicit constexpr operator double() const noexcept {return _time;}
150
154 explicit constexpr operator GfDuration() const noexcept
155 {
156 return GfDuration(_time);
157 }
158
160 size_t GetHash() const {
161 return std::hash<double>()(_time);
162 }
163
165 struct Hash
166 {
167 size_t operator()(const GfTimeCode &ap) const {
168 return ap.GetHash();
169 }
170 };
171
172 friend size_t hash_value(const GfTimeCode &ap) { return ap.GetHash(); }
173
175 template <class HashState>
176 friend void TfHashAppend(HashState &h, const GfTimeCode& t)
177 {
178 // Delegate to TfHashAppend(HashState, double)
179 TfHashAppend(h, t._time);
180 }
181
183
186
188 constexpr double GetValue() const noexcept {
189 return _time;
190 }
191
193
194private:
195 friend inline void swap(GfTimeCode &lhs, GfTimeCode &rhs) {
196 std::swap(lhs._time, rhs._time);
197 }
198
199 double _time;
200};
201
206inline constexpr
207bool operator==(double time, const GfTimeCode &timeCode) noexcept
208 { return GfTimeCode(time) == timeCode; }
209
210inline constexpr
211bool operator!=(double time, const GfTimeCode &timeCode) noexcept
212 { return GfTimeCode(time) != timeCode; }
213
214inline constexpr
215bool operator<(double time, const GfTimeCode &timeCode) noexcept
216 { return GfTimeCode(time) < timeCode; }
217
218inline constexpr
219bool operator>(double time, const GfTimeCode &timeCode) noexcept
220 { return GfTimeCode(time) > timeCode; }
221
222inline constexpr
223bool operator<=(double time, const GfTimeCode &timeCode) noexcept
224 { return GfTimeCode(time) <= timeCode; }
225
226inline constexpr
227bool operator>=(double time, const GfTimeCode &timeCode) noexcept
228 { return GfTimeCode(time) >= timeCode; }
229
232GF_API std::ostream& operator<<(std::ostream& out, const GfTimeCode& ap);
233
235
236PXR_NAMESPACE_CLOSE_SCOPE
237
238#endif // PXR_BASE_GF_TIME_CODE_H
GF_API std::ostream & operator<<(std::ostream &out, const GfTimeCode &ap)
Stream insertion operator for the string representation of this time code.
Value type that represents a duration measured in time codes.
Definition duration.h:27
Value type that represents a time code.
Definition timeCode.h:29
friend constexpr GfTimeCode operator-(const GfTimeCode &lhs, const GfDuration &rhs) noexcept
Offset a time code value.
Definition timeCode.h:125
constexpr double GetValue() const noexcept
Return the time value.
Definition timeCode.h:188
constexpr double operator/(const GfTimeCode &rhs) const noexcept
Ratio of two time codes is a unitless double scale factor.
Definition timeCode.h:86
friend constexpr GfTimeCode operator-(const GfTimeCode &lhs, const double rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:135
friend void TfHashAppend(HashState &h, const GfTimeCode &t)
Enable TfHash for GfTimeCode.
Definition timeCode.h:176
friend constexpr GfTimeCode operator-(const GfDuration &lhs, const GfTimeCode &rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:130
friend constexpr GfTimeCode operator*(const GfTimeCode &t, const double amount) noexcept
Scale time code values by doubles.
Definition timeCode.h:71
constexpr GfTimeCode(GfDuration duration) noexcept
Explicitly construct a time code from a duration.
Definition timeCode.h:46
friend constexpr GfTimeCode operator+(const GfTimeCode &lhs, const double rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:114
constexpr GfTimeCode operator-() const noexcept
Negate a time code. Equivalent to scaling by -1.
Definition timeCode.h:145
friend constexpr GfTimeCode operator+(const GfTimeCode &lhs, const GfDuration &rhs) noexcept
Offset a time code value.
Definition timeCode.h:104
size_t GetHash() const
Hash function.
Definition timeCode.h:160
friend constexpr GfTimeCode operator+(const GfTimeCode &lhs, const GfTimeCode &rhs) noexcept
Sum time codes.
Definition timeCode.h:94
friend constexpr GfTimeCode operator+(const double lhs, const GfTimeCode &rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:119
constexpr GfDuration operator-(const GfTimeCode &rhs) const noexcept
Compute a GfDuration offset between two time codes.
Definition timeCode.h:99
friend constexpr GfTimeCode operator+(const GfDuration &lhs, const GfTimeCode &rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:109
friend constexpr GfTimeCode operator-(const double lhs, const GfTimeCode &rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition timeCode.h:140
constexpr GfTimeCode(double time=0.0) noexcept
Construct a time code with the given time.
Definition timeCode.h:39