Skip to content

Commit 490d18b

Browse files
committed
feat: representation concepts now detects nested quantity types
1 parent cdb228d commit 490d18b

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,16 +300,16 @@ template<typename T>
300300
concept NotQuantity = (!is_quantity_like<T>);
301301

302302
template<typename T>
303-
concept RealScalarRepresentation = NotQuantity<T> && RealScalar<T> && MagnitudeScalable<T>;
303+
concept RealScalarRepresentation = NotQuantity<value_type_t<T>> && RealScalar<T> && MagnitudeScalable<T>;
304304

305305
template<typename T>
306-
concept ComplexScalarRepresentation = NotQuantity<T> && ComplexScalar<T> && MagnitudeScalable<T>;
306+
concept ComplexScalarRepresentation = NotQuantity<value_type_t<T>> && ComplexScalar<T> && MagnitudeScalable<T>;
307307

308308
template<typename T>
309309
concept ScalarRepresentation = RealScalarRepresentation<T> || ComplexScalarRepresentation<T>;
310310

311311
template<typename T>
312-
concept VectorRepresentation = NotQuantity<T> && Vector<T> && MagnitudeScalable<T>;
312+
concept VectorRepresentation = NotQuantity<value_type_t<T>> && Vector<T> && MagnitudeScalable<T>;
313313

314314
// template<typename T>
315315
// concept TensorRepresentation = NotQuantity<T> && Tensor<T>;

test/static/concepts_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,21 +296,25 @@ static_assert(!ReferenceOf<decltype(dimensionless[one]), isq::rotation>);
296296
static_assert(!ReferenceOf<decltype(dimensionless[one]), isq::angular_measure>);
297297

298298
// RepresentationOf
299+
// int: real scalar and (as a degenerate 1D case) vector, but not complex/tensor
299300
static_assert(RepresentationOf<int, quantity_character::real_scalar>);
300301
static_assert(!RepresentationOf<int, quantity_character::complex_scalar>);
301302
static_assert(RepresentationOf<int, quantity_character::vector>);
302303
static_assert(!RepresentationOf<int, quantity_character::tensor>);
303304

305+
// double: same as int
304306
static_assert(RepresentationOf<double, quantity_character::real_scalar>);
305307
static_assert(!RepresentationOf<double, quantity_character::complex_scalar>);
306308
static_assert(RepresentationOf<double, quantity_character::vector>);
307309
static_assert(!RepresentationOf<double, quantity_character::tensor>);
308310

311+
// bool: disabled via disable_real<bool>
309312
static_assert(!RepresentationOf<bool, quantity_character::real_scalar>);
310313
static_assert(!RepresentationOf<bool, quantity_character::complex_scalar>);
311314
static_assert(!RepresentationOf<bool, quantity_character::vector>);
312315
static_assert(!RepresentationOf<bool, quantity_character::tensor>);
313316

317+
// non-numeric type: not a representation at all
314318
static_assert(!RepresentationOf<std::optional<int>, quantity_character::real_scalar>);
315319

316320
#if MP_UNITS_HOSTED
@@ -319,16 +323,31 @@ static_assert(RepresentationOf<std::complex<double>, quantity_character::complex
319323
static_assert(!RepresentationOf<std::complex<double>, quantity_character::vector>);
320324
static_assert(!RepresentationOf<std::complex<double>, quantity_character::tensor>);
321325

326+
// cartesian_vector<double>: 3D vector, not scalar
322327
static_assert(!RepresentationOf<cartesian_vector<double>, quantity_character::real_scalar>);
323328
static_assert(!RepresentationOf<cartesian_vector<double>, quantity_character::complex_scalar>);
324329
static_assert(RepresentationOf<cartesian_vector<double>, quantity_character::vector>);
325330
static_assert(!RepresentationOf<cartesian_vector<double>, quantity_character::tensor>);
326331

332+
// cartesian_vector<int>: integer element type is supported (norm() returns double via std::hypot)
333+
static_assert(!RepresentationOf<cartesian_vector<int>, quantity_character::real_scalar>);
334+
static_assert(!RepresentationOf<cartesian_vector<int>, quantity_character::complex_scalar>);
335+
static_assert(RepresentationOf<cartesian_vector<int>, quantity_character::vector>);
336+
static_assert(!RepresentationOf<cartesian_vector<int>, quantity_character::tensor>);
337+
338+
// cartesian_vector<complex<double>>: no hypot(complex,complex,complex) -> not a vector representation
327339
static_assert(!RepresentationOf<cartesian_vector<std::complex<double>>, quantity_character::real_scalar>);
328340
static_assert(!RepresentationOf<cartesian_vector<std::complex<double>>, quantity_character::complex_scalar>);
329341
static_assert(!RepresentationOf<cartesian_vector<std::complex<double>>, quantity_character::vector>);
330342
static_assert(!RepresentationOf<cartesian_vector<std::complex<double>>, quantity_character::tensor>);
331343

344+
// quantity types must never themselves be a representation (NotQuantity guard)
345+
static_assert(!RepresentationOf<quantity<si::metre>, quantity_character::real_scalar>);
346+
static_assert(!RepresentationOf<quantity<si::metre>, quantity_character::vector>);
347+
348+
// cartesian_vector whose element is a quantity must not be a representation
349+
static_assert(!RepresentationOf<cartesian_vector<quantity<si::metre>>, quantity_character::vector>);
350+
332351
static_assert(!RepresentationOf<std::chrono::seconds, quantity_character::real_scalar>);
333352
static_assert(!RepresentationOf<std::string, quantity_character::real_scalar>);
334353
#endif

0 commit comments

Comments
 (0)