Skip to content

Commit 01c3282

Browse files
committed
perf: get_unit made Hidden Friend
1 parent d945f41 commit 01c3282

File tree

5 files changed

+43
-49
lines changed

5 files changed

+43
-49
lines changed

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

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,8 @@ template<typename T, typename Rep>
115115
concept ScalarValuePreservingTo = (!Quantity<T>) && Scalar<T> && is_value_preserving<T, Rep>;
116116

117117
template<auto R>
118-
concept UnitOne =
119-
Reference<MP_UNITS_REMOVE_CONST(decltype(R))> &&
120-
(equivalent(mp_units::get_unit(R), one) && detail::get_associated_quantity(mp_units::get_unit(R)) == dimensionless);
118+
concept UnitOne = Reference<MP_UNITS_REMOVE_CONST(decltype(R))> &&
119+
(equivalent(get_unit(R), one) && detail::get_associated_quantity(get_unit(R)) == dimensionless);
121120

122121
template<auto R>
123122
concept ExplicitFromNumber =
@@ -188,7 +187,7 @@ class quantity {
188187
static constexpr Reference auto reference = R;
189188
static constexpr QuantitySpec auto quantity_spec = mp_units::get_quantity_spec(reference);
190189
static constexpr Dimension auto dimension = quantity_spec.dimension;
191-
static constexpr Unit auto unit = mp_units::get_unit(reference);
190+
static constexpr Unit auto unit = get_unit(reference);
192191
using rep = Rep;
193192

194193
// static member functions
@@ -214,13 +213,13 @@ class quantity {
214213
quantity() = default;
215214

216215
template<Reference R2>
217-
requires(equivalent(unit, mp_units::get_unit(R2{})))
216+
requires(equivalent(unit, get_unit(R2{})))
218217
constexpr quantity(rep val, R2) : numerical_value_is_an_implementation_detail_(std::move(val))
219218
{
220219
}
221220

222221
template<typename Value, Reference R2>
223-
requires(equivalent(unit, mp_units::get_unit(R2{}))) && (!detail::ValuePreservingConstruction<rep, Value>)
222+
requires(equivalent(unit, get_unit(R2{}))) && (!detail::ValuePreservingConstruction<rep, Value>)
224223
constexpr quantity(Value val, R2)
225224
#if __cpp_deleted_function
226225
= delete("Conversion is not value-preserving");
@@ -229,7 +228,7 @@ class quantity {
229228
#endif
230229

231230
template<typename FwdValue, Reference R2>
232-
requires(!equivalent(unit, mp_units::get_unit(R2{}))) &&
231+
requires(!equivalent(unit, get_unit(R2{}))) &&
233232
detail::QuantityConstructibleFrom<quantity, quantity<R2{}, std::remove_cvref_t<FwdValue>>>
234233
constexpr quantity(FwdValue&& val, R2) : quantity(::mp_units::quantity{std::forward<FwdValue>(val), R2{}})
235234
{
@@ -259,8 +258,7 @@ class quantity {
259258
#endif
260259

261260
template<auto R2, typename Rep2>
262-
requires detail::QuantityConstructibleFrom<quantity, quantity<R2, Rep2>> &&
263-
(equivalent(unit, mp_units::get_unit(R2)))
261+
requires detail::QuantityConstructibleFrom<quantity, quantity<R2, Rep2>> && (equivalent(unit, get_unit(R2)))
264262
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
265263
constexpr explicit(!mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec) ||
266264
!std::convertible_to<Rep2, rep>) quantity(const quantity<R2, Rep2>& q) :
@@ -269,8 +267,7 @@ class quantity {
269267
}
270268

271269
template<auto R2, typename Rep2>
272-
requires detail::QuantityConstructibleFrom<quantity, quantity<R2, Rep2>> &&
273-
(!equivalent(unit, mp_units::get_unit(R2)))
270+
requires detail::QuantityConstructibleFrom<quantity, quantity<R2, Rep2>> && (!equivalent(unit, get_unit(R2)))
274271
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
275272
constexpr explicit(!mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec) ||
276273
!std::convertible_to<Rep2, rep>) quantity(const quantity<R2, Rep2>& q) :
@@ -394,7 +391,7 @@ class quantity {
394391
std::is_nothrow_copy_constructible_v<rep>)
395392
{
396393
return quantity_like_traits<Q>::from_numerical_value(
397-
numerical_value_in(mp_units::get_unit(quantity_like_traits<Q>::reference)));
394+
numerical_value_in(get_unit(quantity_like_traits<Q>::reference)));
398395
}
399396

400397
// member unary operators
@@ -451,13 +448,12 @@ class quantity {
451448
// compound assignment operators
452449
template<auto R2, typename Rep2>
453450
requires(mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec)) &&
454-
detail::ValuePreservingConversion<mp_units::get_unit(R2), Rep2, unit, rep> &&
455-
requires(rep& a, const Rep2 b) {
451+
detail::ValuePreservingConversion<get_unit(R2), Rep2, unit, rep> && requires(rep& a, const Rep2 b) {
456452
{ a += b } -> std::same_as<rep&>;
457453
}
458454
constexpr quantity& operator+=(const quantity<R2, Rep2>& other) &
459455
{
460-
if constexpr (equivalent(unit, mp_units::get_unit(R2)))
456+
if constexpr (equivalent(unit, get_unit(R2)))
461457
numerical_value_is_an_implementation_detail_ += other.numerical_value_is_an_implementation_detail_;
462458
else
463459
numerical_value_is_an_implementation_detail_ += other.in(unit).numerical_value_is_an_implementation_detail_;
@@ -466,13 +462,12 @@ class quantity {
466462

467463
template<auto R2, typename Rep2>
468464
requires(mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec)) &&
469-
detail::ValuePreservingConversion<mp_units::get_unit(R2), Rep2, unit, rep> &&
470-
requires(rep& a, const Rep2 b) {
465+
detail::ValuePreservingConversion<get_unit(R2), Rep2, unit, rep> && requires(rep& a, const Rep2 b) {
471466
{ a -= b } -> std::same_as<rep&>;
472467
}
473468
constexpr quantity& operator-=(const quantity<R2, Rep2>& other) &
474469
{
475-
if constexpr (equivalent(unit, mp_units::get_unit(R2)))
470+
if constexpr (equivalent(unit, get_unit(R2)))
476471
numerical_value_is_an_implementation_detail_ -= other.numerical_value_is_an_implementation_detail_;
477472
else
478473
numerical_value_is_an_implementation_detail_ -= other.in(unit).numerical_value_is_an_implementation_detail_;
@@ -482,14 +477,13 @@ class quantity {
482477
template<auto R2, typename Rep2>
483478
requires(!treat_as_floating_point<rep>) &&
484479
(mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec)) &&
485-
detail::ValuePreservingConversion<mp_units::get_unit(R2), Rep2, unit, rep> &&
486-
requires(rep& a, const Rep2 b) {
480+
detail::ValuePreservingConversion<get_unit(R2), Rep2, unit, rep> && requires(rep& a, const Rep2 b) {
487481
{ a %= b } -> std::same_as<rep&>;
488482
}
489483
constexpr quantity& operator%=(const quantity<R2, Rep2>& other) &
490484
{
491485
MP_UNITS_EXPECTS_DEBUG(other != 0);
492-
if constexpr (equivalent(unit, mp_units::get_unit(R2)))
486+
if constexpr (equivalent(unit, get_unit(R2)))
493487
numerical_value_is_an_implementation_detail_ %= other.numerical_value_is_an_implementation_detail_;
494488
else
495489
numerical_value_is_an_implementation_detail_ %= other.in(unit).numerical_value_is_an_implementation_detail_;
@@ -744,7 +738,7 @@ std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>&
744738
oss << +q.numerical_value_ref_in(q.unit);
745739
else
746740
oss << q.numerical_value_ref_in(q.unit);
747-
if constexpr (space_before_unit_symbol<mp_units::get_unit(R)>) oss << " ";
741+
if constexpr (space_before_unit_symbol<get_unit(R)>) oss << " ";
748742
oss << q.unit;
749743
});
750744
}
@@ -780,8 +774,8 @@ template<auto R1, typename Rep1, auto R2, typename Rep2>
780774
requires requires {
781775
{ mp_units::get_common_reference(R1, R2) } -> mp_units::Reference;
782776
typename std::common_type_t<Rep1, Rep2>;
783-
requires(!mp_units::detail::overflows_non_zero_common_values<std::common_type_t<Rep1, Rep2>>(
784-
mp_units::get_unit(R1), mp_units::get_unit(R2)));
777+
requires(
778+
!mp_units::detail::overflows_non_zero_common_values<std::common_type_t<Rep1, Rep2>>(get_unit(R1), get_unit(R2)));
785779
requires mp_units::RepresentationOf<std::common_type_t<Rep1, Rep2>,
786780
mp_units::get_common_quantity_spec(mp_units::get_quantity_spec(R1),
787781
mp_units::get_quantity_spec(R2))>;
@@ -884,7 +878,7 @@ template<auto Reference, typename Char, std::formattable<Char> Rep>
884878
template<auto Reference, typename Rep, typename Char>
885879
#endif
886880
class MP_UNITS_STD_FMT::formatter<mp_units::quantity<Reference, Rep>, Char> {
887-
static constexpr auto unit = mp_units::get_unit(Reference);
881+
static constexpr auto unit = get_unit(Reference);
888882
static constexpr auto dimension = mp_units::get_quantity_spec(Reference).dimension;
889883

890884
using quantity_t = mp_units::quantity<Reference, Rep>;

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ constexpr bool is_specialization_of_zeroth_point_origin<zeroth_point_origin_<QS>
151151
MP_UNITS_EXPORT template<Reference R>
152152
[[nodiscard]] consteval PointOriginFor<mp_units::get_quantity_spec(R{})> auto default_point_origin(R)
153153
{
154-
if constexpr (requires { mp_units::get_unit(R{})._point_origin_; })
155-
return mp_units::get_unit(R{})._point_origin_;
154+
if constexpr (requires { get_unit(R{})._point_origin_; })
155+
return get_unit(R{})._point_origin_;
156156
else
157157
return zeroth_point_origin<mp_units::get_quantity_spec(R{})>;
158158
}
@@ -189,7 +189,7 @@ class quantity_point {
189189
static constexpr Reference auto reference = R;
190190
static constexpr QuantitySpec auto quantity_spec = mp_units::get_quantity_spec(reference);
191191
static constexpr Dimension auto dimension = quantity_spec.dimension;
192-
static constexpr Unit auto unit = mp_units::get_unit(reference);
192+
static constexpr Unit auto unit = get_unit(reference);
193193
static constexpr PointOrigin auto absolute_point_origin = detail::get_absolute_point_origin(PO);
194194
static constexpr PointOrigin auto point_origin = PO;
195195
using rep = Rep;
@@ -259,7 +259,7 @@ class quantity_point {
259259
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
260260
quantity_point(const QP& qp) :
261261
quantity_from_origin_is_an_implementation_detail_(quantity_point_like_traits<QP>::to_numerical_value(qp),
262-
mp_units::get_unit(quantity_point_like_traits<QP>::reference))
262+
get_unit(quantity_point_like_traits<QP>::reference))
263263
{
264264
}
265265

@@ -434,7 +434,7 @@ class quantity_point {
434434
// compound assignment operators
435435
template<auto R2, typename Rep2>
436436
requires(mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec)) &&
437-
detail::ValuePreservingConversion<mp_units::get_unit(R2), Rep2, unit, rep> &&
437+
detail::ValuePreservingConversion<get_unit(R2), Rep2, unit, rep> &&
438438
requires(const quantity_type q) { quantity_from_origin_is_an_implementation_detail_ += q; }
439439
constexpr quantity_point& operator+=(const quantity<R2, Rep2>& q) &
440440
{
@@ -444,7 +444,7 @@ class quantity_point {
444444

445445
template<auto R2, typename Rep2>
446446
requires(mp_units::implicitly_convertible(mp_units::get_quantity_spec(R2), quantity_spec)) &&
447-
detail::ValuePreservingConversion<mp_units::get_unit(R2), Rep2, unit, rep> &&
447+
detail::ValuePreservingConversion<get_unit(R2), Rep2, unit, rep> &&
448448
requires(const quantity_type q) { quantity_from_origin_is_an_implementation_detail_ -= q; }
449449
constexpr quantity_point& operator-=(const quantity<R2, Rep2>& q) &
450450
{

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ template<Unit U>
7676
*/
7777
template<QuantitySpec Q, Unit U>
7878
struct reference {
79+
[[nodiscard]] friend consteval Unit auto get_unit(reference) { return U{}; }
80+
7981
template<typename Q2, typename U2>
8082
[[nodiscard]] friend consteval bool operator==(reference, reference<Q2, U2>)
8183
{
@@ -194,23 +196,23 @@ struct reference {
194196

195197
template<typename FwdRep, Reference R,
196198
RepresentationOf<mp_units::get_quantity_spec(R{})> Rep = std::remove_cvref_t<FwdRep>>
197-
requires(!detail::OffsetUnit<decltype(mp_units::get_unit(R{}))>)
199+
requires(!detail::OffsetUnit<decltype(get_unit(R{}))>)
198200
[[nodiscard]] constexpr quantity<R{}, Rep> operator*(FwdRep&& lhs, R r)
199201
{
200202
return quantity{std::forward<FwdRep>(lhs), r};
201203
}
202204

203205
template<typename FwdRep, Reference R,
204206
RepresentationOf<mp_units::get_quantity_spec(R{})> Rep = std::remove_cvref_t<FwdRep>>
205-
requires(!detail::OffsetUnit<decltype(mp_units::get_unit(R{}))>)
207+
requires(!detail::OffsetUnit<decltype(get_unit(R{}))>)
206208
[[nodiscard]] constexpr Quantity auto operator/(FwdRep&& lhs, R)
207209
{
208210
return quantity{std::forward<FwdRep>(lhs), inverse(R{})};
209211
}
210212

211213
template<typename FwdRep, Reference R,
212214
RepresentationOf<mp_units::get_quantity_spec(R{})> Rep = std::remove_cvref_t<FwdRep>>
213-
requires detail::OffsetUnit<decltype(mp_units::get_unit(R{}))>
215+
requires detail::OffsetUnit<decltype(get_unit(R{}))>
214216
[[deprecated(
215217
"2.3.0: References using offset units (e.g., temperatures) should be constructed with the `delta` or `point` "
216218
"helpers")]] constexpr auto
@@ -221,7 +223,7 @@ operator*(FwdRep&& lhs, R r)
221223

222224
template<typename FwdRep, Reference R,
223225
RepresentationOf<mp_units::get_quantity_spec(R{})> Rep = std::remove_cvref_t<FwdRep>>
224-
requires detail::OffsetUnit<decltype(mp_units::get_unit(R{}))>
226+
requires detail::OffsetUnit<decltype(get_unit(R{}))>
225227
[[deprecated(
226228
"2.3.0: References using offset units (e.g., temperatures) should be constructed with the `delta` or `point` "
227229
"helpers")]] constexpr auto
@@ -285,15 +287,15 @@ constexpr auto operator/(R, Q&& q) = delete;
285287
template<Reference R1, Reference R2, Reference... Rest>
286288
[[nodiscard]] consteval Reference auto get_common_reference(R1 r1, R2 r2, Rest... rest)
287289
requires(!(Unit<R1> && Unit<R2> && (... && Unit<Rest>))) && requires {
288-
mp_units::get_common_quantity_spec(mp_units::get_quantity_spec(r1), mp_units::get_quantity_spec(r2),
290+
mp_units::get_common_quantity_spec(get_quantity_spec(r1), mp_units::get_quantity_spec(r2),
289291
mp_units::get_quantity_spec(rest)...);
290-
mp_units::get_common_unit(mp_units::get_unit(r1), mp_units::get_unit(r2), mp_units::get_unit(rest)...);
292+
mp_units::get_common_unit(get_unit(r1), get_unit(r2), get_unit(rest)...);
291293
}
292294
{
293-
return detail::reference_t<
294-
mp_units::get_common_quantity_spec(mp_units::get_quantity_spec(R1{}), mp_units::get_quantity_spec(R2{}),
295-
mp_units::get_quantity_spec(rest)...),
296-
mp_units::get_common_unit(mp_units::get_unit(R1{}), mp_units::get_unit(R2{}), mp_units::get_unit(rest)...)>{};
295+
return detail::reference_t<mp_units::get_common_quantity_spec(mp_units::get_quantity_spec(R1{}),
296+
mp_units::get_quantity_spec(R2{}),
297+
mp_units::get_quantity_spec(rest)...),
298+
mp_units::get_common_unit(get_unit(R1{}), get_unit(R2{}), get_unit(rest)...)>{};
297299
}
298300

299301
MP_UNITS_EXPORT_END

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@ template<typename Q, typename U>
4444
return Q{};
4545
}
4646

47-
[[nodiscard]] consteval Unit auto get_unit(Unit auto u) { return u; }
48-
49-
template<typename Q, typename U>
50-
[[nodiscard]] consteval Unit auto get_unit(reference<Q, U>)
51-
{
52-
return U{};
53-
}
54-
5547
/**
5648
* @brief A concept matching all references in the library.
5749
*

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ struct unit_interface {
224224
return lhs_canonical.mag == rhs_canonical.mag && lhs_canonical.reference_unit == rhs_canonical.reference_unit;
225225
}
226226
}
227+
228+
template<Unit Self>
229+
[[nodiscard]] friend consteval Self get_unit(Self self)
230+
{
231+
return self;
232+
}
227233
};
228234

229235
template<Unit U, bool = requires { U::_point_origin_; }>

0 commit comments

Comments
 (0)