1#ifndef SEAD_TICKSPAN_H_
2#define SEAD_TICKSPAN_H_
3
4#include <climits>
5
6#include <basis/seadRawPrint.h>
7#include <basis/seadTypes.h>
8
9namespace sead
10{
11/// A TickSpan represents a number of ticks.
12class TickSpan
13{
14public:
15 TickSpan(s64 span = 0) : mSpan(span) {}
16
17 s64 toS64() const { return mSpan; }
18 s64 toTicks() const { return mSpan; }
19
20 s64 toNanoSeconds() const;
21
22 s64 toMicroSeconds() const { return toNanoSeconds() / 1000; }
23
24 s64 toMilliSeconds() const
25 {
26 if (u64(mSpan) + (LLONG_MAX / 1000) < u64(ULLONG_MAX / 1000) - 1)
27 return 1000 * mSpan / cFrequency;
28 return 1000 * (mSpan / cFrequency);
29 }
30
31 s64 toSeconds() const { return toMilliSeconds() / 1000; }
32
33 void setNanoSeconds(s64 nsec);
34
35 void setMicroSeconds(s64 usec)
36 {
37 SEAD_ASSERT(LLONG_MIN / cFrequency <= usec && usec < LLONG_MAX / cFrequency);
38 mSpan = usec * cFrequency / 1000 / 1000;
39 }
40
41 void setMilliSeconds(s64 msec)
42 {
43 SEAD_ASSERT(LLONG_MIN / cFrequency <= msec && msec < LLONG_MAX / cFrequency);
44 mSpan = msec * cFrequency / 1000;
45 }
46
47 void setSeconds(s64 sec)
48 {
49 SEAD_ASSERT(LLONG_MIN / cFrequency <= sec && sec < LLONG_MAX / cFrequency);
50 mSpan = sec * cFrequency;
51 }
52
53 const TickSpan& operator+=(TickSpan span)
54 {
55 mSpan += span.mSpan;
56 return *this;
57 }
58
59 const TickSpan& operator-=(TickSpan span)
60 {
61 mSpan -= span.mSpan;
62 return *this;
63 }
64
65 const TickSpan& operator*=(f32 x)
66 {
67 mSpan *= x;
68 return *this;
69 }
70
71 const TickSpan& operator/=(f32 x)
72 {
73 mSpan /= x;
74 return *this;
75 }
76
77 friend TickSpan operator+(TickSpan a, TickSpan b) { return a.mSpan + b.mSpan; }
78 friend TickSpan operator-(TickSpan a, TickSpan b) { return a.mSpan - b.mSpan; }
79 friend TickSpan operator*(TickSpan a, f32 x) { return a.mSpan * x; }
80 friend TickSpan operator*(f32 x, TickSpan a) { return a.mSpan * x; }
81 friend TickSpan operator/(TickSpan a, f32 x) { return a.mSpan / x; }
82
83 static TickSpan makeFromNanoSeconds(s64 nsec)
84 {
85 TickSpan span;
86 span.setNanoSeconds(nsec);
87 return span;
88 }
89
90 static TickSpan makeFromMicroSeconds(s64 usec)
91 {
92 TickSpan span;
93 span.setMicroSeconds(usec);
94 return span;
95 }
96
97 static TickSpan makeFromMilliSeconds(s64 msec)
98 {
99 TickSpan span;
100 span.setMilliSeconds(msec);
101 return span;
102 }
103
104 static TickSpan makeFromSeconds(s64 sec)
105 {
106 TickSpan span;
107 span.setSeconds(sec);
108 return span;
109 }
110
111private:
112 s64 mSpan;
113
114 /// Number of ticks per second. This is platform specific.
115 static const s64 cFrequency;
116};
117
118} // namespace sead
119
120#endif // SEAD_TICKSPAN_H_
121