tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
day.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2021 Tobias Hienzsch
3
4#ifndef TETL_CHRONO_DAY_HPP
5#define TETL_CHRONO_DAY_HPP
6
7#include <etl/_chrono/duration.hpp>
8#include <etl/_contracts/check.hpp>
9#include <etl/_cstdint/uint_t.hpp>
10#include <etl/_limits/numeric_limits.hpp>
11
12namespace etl::chrono {
13
14/// The class day represents a day in a month.
15///
16/// Its normal range is [1, 31], but it may hold any number in [​0​, 255].
17///
18/// - https://en.cppreference.com/w/cpp/chrono/day
19///
20/// \ingroup chrono
21struct day {
22 day() = default;
23
24 constexpr explicit day(unsigned d) noexcept
25 : _count{static_cast<etl::uint8_t>(d)}
26 {
27 TETL_PRECONDITION(d < etl::numeric_limits<etl::uint8_t>::max());
28 }
29
30 constexpr auto operator++() noexcept -> day&
31 {
32 return *this += days{1};
33 }
34
35 constexpr auto operator++(int) noexcept -> day
36 {
37 auto tmp = *this;
38 ++(*this);
39 return tmp;
40 }
41
42 constexpr auto operator--() noexcept -> day&
43 {
44 return *this -= days{1};
45 }
46
47 constexpr auto operator--(int) noexcept -> day
48 {
49 auto tmp = *this;
50 --(*this);
51 return tmp;
52 }
53
54 constexpr auto operator+=(days const& d) noexcept -> day&
55 {
56 _count += static_cast<etl::uint8_t>(d.count());
57 return *this;
58 }
59
60 constexpr auto operator-=(days const& d) noexcept -> day&
61 {
62 _count -= static_cast<etl::uint8_t>(d.count());
63 return *this;
64 }
65
66 constexpr explicit operator unsigned() const noexcept
67 {
68 return _count;
69 }
70
71 [[nodiscard]] constexpr auto ok() const noexcept -> bool
72 {
73 return (_count > 0U) and (_count < 32U);
74 }
75
76 friend constexpr auto operator==(day lhs, day rhs) noexcept -> bool
77 {
78 return static_cast<unsigned>(lhs) == static_cast<unsigned>(rhs);
79 }
80
81 friend constexpr auto operator<(day lhs, day rhs) noexcept -> bool
82 {
83 return static_cast<unsigned>(lhs) < static_cast<unsigned>(rhs);
84 }
85
86 friend constexpr auto operator<=(day lhs, day rhs) noexcept -> bool
87 {
88 return static_cast<unsigned>(lhs) <= static_cast<unsigned>(rhs);
89 }
90
91 friend constexpr auto operator>(day lhs, day rhs) noexcept -> bool
92 {
93 return static_cast<unsigned>(lhs) > static_cast<unsigned>(rhs);
94 }
95
96 friend constexpr auto operator>=(day lhs, day rhs) noexcept -> bool
97 {
98 return static_cast<unsigned>(lhs) >= static_cast<unsigned>(rhs);
99 }
100
101private:
102 etl::uint8_t _count;
103};
104
105[[nodiscard]] constexpr auto operator+(day const& d, days const& ds) noexcept -> day
106{
107 return day(static_cast<unsigned>(d) + static_cast<unsigned>(ds.count()));
108}
109
110[[nodiscard]] constexpr auto operator+(days const& ds, day const& d) noexcept -> day
111{
112 return day(static_cast<unsigned>(d) + static_cast<unsigned>(ds.count()));
113}
114
115[[nodiscard]] constexpr auto operator-(day const& d, days const& ds) noexcept -> day
116{
117 return day(static_cast<unsigned>(d) - static_cast<unsigned>(ds.count()));
118}
119
120[[nodiscard]] constexpr auto operator-(day const& x, day const& y) noexcept -> days
121{
122 return days(int(unsigned(x)) - int(unsigned(y)));
123}
124
125} // namespace etl::chrono
126
127// NOLINTNEXTLINE(modernize-concat-nested-namespaces)
128namespace etl {
129inline namespace literals {
130inline namespace chrono_literals {
131
132/// \brief Forms a etl::chrono::day literal representing a day of the month in the calendar.
133[[nodiscard]] constexpr auto operator""_d(unsigned long long d) noexcept -> etl::chrono::day
134{
135 return etl::chrono::day{static_cast<unsigned>(d)};
136}
137
138} // namespace chrono_literals
139} // namespace literals
140} // namespace etl
141
142namespace etl::chrono {
143using namespace etl::literals::chrono_literals;
144} // namespace etl::chrono
145#endif // TETL_CHRONO_DAY_HPP
Definition abs.hpp:12
constexpr auto operator+(day const &d, days const &ds) noexcept -> day
Definition day.hpp:105
constexpr auto operator-(day const &x, day const &y) noexcept -> days
Definition day.hpp:120
constexpr auto operator+(days const &ds, day const &d) noexcept -> day
Definition day.hpp:110
constexpr auto operator-(day const &d, days const &ds) noexcept -> day
Definition day.hpp:115
Definition day.hpp:130
Definition day.hpp:129
Definition adjacent_find.hpp:9
The class day represents a day in a month.
Definition day.hpp:21
constexpr operator unsigned() const noexcept
Definition day.hpp:66
constexpr auto ok() const noexcept -> bool
Definition day.hpp:71
friend constexpr auto operator<(day lhs, day rhs) noexcept -> bool
Definition day.hpp:81
friend constexpr auto operator==(day lhs, day rhs) noexcept -> bool
Definition day.hpp:76
constexpr auto operator--(int) noexcept -> day
Definition day.hpp:47
friend constexpr auto operator>=(day lhs, day rhs) noexcept -> bool
Definition day.hpp:96
constexpr auto operator++() noexcept -> day &
Definition day.hpp:30
constexpr auto operator++(int) noexcept -> day
Definition day.hpp:35
friend constexpr auto operator<=(day lhs, day rhs) noexcept -> bool
Definition day.hpp:86
constexpr day(unsigned d) noexcept
Definition day.hpp:24
friend constexpr auto operator>(day lhs, day rhs) noexcept -> bool
Definition day.hpp:91
constexpr auto operator+=(days const &d) noexcept -> day &
Definition day.hpp:54
constexpr auto operator--() noexcept -> day &
Definition day.hpp:42
constexpr auto operator-=(days const &d) noexcept -> day &
Definition day.hpp:60
constexpr auto count() const -> rep
Returns the number of ticks for this duration.
Definition duration.hpp:98