@@ -121,7 +121,7 @@ template <typename Q> using Named = typename LookupName<Q>::Named;
121
121
template <typename Mass = std::ratio<0 >, typename Length = std::ratio<0 >, typename Time = std::ratio<0 >,
122
122
typename Current = std::ratio<0 >, typename Angle = std::ratio<0 >, typename Temperature = std::ratio<0 >,
123
123
typename Luminosity = std::ratio<0 >, typename Moles = std::ratio<0 >>
124
- void quantityChecker (Quantity<Mass, Length, Time, Current, Angle, Temperature, Luminosity, Moles> q ) {}
124
+ void quantityChecker (Quantity<Mass, Length, Time, Current, Angle, Temperature, Luminosity, Moles>) {}
125
125
126
126
// isQuantity concept
127
127
template <typename Q>
@@ -164,6 +164,47 @@ template <isQuantity Q, typename quotient> using Rooted = Named<
164
164
std::ratio_divide<typename Q::angle, quotient>, std::ratio_divide<typename Q::temperature, quotient>,
165
165
std::ratio_divide<typename Q::luminosity, quotient>, std::ratio_divide<typename Q::moles, quotient>>>;
166
166
167
+ template <isQuantity Q> inline std::ostream& operator <<(std::ostream& os, const Q& quantity) {
168
+ if constexpr (!std::is_same_v<Named<Q>, Q>) {
169
+ os << Named<Q>(quantity);
170
+ } else {
171
+ os << quantity.internal ();
172
+ if constexpr (Q::mass::num != 0 ) {
173
+ os << " kg^" << Q::mass::num;
174
+ if constexpr (Q::mass::den != 1 ) os << " /" << Q::mass::den;
175
+ }
176
+ if constexpr (Q::length::num != 0 ) {
177
+ os << " *m^" << Q::length::num;
178
+ if constexpr (Q::length::den != 1 ) os << " /" << Q::length::den;
179
+ }
180
+ if constexpr (Q::time::num != 0 ) {
181
+ os << " *s^" << Q::time::num;
182
+ if constexpr (Q::time::den != 1 ) os << " /" << Q::time::den;
183
+ }
184
+ if constexpr (Q::current::num != 0 ) {
185
+ os << " *A^" << Q::current::num;
186
+ if constexpr (Q::current::den != 1 ) os << " /" << Q::current::den;
187
+ }
188
+ if constexpr (Q::angle::num != 0 ) {
189
+ os << " *rad^" << Q::angle::num;
190
+ if constexpr (Q::angle::den != 1 ) os << " /" << Q::angle::den;
191
+ }
192
+ if constexpr (Q::temperature::num != 0 ) {
193
+ os << " *K^" << Q::temperature::num;
194
+ if constexpr (Q::temperature::den != 1 ) os << " /" << Q::temperature::den;
195
+ }
196
+ if constexpr (Q::luminosity::num != 0 ) {
197
+ os << " *cd^" << Q::luminosity::num;
198
+ if constexpr (Q::luminosity::den != 1 ) os << " /" << Q::luminosity::den;
199
+ }
200
+ if constexpr (Q::moles::num != 0 ) {
201
+ os << " *mol^" << Q::moles::num;
202
+ if constexpr (Q::moles::den != 1 ) os << " /" << Q::moles::den;
203
+ }
204
+ }
205
+ return os;
206
+ }
207
+
167
208
template <isQuantity Q, isQuantity R> constexpr Q operator +(Q lhs, R rhs)
168
209
requires Isomorphic<Q, R>
169
210
{
@@ -243,7 +284,7 @@ template <isQuantity Q, isQuantity R> constexpr bool operator>(const Q& lhs, con
243
284
std::ratio<o>, std::ratio<j>, std::ratio<n>>> { \
244
285
using Named = Name; \
245
286
}; \
246
- constexpr Name suffix = Name(1.0 ); \
287
+ [[maybe_unused]] constexpr Name suffix = Name(1.0 ); \
247
288
constexpr Name operator " " _##suffix(long double value) { \
248
289
return Name (Quantity<std::ratio<m>, std::ratio<l>, std::ratio<t>, std::ratio<i>, std::ratio<a>, std::ratio<o>, \
249
290
std::ratio<j>, std::ratio<n>>(static_cast <double >(value))); \
@@ -253,14 +294,14 @@ template <isQuantity Q, isQuantity R> constexpr bool operator>(const Q& lhs, con
253
294
std::ratio<j>, std::ratio<n>>(static_cast <double >(value))); \
254
295
} \
255
296
inline std::ostream& operator <<(std::ostream& os, const Name& quantity) { \
256
- os << quantity.internal () << " _ " << #suffix; \
297
+ os << quantity.internal () << " " << #suffix; \
257
298
return os; \
258
299
} \
259
300
constexpr inline Name from_##suffix(double value) { return Name (value); } \
260
301
constexpr inline double to_##suffix(Name quantity) { return quantity.internal (); }
261
302
262
303
#define NEW_UNIT_LITERAL (Name, suffix, multiple ) \
263
- constexpr Name suffix = multiple; \
304
+ [[maybe_unused]] constexpr Name suffix = multiple; \
264
305
constexpr Name operator " " _##suffix(long double value) { return static_cast <double >(value) * multiple; } \
265
306
constexpr Name operator " " _##suffix(unsigned long long value) { return static_cast <double >(value) * multiple; } \
266
307
constexpr inline Name from_##suffix(double value) { return value * multiple; } \
0 commit comments