Skip to content

Commit 86e3bf5

Browse files
committed
fix: recursive concepts evaluation fixed
Resolves #740
1 parent 61d9a20 commit 86e3bf5

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

src/core/include/mp-units/framework/representation_concepts.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void real() = delete; // poison pill
118118

119119
struct real_t {
120120
// TODO how to constrain the return with RealScalar?
121-
[[nodiscard]] constexpr auto operator()(const WeaklyRegular auto& clx) const
121+
[[nodiscard]] constexpr auto operator()(const auto& clx) const
122122
requires requires { clx.real(); } || requires { real(clx); }
123123
{
124124
if constexpr (requires { clx.real(); })
@@ -142,7 +142,7 @@ void imag() = delete; // poison pill
142142

143143
struct imag_t {
144144
// TODO how to constrain the return with RealScalar?
145-
[[nodiscard]] constexpr auto operator()(const WeaklyRegular auto& clx) const
145+
[[nodiscard]] constexpr auto operator()(const auto& clx) const
146146
requires requires { clx.imag(); } || requires { imag(clx); }
147147
{
148148
if constexpr (requires { clx.imag(); })
@@ -167,7 +167,7 @@ void abs() = delete; // poison pill
167167

168168
struct modulus_t {
169169
// TODO how to constrain the return with RealScalar?
170-
[[nodiscard]] constexpr auto operator()(const WeaklyRegular auto& clx) const
170+
[[nodiscard]] constexpr auto operator()(const auto& clx) const
171171
requires requires { clx.modulus(); } || requires { modulus(clx); } || requires { clx.abs(); } ||
172172
requires { abs(clx); }
173173
{
@@ -216,7 +216,7 @@ void magnitude() = delete; // poison pill
216216
void abs() = delete; // poison pill
217217

218218
struct magnitude_t {
219-
template<WeaklyRegular T>
219+
template<typename T>
220220
[[nodiscard]] constexpr Scalar auto operator()(const T& vec) const
221221
requires requires { vec.magnitude(); } || requires { magnitude(vec); } ||
222222
(RealScalar<T> && (std::is_arithmetic_v<T> || requires { vec.abs(); } || requires { abs(vec); }))

test/static/quantity_test.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import std;
3838
#include <concepts>
3939
#include <cstdint>
4040
#include <limits>
41+
#include <optional>
4142
#include <type_traits>
4243
#include <utility>
4344
#if MP_UNITS_HOSTED
@@ -1406,4 +1407,14 @@ concept overflowing_unit_conversion = requires {
14061407
};
14071408
static_assert(overflowing_unit_conversion<std::int8_t(1) * km>);
14081409

1410+
// std::optional
1411+
static_assert(
1412+
std::equality_comparable_with<std::optional<quantity<isq::length[m], int>>, quantity<isq::length[m], int>>);
1413+
#if MP_UNITS_HOSTED
1414+
static_assert(std::equality_comparable_with<std::optional<quantity<si::volt, std::complex<double>>>,
1415+
quantity<si::volt, std::complex<double>>>);
1416+
static_assert(std::equality_comparable_with<std::optional<quantity<si::metre, cartesian_vector<double>>>,
1417+
quantity<si::metre, cartesian_vector<double>>>);
1418+
#endif
1419+
14091420
} // namespace

0 commit comments

Comments
 (0)