NeBuild dev
Loading...
Searching...
No Matches
date_time.hpp
Go to the documentation of this file.
1//# This file is a part of toml++ and is subject to the the terms of the MIT license.
2//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
3//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
4// SPDX-License-Identifier: MIT
5#pragma once
6
8#include "print_to_stream.hpp"
9#include "header_start.hpp"
10
12{
14 struct TOML_TRIVIAL_ABI date
15 {
17 uint16_t year;
18
20 uint8_t month;
21
23 uint8_t day;
24
27 date() noexcept = default;
28
30 TOML_CONSTRAINED_TEMPLATE((impl::all_integral<Y, M, D>), typename Y, typename M, typename D)
32 constexpr date(Y y, M m, D d) noexcept //
33 : year{ static_cast<uint16_t>(y) },
34 month{ static_cast<uint8_t>(m) },
35 day{ static_cast<uint8_t>(d) }
36 {}
37
40 friend constexpr bool operator==(const date& lhs, const date& rhs) noexcept
41 {
42 return lhs.year == rhs.year //
43 && lhs.month == rhs.month //
44 && lhs.day == rhs.day;
45 }
46
49 friend constexpr bool operator!=(const date& lhs, const date& rhs) noexcept
50 {
51 return !(lhs == rhs);
52 }
53
54 private:
56
58 static constexpr uint32_t pack(const date& d) noexcept
59 {
60 return (static_cast<uint32_t>(d.year) << 16) | (static_cast<uint32_t>(d.month) << 8)
61 | static_cast<uint32_t>(d.day);
62 }
63
65
66 public:
69 friend constexpr bool operator<(const date& lhs, const date& rhs) noexcept
70 {
71 return pack(lhs) < pack(rhs);
72 }
73
76 friend constexpr bool operator<=(const date& lhs, const date& rhs) noexcept
77 {
78 return pack(lhs) <= pack(rhs);
79 }
80
83 friend constexpr bool operator>(const date& lhs, const date& rhs) noexcept
84 {
85 return pack(lhs) > pack(rhs);
86 }
87
90 friend constexpr bool operator>=(const date& lhs, const date& rhs) noexcept
91 {
92 return pack(lhs) >= pack(rhs);
93 }
94
104 friend std::ostream& operator<<(std::ostream& lhs, const date& rhs)
105 {
106 impl::print_to_stream(lhs, rhs);
107 return lhs;
108 }
109 };
110
113 {
115 uint8_t hour;
116
118 uint8_t minute;
119
121 uint8_t second;
122
124 uint32_t nanosecond;
125
128 time() noexcept = default;
129
131 TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M, S, NS>),
132 typename H,
133 typename M,
134 typename S = uint8_t,
135 typename NS = uint32_t)
137 constexpr time(H h, M m, S s = S{}, NS ns = NS{}) noexcept //
138 : hour{ static_cast<uint8_t>(h) },
139 minute{ static_cast<uint8_t>(m) },
140 second{ static_cast<uint8_t>(s) },
141 nanosecond{ static_cast<uint32_t>(ns) }
142 {}
143
146 friend constexpr bool operator==(const time& lhs, const time& rhs) noexcept
147 {
148 return lhs.hour == rhs.hour //
149 && lhs.minute == rhs.minute //
150 && lhs.second == rhs.second //
151 && lhs.nanosecond == rhs.nanosecond;
152 }
153
156 friend constexpr bool operator!=(const time& lhs, const time& rhs) noexcept
157 {
158 return !(lhs == rhs);
159 }
160
161 private:
163
165 static constexpr uint64_t pack(const time& t) noexcept
166 {
167 return static_cast<uint64_t>(t.hour) << 48 | static_cast<uint64_t>(t.minute) << 40
168 | static_cast<uint64_t>(t.second) << 32 | static_cast<uint64_t>(t.nanosecond);
169 }
170
172
173 public:
176 friend constexpr bool operator<(const time& lhs, const time& rhs) noexcept
177 {
178 return pack(lhs) < pack(rhs);
179 }
180
183 friend constexpr bool operator<=(const time& lhs, const time& rhs) noexcept
184 {
185 return pack(lhs) <= pack(rhs);
186 }
187
190 friend constexpr bool operator>(const time& lhs, const time& rhs) noexcept
191 {
192 return pack(lhs) > pack(rhs);
193 }
194
197 friend constexpr bool operator>=(const time& lhs, const time& rhs) noexcept
198 {
199 return pack(lhs) >= pack(rhs);
200 }
201
212 friend std::ostream& operator<<(std::ostream& lhs, const time& rhs)
213 {
214 impl::print_to_stream(lhs, rhs);
215 return lhs;
216 }
217 };
218
221 {
223 int16_t minutes;
224
227 time_offset() noexcept = default;
228
250 TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M>), typename H, typename M)
252 constexpr time_offset(H h, M m) noexcept //
253 : minutes{ static_cast<int16_t>(static_cast<impl::common_signed_type<H, M>>(h)
254 * impl::common_signed_type<H, M>{ 60 }
255 + static_cast<impl::common_signed_type<H, M>>(m)) }
256 {}
257
260 friend constexpr bool operator==(time_offset lhs, time_offset rhs) noexcept
261 {
262 return lhs.minutes == rhs.minutes;
263 }
264
267 friend constexpr bool operator!=(time_offset lhs, time_offset rhs) noexcept
268 {
269 return lhs.minutes != rhs.minutes;
270 }
271
274 friend constexpr bool operator<(time_offset lhs, time_offset rhs) noexcept
275 {
276 return lhs.minutes < rhs.minutes;
277 }
278
281 friend constexpr bool operator<=(time_offset lhs, time_offset rhs) noexcept
282 {
283 return lhs.minutes <= rhs.minutes;
284 }
285
288 friend constexpr bool operator>(time_offset lhs, time_offset rhs) noexcept
289 {
290 return lhs.minutes > rhs.minutes;
291 }
292
295 friend constexpr bool operator>=(time_offset lhs, time_offset rhs) noexcept
296 {
297 return lhs.minutes >= rhs.minutes;
298 }
299
316 friend std::ostream& operator<<(std::ostream& lhs, const time_offset& rhs)
317 {
318 impl::print_to_stream(lhs, rhs);
319 return lhs;
320 }
321 };
322
324
327 {
329 toml::date date;
330
332 toml::time time;
333
337 optional<toml::time_offset> offset;
338
341 date_time() noexcept = default;
342
348 constexpr date_time(const toml::date& d, const toml::time& t) noexcept //
349 : date{ d },
350 time{ t },
351 offset{} // TINAE - icc bugfix
352 {}
353
358 explicit constexpr date_time(const toml::date& d) noexcept //
359 : date{ d },
360 time{},
361 offset{} // TINAE - icc bugfix
362 {}
363
368 explicit constexpr date_time(const toml::time& t) noexcept //
369 : date{},
370 time{ t },
371 offset{} // TINAE - icc bugfix
372 {}
373
380 constexpr date_time(const toml::date& d, const toml::time& t, const toml::time_offset& off) noexcept
381 : date{ d },
382 time{ t },
383 offset{ off }
384 {}
385
388 constexpr bool is_local() const noexcept
389 {
390 return !offset.has_value();
391 }
392
395 friend constexpr bool operator==(const date_time& lhs, const date_time& rhs) noexcept
396 {
397 return lhs.date == rhs.date //
398 && lhs.time == rhs.time //
399 && lhs.offset == rhs.offset;
400 }
401
404 friend constexpr bool operator!=(const date_time& lhs, const date_time& rhs) noexcept
405 {
406 return !(lhs == rhs);
407 }
408
411 friend constexpr bool operator<(const date_time& lhs, const date_time& rhs) noexcept
412 {
413 if (lhs.date != rhs.date)
414 return lhs.date < rhs.date;
415 if (lhs.time != rhs.time)
416 return lhs.time < rhs.time;
417 return lhs.offset < rhs.offset;
418 }
419
422 friend constexpr bool operator<=(const date_time& lhs, const date_time& rhs) noexcept
423 {
424 if (lhs.date != rhs.date)
425 return lhs.date < rhs.date;
426 if (lhs.time != rhs.time)
427 return lhs.time < rhs.time;
428 return lhs.offset <= rhs.offset;
429 }
430
433 friend constexpr bool operator>(const date_time& lhs, const date_time& rhs) noexcept
434 {
435 return !(lhs <= rhs);
436 }
437
440 friend constexpr bool operator>=(const date_time& lhs, const date_time& rhs) noexcept
441 {
442 return !(lhs < rhs);
443 }
444
457 friend std::ostream& operator<<(std::ostream& lhs, const date_time& rhs)
458 {
459 impl::print_to_stream(lhs, rhs);
460 return lhs;
461 }
462 };
463
464 TOML_ABI_NAMESPACE_END; // TOML_HAS_CUSTOM_OPTIONAL_TYPE
465}
467
468#include "header_end.hpp"
TOML_NAMESPACE_START
Definition date_time.hpp:12
TOML_ABI_NAMESPACE_END
Definition date_time.hpp:464
TOML_NAMESPACE_END
Definition date_time.hpp:466
std::basic_ostream< Char > & operator<<(std::basic_ostream< Char > &lhs, node_type rhs)
Pretty-prints the value of a node_type to a stream.
Definition forward_declarations.hpp:256
#define TOML_HAS_CUSTOM_OPTIONAL_TYPE
Definition preprocessor.hpp:1101
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14737
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14762
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14787
The root namespace for all toml++ functions and types.
Definition forward_declarations.hpp:199
#define TOML_NODISCARD_CTOR
Definition preprocessor.hpp:446
#define TOML_TRIVIAL_ABI
Definition preprocessor.hpp:430
#define TOML_ABI_NAMESPACE_BOOL(cond, T, F)
Definition preprocessor.hpp:1323
#define TOML_CONSTRAINED_TEMPLATE(condition,...)
Definition preprocessor.hpp:1260
#define TOML_PURE_GETTER
Definition preprocessor.hpp:474
#define TOML_PURE_INLINE_GETTER
Definition preprocessor.hpp:479
A date-time.
Definition date_time.hpp:327
TOML_NODISCARD_CTOR constexpr date_time(const toml::date &d) noexcept
Constructs a local date-time.
Definition date_time.hpp:358
toml::date date
The date component.
Definition date_time.hpp:329
TOML_PURE_INLINE_GETTER friend constexpr bool operator>(const date_time &lhs, const date_time &rhs) noexcept
Greater-than operator.
Definition date_time.hpp:433
TOML_PURE_INLINE_GETTER friend constexpr bool operator!=(const date_time &lhs, const date_time &rhs) noexcept
Inequality operator.
Definition date_time.hpp:404
TOML_PURE_GETTER friend constexpr bool operator==(const date_time &lhs, const date_time &rhs) noexcept
Equality operator.
Definition date_time.hpp:395
toml::time time
The time component.
Definition date_time.hpp:332
TOML_PURE_GETTER friend constexpr bool operator<(const date_time &lhs, const date_time &rhs) noexcept
Less-than operator.
Definition date_time.hpp:411
TOML_PURE_GETTER friend constexpr bool operator<=(const date_time &lhs, const date_time &rhs) noexcept
Less-than-or-equal-to operator.
Definition date_time.hpp:422
TOML_NODISCARD_CTOR date_time() noexcept=default
Default constructor. Does not initialize the members.
TOML_PURE_INLINE_GETTER constexpr bool is_local() const noexcept
Returns true if this date_time does not contain timezone offset information.
Definition date_time.hpp:388
TOML_PURE_INLINE_GETTER friend constexpr bool operator>=(const date_time &lhs, const date_time &rhs) noexcept
Greater-than-or-equal-to operator.
Definition date_time.hpp:440
friend std::ostream & operator<<(std::ostream &lhs, const date_time &rhs)
Prints a date_time out to a stream in RFC 3339 format. \detail \cpp std::cout << toml::date_time{ { 1...
Definition date_time.hpp:457
TOML_NODISCARD_CTOR constexpr date_time(const toml::date &d, const toml::time &t, const toml::time_offset &off) noexcept
Constructs an offset date-time.
Definition date_time.hpp:380
optional< toml::time_offset > offset
The timezone offset component.
Definition date_time.hpp:337
TOML_NODISCARD_CTOR constexpr date_time(const toml::time &t) noexcept
Constructs a local date-time.
Definition date_time.hpp:368
A timezone offset.
Definition date_time.hpp:221
TOML_PURE_INLINE_GETTER friend constexpr bool operator<=(time_offset lhs, time_offset rhs) noexcept
Less-than-or-equal-to operator.
Definition date_time.hpp:281
friend std::ostream & operator<<(std::ostream &lhs, const time_offset &rhs)
Prints a time_offset out to a stream as +-HH:MM or Z (per RFC 3339). \detail \cpp std::cout << toml::...
Definition date_time.hpp:316
TOML_PURE_INLINE_GETTER friend constexpr bool operator>(time_offset lhs, time_offset rhs) noexcept
Greater-than operator.
Definition date_time.hpp:288
TOML_PURE_INLINE_GETTER friend constexpr bool operator<(time_offset lhs, time_offset rhs) noexcept
Less-than operator.
Definition date_time.hpp:274
TOML_PURE_INLINE_GETTER friend constexpr bool operator>=(time_offset lhs, time_offset rhs) noexcept
Greater-than-or-equal-to operator.
Definition date_time.hpp:295
int16_t minutes
Offset from UTC+0, in minutes.
Definition date_time.hpp:223
TOML_PURE_INLINE_GETTER friend constexpr bool operator==(time_offset lhs, time_offset rhs) noexcept
Equality operator.
Definition date_time.hpp:260
TOML_PURE_INLINE_GETTER friend constexpr bool operator!=(time_offset lhs, time_offset rhs) noexcept
Inequality operator.
Definition date_time.hpp:267
TOML_NODISCARD_CTOR time_offset() noexcept=default
Default constructor. Does not initialize the members.
A local time-of-day.
Definition date_time.hpp:113
uint8_t minute
The minute component, from 0 - 59.
Definition date_time.hpp:118
uint32_t nanosecond
The fractional nanoseconds component, from 0 - 999999999.
Definition date_time.hpp:124
uint8_t hour
The hour component, from 0 - 23.
Definition date_time.hpp:115
uint8_t second
The second component, from 0 - 59.
Definition date_time.hpp:121
TOML_NODISCARD_CTOR time() noexcept=default
Default constructor. Does not initialize the members.