Physical Quantities  v1.0.0
C++ library of physical quantities, physical models, and units of measure for scientific computing. https://github.com/acodcha/phq
Loading...
Searching...
No Matches
Time.hpp
Go to the documentation of this file.
1// Copyright © 2020-2024 Alexandre Coderre-Chabot
2//
3// This file is part of Physical Quantities (PhQ), a C++ library of physical quantities, physical
4// models, and units of measure for scientific computing.
5//
6// Physical Quantities is hosted at:
7// https://github.com/acodcha/phq
8//
9// Physical Quantities is licensed under the MIT License:
10// https://mit-license.org
11//
12// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
13// associated documentation files (the "Software"), to deal in the Software without restriction,
14// including without limitation the rights to use, copy, modify, merge, publish, distribute,
15// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
16// furnished to do so, subject to the following conditions:
17// - The above copyright notice and this permission notice shall be included in all copies or
18// substantial portions of the Software.
19// - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
20// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM
23// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25#ifndef PHQ_DIMENSION_TIME_HPP
26#define PHQ_DIMENSION_TIME_HPP
27
28#include <cstddef>
29#include <cstdint>
30#include <functional>
31#include <iostream>
32#include <string>
33#include <string_view>
34
35namespace PhQ::Dimension {
36
37/// \brief Base physical dimension of time. Typically denoted "T". One of seven independent base
38/// physical dimensions that form the physical dimension set of any unit of measure or physical
39/// quantity. Part of PhQ::Dimensions.
40class Time {
41public:
42 /// \brief Default constructor. Constructs a base physical dimension of time with a value of zero.
43 constexpr Time() = default;
44
45 /// \brief Constructor. Constructs a base physical dimension of time with a given value.
46 explicit constexpr Time(const int8_t value) : value(value) {}
47
48 /// \brief Destructor. Destroys this base physical dimension of time.
49 ~Time() noexcept = default;
50
51 /// \brief Copy constructor. Constructs a base physical dimension of time by copying another one.
52 constexpr Time(const Time& other) = default;
53
54 /// \brief Copy assignment operator. Assigns the value of this base physical dimension of time by
55 /// copying from another one.
56 constexpr Time& operator=(const Time& other) = default;
57
58 /// \brief Move constructor. Constructs a base physical dimension of time by moving another one.
59 constexpr Time(Time&& other) noexcept = default;
60
61 /// \brief Move assignment operator. Assigns the value of this base physical dimension of time by
62 /// moving another one.
63 constexpr Time& operator=(Time&& other) noexcept = default;
64
65 /// \brief Value of this base physical dimension.
66 [[nodiscard]] constexpr int8_t Value() const noexcept {
67 return value;
68 }
69
70 /// \brief Abbreviation of this base physical dimension.
71 static std::string_view Abbreviation() noexcept {
72 return "T";
73 }
74
75 /// \brief Label of this base physical dimension.
76 static std::string_view Label() noexcept {
77 return "Time";
78 }
79
80 /// \brief Prints this base physical dimension as a string.
81 [[nodiscard]] std::string Print() const noexcept {
82 if (value == 0) {
83 return {};
84 }
85 std::string string{Abbreviation()};
86 if (value > 1) {
87 string.append("^" + std::to_string(value));
88 } else if (value < 0) {
89 string.append("^(" + std::to_string(value) + ")");
90 }
91 return string;
92 }
93
94private:
95 /// \brief Value of this base physical dimension.
96 int8_t value{0};
97};
98
99inline constexpr bool operator==(const Time& left, const Time& right) noexcept {
100 return left.Value() == right.Value();
101}
102
103inline constexpr bool operator!=(const Time& left, const Time& right) noexcept {
104 return left.Value() != right.Value();
105}
106
107inline constexpr bool operator<(const Time& left, const Time& right) noexcept {
108 return left.Value() < right.Value();
109}
110
111inline constexpr bool operator>(const Time& left, const Time& right) noexcept {
112 return left.Value() > right.Value();
113}
114
115inline constexpr bool operator<=(const Time& left, const Time& right) noexcept {
116 return left.Value() <= right.Value();
117}
118
119inline constexpr bool operator>=(const Time& left, const Time& right) noexcept {
120 return left.Value() >= right.Value();
121}
122
123inline std::ostream& operator<<(std::ostream& stream, const Time& time) {
124 stream << time.Print();
125 return stream;
126}
127
128} // namespace PhQ::Dimension
129
130namespace std {
131
132template <>
133struct hash<PhQ::Dimension::Time> {
134 inline size_t operator()(const PhQ::Dimension::Time& time) const {
135 return hash<int8_t>()(time.Value());
136 }
137};
138
139} // namespace std
140
141#endif // PHQ_DIMENSION_TIME_HPP
Base physical dimension of time. Typically denoted "T". One of seven independent base physical dimens...
Definition Time.hpp:40
int8_t value
Value of this base physical dimension.
Definition Time.hpp:96
constexpr int8_t Value() const noexcept
Value of this base physical dimension.
Definition Time.hpp:66
constexpr Time()=default
Default constructor. Constructs a base physical dimension of time with a value of zero.
static std::string_view Label() noexcept
Label of this base physical dimension.
Definition Time.hpp:76
~Time() noexcept=default
Destructor. Destroys this base physical dimension of time.
std::string Print() const noexcept
Prints this base physical dimension as a string.
Definition Time.hpp:81
constexpr Time(const int8_t value)
Constructor. Constructs a base physical dimension of time with a given value.
Definition Time.hpp:46
static std::string_view Abbreviation() noexcept
Abbreviation of this base physical dimension.
Definition Time.hpp:71
Namespace that contains base physical dimensions.
Definition Base.hpp:72
constexpr bool operator!=(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
constexpr bool operator>(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
constexpr bool operator<(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
constexpr bool operator<=(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
constexpr bool operator==(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
constexpr bool operator>=(const ElectricCurrent &left, const ElectricCurrent &right) noexcept
std::ostream & operator<<(std::ostream &stream, const ElectricCurrent &current)
Namespace that encompasses all of the Physical Quantities library's content.