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