Physical Quantities  v1.0.0
C++ library of physical quantities, physical models, and units of measure for scientific computing. https://github.com/acodcha/phq
SubstanceAmount.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_SUBSTANCE_AMOUNT_HPP
26 #define PHQ_DIMENSION_SUBSTANCE_AMOUNT_HPP
27 
28 #include <cstddef>
29 #include <cstdint>
30 #include <functional>
31 #include <iostream>
32 #include <string>
33 #include <string_view>
34 
35 namespace PhQ::Dimension {
36 
37 /// \brief Base physical dimension of amount of substance. Typically denoted "N". One of seven
38 /// independent base physical dimensions that form the physical dimension set of any unit of measure
39 /// or physical quantity. Part of PhQ::Dimensions.
41 public:
42  /// \brief Default constructor. Constructs a base physical dimension of amount of substance with a
43  /// value of zero.
44  constexpr SubstanceAmount() = default;
45 
46  /// \brief Constructor. Constructs a base physical dimension of amount of substance with a given
47  /// value.
48  explicit constexpr SubstanceAmount(const int8_t value) : value(value) {}
49 
50  /// \brief Destructor. Destroys this base physical dimension of amount of substance.
51  ~SubstanceAmount() noexcept = default;
52 
53  /// \brief Copy constructor. Constructs a base physical dimension of amount of substance by
54  /// copying another one.
55  constexpr SubstanceAmount(const SubstanceAmount& other) = default;
56 
57  /// \brief Copy assignment operator. Assigns the value of this base physical dimension of amount
58  /// of substance by copying from another one.
59  constexpr SubstanceAmount& operator=(const SubstanceAmount& other) = default;
60 
61  /// \brief Move constructor. Constructs a base physical dimension of amount of substance by moving
62  /// another one.
63  constexpr SubstanceAmount(SubstanceAmount&& other) noexcept = default;
64 
65  /// \brief Move assignment operator. Assigns the value of this base physical dimension of amount
66  /// of substance by moving another one.
67  constexpr SubstanceAmount& operator=(SubstanceAmount&& other) noexcept = default;
68 
69  /// \brief Value of this base physical dimension.
70  [[nodiscard]] constexpr int8_t Value() const noexcept {
71  return value;
72  }
73 
74  /// \brief Abbreviation of this base physical dimension.
75  static std::string_view Abbreviation() noexcept {
76  return "N";
77  }
78 
79  /// \brief Label of this base physical dimension.
80  static std::string_view Label() noexcept {
81  return "Substance Amount";
82  }
83 
84  /// \brief Prints this base physical dimension as a string.
85  [[nodiscard]] std::string Print() const noexcept {
86  if (value == 0) {
87  return {};
88  }
89  std::string string{Abbreviation()};
90  if (value > 1) {
91  string.append("^" + std::to_string(value));
92  } else if (value < 0) {
93  string.append("^(" + std::to_string(value) + ")");
94  }
95  return string;
96  }
97 
98 private:
99  /// \brief Value of this base physical dimension.
100  int8_t value{0};
101 };
102 
103 inline constexpr bool operator==(
104  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
105  return left.Value() == right.Value();
106 }
107 
108 inline constexpr bool operator!=(
109  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
110  return left.Value() != right.Value();
111 }
112 
113 inline constexpr bool operator<(
114  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
115  return left.Value() < right.Value();
116 }
117 
118 inline constexpr bool operator>(
119  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
120  return left.Value() > right.Value();
121 }
122 
123 inline constexpr bool operator<=(
124  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
125  return left.Value() <= right.Value();
126 }
127 
128 inline constexpr bool operator>=(
129  const SubstanceAmount& left, const SubstanceAmount& right) noexcept {
130  return left.Value() >= right.Value();
131 }
132 
133 inline std::ostream& operator<<(std::ostream& stream, const SubstanceAmount& amount) {
134  stream << amount.Print();
135  return stream;
136 }
137 
138 } // namespace PhQ::Dimension
139 
140 namespace std {
141 
142 template <>
143 struct hash<PhQ::Dimension::SubstanceAmount> {
144  inline size_t operator()(const PhQ::Dimension::SubstanceAmount& amount) const {
145  return hash<int8_t>()(amount.Value());
146  }
147 };
148 
149 } // namespace std
150 
151 #endif // PHQ_DIMENSION_SUBSTANCE_AMOUNT_HPP
Base physical dimension of amount of substance. Typically denoted "N". One of seven independent base ...
std::string Print() const noexcept
Prints this base physical dimension as a string.
constexpr int8_t Value() const noexcept
Value of this base physical dimension.
static std::string_view Label() noexcept
Label of this base physical dimension.
int8_t value
Value of this base physical dimension.
constexpr SubstanceAmount(const int8_t value)
Constructor. Constructs a base physical dimension of amount of substance with a given value.
~SubstanceAmount() noexcept=default
Destructor. Destroys this base physical dimension of amount of substance.
constexpr SubstanceAmount()=default
Default constructor. Constructs a base physical dimension of amount of substance with a value of zero...
static std::string_view Abbreviation() noexcept
Abbreviation of this base physical dimension.
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)
SubstanceAmount
Amount of substance units.
Namespace that encompasses all of the Physical Quantities library's content.