kDB: Knowledge DataBase
Loading...
Searching...
No Matches
Timestamp.h
1#pragma once
2
3#include <QtGlobal>
4
5#include <chrono>
6
7#include <clog_qt>
8#include <cres_qt>
9
10class QDateTime;
11
12#include "BigNumber.h"
13#include "QuantityValue.h"
14
15namespace knowCore
16{
17 using Years = std::chrono::duration<BigNumber, std::ratio<31556952>>;
18 using Months = std::chrono::duration<BigNumber, std::ratio<2629746>>;
19 using Weeks = std::chrono::duration<BigNumber, std::ratio<604800>>;
20 using Days = std::chrono::duration<BigNumber, std::ratio<86400>>;
21 using Hours = std::chrono::duration<BigNumber, std::ratio<3600>>;
22 using Minutes = std::chrono::duration<BigNumber, std::ratio<60>>;
23 using Seconds = std::chrono::duration<BigNumber>;
24 using MilliSeconds = std::chrono::duration<BigNumber, std::milli>;
25 using NanoSeconds = std::chrono::duration<BigNumber, std::nano>;
26 namespace details
27 {
28 template<typename T>
29 struct is_ratio : std::false_type
30 {
31 };
32
33 template<intmax_t _Num, intmax_t _Den>
34 struct is_ratio<std::ratio<_Num, _Den>> : std::true_type
35 {
36 };
37 } // namespace details
39 {
40 public:
41 Timestamp(NanoSeconds _ns) : m_ns_since_unix_epoch(_ns) {}
42 public:
43 Timestamp() : m_ns_since_unix_epoch(BigNumber::zero()) {}
44 ~Timestamp() {}
45
46 bool isValid() const { return m_ns_since_unix_epoch.count() > 0; }
47 cres_qresult<QDateTime> toQDateTime() const;
48
53 static cres_qresult<Timestamp> fromEpoch(const QuantityNumber& _quantity);
54
55 cres_qresult<QString> toRdfLiteral() const;
56 static cres_qresult<Timestamp> fromRdfLiteral(const QString& _literal);
57
58 template<typename _unit_>
59 cres_qresult<_unit_> toLocal() const;
64 template<typename _unit_>
65 _unit_ toEpoch() const;
66
67 bool operator<(const Timestamp& _rhs) const;
68 bool operator<=(const Timestamp& _rhs) const;
69 bool operator==(const Timestamp& _rhs) const;
70 bool operator!=(const Timestamp& _rhs) const;
71 bool operator>(const Timestamp& _rhs) const;
72 bool operator>=(const Timestamp& _rhs) const;
73
74 Timestamp operator+(const Timestamp& _rhs) const;
75 Timestamp& operator+=(const Timestamp& _rhs);
76 Timestamp operator-(const Timestamp& _rhs) const;
77 Timestamp operator*(const knowCore::BigNumber& _rhs) const;
78
79 template<typename _unit_>
80 Timestamp add(_unit_ _unit) const;
84 template<typename _unit_>
85 _unit_ intervalTo(const Timestamp& _time) const;
86
90 static Timestamp endOfTime();
94 static Timestamp originOfTime();
95 static Timestamp now();
96 template<typename _unit_>
97 static cres_qresult<Timestamp> fromLocal(_unit_ _value);
98 template<typename _Period_>
100 static Timestamp fromEpoch(const std::chrono::duration<BigNumber, _Period_>& _value);
101 template<typename _Rep_, typename _Period_>
102 requires(not std::is_same_v<_Rep_, knowCore::BigNumber>
104 static Timestamp fromEpoch(const std::chrono::duration<_Rep_, _Period_>& _value);
105 template<typename _unit_>
106 static Timestamp fromEpoch(qint64 _value);
107 template<typename _unit_>
108 static Timestamp fromEpoch(const knowCore::BigNumber& _value);
109 static Timestamp from(const QDateTime& _time);
110 private:
111 static cres_qresult<NanoSeconds> localToEpoch(NanoSeconds _time);
112 static cres_qresult<NanoSeconds> epochToLocal(NanoSeconds _time);
113 static Unit nanoSECUnit();
114 private:
115 NanoSeconds m_ns_since_unix_epoch;
116 };
117
118 template<>
119 inline knowCore::QuantityNumber Timestamp::toEpoch<knowCore::QuantityNumber>() const
120 {
121 return knowCore::QuantityNumber(m_ns_since_unix_epoch.count(), nanoSECUnit());
122 }
123
124 template<typename _unit_>
125 inline cres_qresult<Timestamp> Timestamp::fromLocal(_unit_ _value)
126 {
127 cres_try(NanoSeconds lte,
128 localToEpoch(std::chrono::duration_cast<NanoSeconds>(_unit_(_value))));
129 return cres_success(fromEpoch(lte));
130 }
131 template<typename _Period_>
132 requires details::is_ratio<_Period_>::value
133 inline Timestamp Timestamp::fromEpoch(const std::chrono::duration<BigNumber, _Period_>& _value)
134 {
135 return Timestamp(std::chrono::duration_cast<NanoSeconds>(_value));
136 }
137 template<typename _Rep_, typename _Period_>
138 requires(not std::is_same_v<_Rep_, knowCore::BigNumber> and details::is_ratio<_Period_>::value)
139 inline Timestamp Timestamp::fromEpoch(const std::chrono::duration<_Rep_, _Period_>& _value)
140 {
141 return fromEpoch<_Period_>(
142 std::chrono::duration<knowCore::BigNumber, _Period_>(_value.count()));
143 }
144 template<typename _unit_>
145 inline Timestamp Timestamp::fromEpoch(qint64 _value)
146 {
147 return fromEpoch(_unit_(BigNumber(_value)));
148 }
149 template<typename _unit_>
150 inline Timestamp Timestamp::fromEpoch(const knowCore::BigNumber& _value)
151 {
152 return fromEpoch(_unit_(_value));
153 }
154 template<typename _unit_>
155 inline cres_qresult<_unit_> Timestamp::toLocal() const
156 {
157 cres_try(NanoSeconds etl, epochToLocal(m_ns_since_unix_epoch));
158 return std::chrono::duration_cast<_unit_>(etl);
159 }
160 template<typename _unit_>
161 inline _unit_ Timestamp::toEpoch() const
162 {
163 return std::chrono::duration_cast<_unit_>(m_ns_since_unix_epoch);
164 }
165
166 inline bool Timestamp::operator<(const Timestamp& _rhs) const
167 {
168 return m_ns_since_unix_epoch < _rhs.m_ns_since_unix_epoch;
169 }
170 inline bool Timestamp::operator<=(const Timestamp& _rhs) const
171 {
172 return m_ns_since_unix_epoch <= _rhs.m_ns_since_unix_epoch;
173 }
174 inline bool Timestamp::operator==(const Timestamp& _rhs) const
175 {
176 return m_ns_since_unix_epoch == _rhs.m_ns_since_unix_epoch;
177 }
178 inline bool Timestamp::operator!=(const Timestamp& _rhs) const
179 {
180 return m_ns_since_unix_epoch != _rhs.m_ns_since_unix_epoch;
181 }
182 inline bool Timestamp::operator>(const Timestamp& _rhs) const
183 {
184 return m_ns_since_unix_epoch > _rhs.m_ns_since_unix_epoch;
185 }
186 inline bool Timestamp::operator>=(const Timestamp& _rhs) const
187 {
188 return m_ns_since_unix_epoch >= _rhs.m_ns_since_unix_epoch;
189 }
190
191 inline Timestamp Timestamp::operator+(const Timestamp& _rhs) const
192 {
193 return Timestamp(m_ns_since_unix_epoch + _rhs.m_ns_since_unix_epoch);
194 }
195 inline Timestamp& Timestamp::operator+=(const Timestamp& _rhs)
196 {
197 m_ns_since_unix_epoch = m_ns_since_unix_epoch + _rhs.m_ns_since_unix_epoch;
198 return *this;
199 }
200
201 inline Timestamp Timestamp::operator-(const Timestamp& _rhs) const
202 {
203 return Timestamp(m_ns_since_unix_epoch - _rhs.m_ns_since_unix_epoch);
204 }
205 inline Timestamp Timestamp::operator*(const knowCore::BigNumber& _rhs) const
206 {
207 return Timestamp(m_ns_since_unix_epoch * _rhs);
208 }
209
210 template<typename _unit_>
211 Timestamp Timestamp::add(_unit_ _unit) const
212 {
213 return Timestamp(m_ns_since_unix_epoch + std::chrono::duration_cast<NanoSeconds>(_unit));
214 }
215
216 template<typename _unit_>
217 _unit_ Timestamp::intervalTo(const Timestamp& _time) const
218 {
219 return _time.toEpoch<_unit_>() - toEpoch<_unit_>();
220 }
221} // namespace knowCore
222
223#include "MetaType.h"
224KNOWCORE_DECLARE_FULL_METATYPE(knowCore, Timestamp);
225
226inline knowCore::Timestamp operator"" _kCdtns(unsigned long long int _value)
227{
228 return knowCore::Timestamp::fromEpoch(knowCore::NanoSeconds(_value));
229}
230
231#include "Formatter.h"
232clog_format_declare_formatter(knowCore::Timestamp)
233{
234 auto const& [s, v, e] = p.toQDateTime();
235 if(s)
236 {
237 return format_to(ctx.out(), "{}", v.value());
238 }
239 else
240 {
241 return format_to(ctx.out(), "{}ns", p.toEpoch<knowCore::NanoSeconds>().count());
242 }
243}
244
245inline knowCore::Timestamp operator""_kCtns(unsigned long long int _v)
246{
247 return knowCore::Timestamp::fromEpoch(knowCore::NanoSeconds(_v));
248}
Class that can contains large numeric value.
Definition BigNumber.h:51
Definition QuantityValue.h:22
Definition Timestamp.h:39
_unit_ intervalTo(const Timestamp &_time) const
Definition Timestamp.h:217
static cres_qresult< Timestamp > fromEpoch(const QuantityNumber &_quantity)
Definition Timestamp.cpp:78
_unit_ toEpoch() const
Definition Timestamp.h:161
static Timestamp endOfTime()
Definition Timestamp.cpp:128
static Timestamp originOfTime()
Definition Timestamp.cpp:135
Definition Unit.h:17
Definition Timestamp.h:30