diff --git a/src/include/units/bits/external/fixed_string.h b/src/include/units/bits/external/fixed_string.h index 6fb65749..7f47254f 100644 --- a/src/include/units/bits/external/fixed_string.h +++ b/src/include/units/bits/external/fixed_string.h @@ -51,6 +51,7 @@ struct basic_fixed_string { for (std::size_t i = 0; i < N; ++i) data_[i] = txt[i]; } + [[nodiscard]] constexpr bool empty() const noexcept { return N == 0; } [[nodiscard]] constexpr std::size_t size() const noexcept { return N; } [[nodiscard]] constexpr const CharT* data() const noexcept { return data_; } [[nodiscard]] constexpr const CharT* c_str() const noexcept { return data(); } diff --git a/src/include/units/one_rep.h b/src/include/units/one_rep.h index bbb306b9..aba4faa1 100644 --- a/src/include/units/one_rep.h +++ b/src/include/units/one_rep.h @@ -83,10 +83,9 @@ struct one_rep { [[nodiscard]] friend constexpr Rep operator/(one_rep, const Rep&) = delete; template - requires requires { quantity_values::one(); requires !Quantity && // TODO: Replace with `QuantityValue` - !QuantityLike && // when Clang catches up. - !wrapped_quantity_; } - [[nodiscard]] constexpr operator Rep() const noexcept + requires requires { quantity_values::one(); } && + (!Quantity && !QuantityLike && !wrapped_quantity_) // TODO: Replace with `QuantityValue` + [[nodiscard]] constexpr operator Rep() const noexcept // when Clang catches up. { return quantity_values::one(); } diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index fa0c8314..659b7f63 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -269,30 +269,30 @@ public: // Below friend functions are to be found via argument-dependent lookup only template [[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const Value& rhs) - requires requires { requires !Quantity; requires is_same_v; - requires invoke_result_convertible_to_, rep, Value>; } + requires requires { requires !Quantity; requires is_same_v; // TODO: Simplify + requires invoke_result_convertible_to_, rep, Value>; } // when Clang catches up. { return units::quantity(lhs.count() + rhs); } template [[nodiscard]] friend constexpr Quantity auto operator+(const Value& lhs, const quantity& rhs) - requires requires { requires !Quantity; requires is_same_v; - requires invoke_result_convertible_to_, Value, rep>; } + requires requires { requires !Quantity; requires is_same_v; // TODO: Simplify + requires invoke_result_convertible_to_, Value, rep>; } // when Clang catches up. { return units::quantity(lhs + rhs.count()); } template [[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const Value& rhs) - requires requires { requires !Quantity; requires is_same_v; - requires invoke_result_convertible_to_, rep, Value>; } + requires requires { requires !Quantity; requires is_same_v; // TODO: Simplify + requires invoke_result_convertible_to_, rep, Value>; } // when Clang catches up. { return units::quantity(lhs.count() - rhs); } template [[nodiscard]] friend constexpr Quantity auto operator-(const Value& lhs, const quantity& rhs) - requires requires { requires !Quantity; requires is_same_v; - requires invoke_result_convertible_to_, Value, rep>; } + requires requires { requires !Quantity; requires is_same_v; // TODO: Simplify + requires invoke_result_convertible_to_, Value, rep>; } // when Clang catches up. { return units::quantity(lhs - rhs.count()); } diff --git a/src/include/units/quantity_cast.h b/src/include/units/quantity_cast.h index d8bc39e5..2ca6f254 100644 --- a/src/include/units/quantity_cast.h +++ b/src/include/units/quantity_cast.h @@ -290,7 +290,7 @@ template requires requires { requires is_specialization_of; requires requires { quantity_cast(qk.common()); }; } || requires { requires Kind; requires UnitOf; } || - requires { quantity_cast(qk.common()); } + requires { quantity_cast(qk.common()); } // TODO: Simplify when Clang catches up. { if constexpr (is_specialization_of) return CastSpec(quantity_cast(qk.common())); @@ -349,7 +349,7 @@ template requires requires { requires is_specialization_of; requires requires { quantity_kind_cast(qpk.relative()); }; } || requires { requires PointKind && UnitOf; } || - requires { quantity_kind_cast(qpk.relative()); } + requires { quantity_kind_cast(qpk.relative()); } // TODO: Simplify when Clang catches up. { if constexpr (is_specialization_of) return CastSpec(quantity_kind_cast(qpk.relative())); diff --git a/src/include/units/quantity_io.h b/src/include/units/quantity_io.h index 70290bd2..8c47af26 100644 --- a/src/include/units/quantity_io.h +++ b/src/include/units/quantity_io.h @@ -36,7 +36,7 @@ void to_stream(std::basic_ostream& os, const quantity& { os << q.count(); constexpr auto symbol = detail::unit_text(); - if constexpr (bool(symbol.standard().size())) { + if constexpr (!symbol.standard().empty()) { os << " " << symbol.standard(); } }