DryChem 1.0.0
A generic, compile-time C++ toolbox with no dependencies for the modern computational chemistry project.
Loading...
Searching...
No Matches
physicalQuantity.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2025 Cody R. Drisko. All rights reserved.
2// Licensed under the MIT License. See the LICENSE file in the project root for more information.
3//
4// Name: physicalQuantity.hpp
5// Author: crdrisko
6// Date: 03/03/2020-18:45:26
7// Description: Defines the PhysicalQuantity class template with SI base units
8
9#ifndef DRYCHEM_CPP_UNITS_INCLUDE_CPP_UNITS_TYPES_PHYSICALQUANTITY_HPP
10#define DRYCHEM_CPP_UNITS_INCLUDE_CPP_UNITS_TYPES_PHYSICALQUANTITY_HPP
11
12#include <iostream>
13#include <string>
14#include <type_traits>
15
17
19
20namespace CppUnits
21{
31 template<typename BaseDimensionality>
32 class PhysicalQuantity : private DryChem::CompletelyComparable<PhysicalQuantity<BaseDimensionality>>
33 {
34 private:
35 long double magnitude {0.0l};
36
37 public:
38 using DimensionalityType = typename BaseDimensionality::Type;
39
40 constexpr PhysicalQuantity() noexcept = default;
41 constexpr explicit PhysicalQuantity(long double Magnitude) noexcept : magnitude {Magnitude} {}
42
48 constexpr explicit PhysicalQuantity(const std::string& Magnitude) : magnitude {std::stold(Magnitude)} {}
49
50 constexpr long double getMagnitude() const noexcept { return magnitude; }
51 constexpr void setMagnitude(long double Magnitude) noexcept { magnitude = Magnitude; }
52
54 constexpr friend bool operator==(const PhysicalQuantity<BaseDimensionality>& lhs,
55 const PhysicalQuantity<BaseDimensionality>& rhs) noexcept
56 {
57 return lhs.magnitude == rhs.magnitude;
58 }
59
60 constexpr friend bool operator<(const PhysicalQuantity<BaseDimensionality>& lhs,
61 const PhysicalQuantity<BaseDimensionality>& rhs) noexcept
62 {
63 return lhs.magnitude < rhs.magnitude;
64 }
65
67 constexpr auto operator+=(const PhysicalQuantity<BaseDimensionality>& rhs) noexcept
68 {
69 magnitude += rhs.magnitude;
70 return *this;
71 }
72
73 constexpr auto operator+(const PhysicalQuantity<BaseDimensionality>& rhs) const noexcept
74 {
75 return PhysicalQuantity<BaseDimensionality>(*this) += rhs;
76 }
77
78 constexpr auto operator-=(const PhysicalQuantity<BaseDimensionality>& rhs) noexcept
79 {
80 magnitude -= rhs.magnitude;
81 return *this;
82 }
83
84 constexpr auto operator-(const PhysicalQuantity<BaseDimensionality>& rhs) const noexcept
85 {
86 return PhysicalQuantity<BaseDimensionality>(*this) -= rhs;
87 }
88
89 constexpr auto operator-() noexcept
90 {
91 magnitude *= -1.0;
92 return *this;
93 }
94
95 template<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
96 constexpr auto operator*(T rhs) const noexcept
97 {
98 return (*this) * PhysicalQuantity<Dimensionality<>>(static_cast<long double>(rhs));
99 }
100
101 template<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
102 constexpr auto operator*=(T rhs) noexcept
103 {
104 magnitude *= static_cast<long double>(rhs);
105 return *this;
106 }
107
108 constexpr auto operator*=(const PhysicalQuantity<Dimensionality<>>& rhs) noexcept
109 {
110 magnitude *= rhs.getMagnitude();
111 return *this;
112 }
113
114 template<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
115 constexpr auto operator/(T rhs) const noexcept
116 {
117 return (*this) / PhysicalQuantity<Dimensionality<>>(static_cast<long double>(rhs));
118 }
119
120 template<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
121 constexpr auto operator/=(T rhs) noexcept
122 {
123 magnitude /= static_cast<long double>(rhs);
124 return *this;
125 }
126
127 constexpr auto operator/=(const PhysicalQuantity<Dimensionality<>>& rhs) noexcept
128 {
129 magnitude /= rhs.getMagnitude();
130 return *this;
131 }
132
134 constexpr friend std::ostream& operator<<(std::ostream& stream, const PhysicalQuantity<BaseDimensionality>& rhs)
135 {
136 stream << rhs.magnitude;
137 return stream;
138 }
139 };
140
141 template<int L1, int M1, int T1, int I1, int Th1, int N1, int J1,
142 int L2, int M2, int T2, int I2, int Th2, int N2, int J2>
149
150 template<int L, int M, int T, int I, int Th, int N, int J>
151 constexpr auto operator*(long double lhs, const PhysicalQuantity<Dimensionality<L, M, T, I, Th, N, J>>& rhs) noexcept
152 {
153 return PhysicalQuantity<Dimensionality<>>(lhs) * rhs;
154 }
155
156 template<int L1, int M1, int T1, int I1, int Th1, int N1, int J1,
157 int L2, int M2, int T2, int I2, int Th2, int N2, int J2>
160 {
161 return PhysicalQuantity<Dimensionality<L1 - L2, M1 - M2, T1 - T2, I1 - I2, Th1 - Th2, N1 - N2, J1 - J2>>(
162 lhs.getMagnitude() / rhs.getMagnitude());
163 }
164
165 template<int L, int M, int T, int I, int Th, int N, int J>
166 constexpr auto operator/(long double lhs, const PhysicalQuantity<Dimensionality<L, M, T, I, Th, N, J>>& rhs) noexcept
167 {
168 return PhysicalQuantity<Dimensionality<>>(lhs) / rhs;
169 }
170} // namespace CppUnits
171
172#endif
Definition physicalQuantity.hpp:33
constexpr auto operator-() noexcept
Definition physicalQuantity.hpp:89
constexpr auto operator/=(const PhysicalQuantity< Dimensionality<> > &rhs) noexcept
Definition physicalQuantity.hpp:127
constexpr PhysicalQuantity(const std::string &Magnitude)
Definition physicalQuantity.hpp:48
constexpr long double getMagnitude() const noexcept
Definition physicalQuantity.hpp:50
constexpr PhysicalQuantity() noexcept=default
constexpr auto operator*=(T rhs) noexcept
Definition physicalQuantity.hpp:102
typename Dimensionality<>::Type DimensionalityType
Definition physicalQuantity.hpp:38
constexpr void setMagnitude(long double Magnitude) noexcept
Definition physicalQuantity.hpp:51
long double magnitude
Definition physicalQuantity.hpp:35
constexpr friend bool operator==(const PhysicalQuantity< BaseDimensionality > &lhs, const PhysicalQuantity< BaseDimensionality > &rhs) noexcept
Comparison Operators.
Definition physicalQuantity.hpp:54
constexpr auto operator-(const PhysicalQuantity< BaseDimensionality > &rhs) const noexcept
Definition physicalQuantity.hpp:84
constexpr auto operator+=(const PhysicalQuantity< BaseDimensionality > &rhs) noexcept
Arithmetic Operators.
Definition physicalQuantity.hpp:67
constexpr friend std::ostream & operator<<(std::ostream &stream, const PhysicalQuantity< BaseDimensionality > &rhs)
Output Stream Operators.
Definition physicalQuantity.hpp:134
constexpr auto operator*(T rhs) const noexcept
Definition physicalQuantity.hpp:96
constexpr auto operator/=(T rhs) noexcept
Definition physicalQuantity.hpp:121
constexpr auto operator/(T rhs) const noexcept
Definition physicalQuantity.hpp:115
constexpr auto operator-=(const PhysicalQuantity< BaseDimensionality > &rhs) noexcept
Definition physicalQuantity.hpp:78
constexpr auto operator*=(const PhysicalQuantity< Dimensionality<> > &rhs) noexcept
Definition physicalQuantity.hpp:108
constexpr friend bool operator<(const PhysicalQuantity< BaseDimensionality > &lhs, const PhysicalQuantity< BaseDimensionality > &rhs) noexcept
Definition physicalQuantity.hpp:60
constexpr auto operator+(const PhysicalQuantity< BaseDimensionality > &rhs) const noexcept
Definition physicalQuantity.hpp:73
Definition basicMath.hpp:17
constexpr auto operator/(const PhysicalQuantity< Dimensionality< L1, M1, T1, I1, Th1, N1, J1 > > &lhs, const PhysicalQuantity< Dimensionality< L2, M2, T2, I2, Th2, N2, J2 > > &rhs) noexcept
Definition physicalQuantity.hpp:158
constexpr auto operator*(const PhysicalQuantity< Dimensionality< L1, M1, T1, I1, Th1, N1, J1 > > &lhs, const PhysicalQuantity< Dimensionality< L2, M2, T2, I2, Th2, N2, J2 > > &rhs) noexcept
Definition physicalQuantity.hpp:143
Definition dimensionality.hpp:27