@@ -389,13 +389,19 @@ concept compatible_with_default = D::template is_compatible_value<V>;
389
389
template <typename Name, typename T = std::uint32_t , auto ... Ats>
390
390
struct field_id_t {};
391
391
392
+ template <at... Ats> struct sort_key_t {
393
+ constexpr static auto sort_key = std::min({Ats.sort_key ()...});
394
+ };
395
+ template <> struct sort_key_t <> {};
396
+
392
397
template <typename Name, typename T = std::uint32_t ,
393
398
typename Default = detail::with_default<T>,
394
399
match::matcher M = match::always_t , at... Ats>
395
400
requires std::is_trivially_copyable_v<T>
396
401
class field_t : public field_spec_t <Name, T, detail::field_size<Ats...>>,
397
402
public detail::locator_for<Ats...>,
398
- public Default {
403
+ public Default,
404
+ public sort_key_t <Ats...> {
399
405
using spec_t = field_spec_t <Name, T, detail::field_size<Ats...>>;
400
406
using locator_t = detail::locator_for<Ats...>;
401
407
@@ -412,7 +418,6 @@ class field_t : public field_spec_t<Name, T, detail::field_size<Ats...>>,
412
418
using field_id = field_id_t <Name, T, Ats...>;
413
419
using value_type = T;
414
420
using matcher_t = M;
415
- constexpr static auto sort_key = std::min({Ats.sort_key ()...});
416
421
417
422
template <stdx::range R>
418
423
[[nodiscard]] constexpr static auto extract (R &&r) -> value_type {
@@ -511,6 +516,12 @@ class field_t : public field_spec_t<Name, T, detail::field_size<Ats...>>,
511
516
using shifted_by =
512
517
field_t <Name, T, Default, M, Ats.shifted_by(unit_bit_size<Unit>(N))...>;
513
518
519
+ template <at... NewAts>
520
+ using located = field_t <Name, T, Default, M, NewAts...>;
521
+
522
+ constexpr static auto bitsize = sizeof (T) * CHAR_BIT;
523
+ using default_located = located<at{msb_t {bitsize - 1 }, lsb_t {}}>;
524
+
514
525
// ======================================================================
515
526
// legacy aliases
516
527
template <typename X> using WithMatch = with_matcher<X>;
@@ -527,13 +538,7 @@ class field_t : public field_spec_t<Name, T, detail::field_size<Ats...>>,
527
538
template <stdx::ct_string Name, typename T = std::uint32_t ,
528
539
typename Default = detail::with_default<T>,
529
540
match::matcher M = match::always_t >
530
- struct field {
531
- template <at... Ats>
532
- using located = detail::field_t <
533
- decltype (stdx::ct_string_to_type<Name, sc::string_constant>()), T,
534
- Default, M, Ats...>;
535
-
536
- constexpr static auto bitsize = sizeof (T) * CHAR_BIT;
537
- using default_located = located<at{msb_t {bitsize - 1 }, lsb_t {}}>;
538
- };
541
+ using field = detail::field_t <
542
+ decltype (stdx::ct_string_to_type<Name, sc::string_constant>()), T, Default,
543
+ M>;
539
544
} // namespace msg
0 commit comments