@@ -399,79 +399,6 @@ namespace glz::detail
399
399
}
400
400
}
401
401
402
- namespace glz ::detail
403
- {
404
- template <class T , size_t I>
405
- constexpr auto key_value = pair<sv, value_variant_t <T>>{reflect<T>::keys[I], get<I>(reflect<T>::values)};
406
-
407
- template <class T , size_t I>
408
- constexpr sv key_v = reflect<T>::keys[I];
409
-
410
- template <class T , bool use_hash_comparison, size_t ... I>
411
- constexpr auto make_map_impl (std::index_sequence<I...>)
412
- {
413
- using value_t = value_variant_t <T>;
414
- constexpr auto n = reflect<T>::size;
415
-
416
- if constexpr (n == 0 ) {
417
- return nullptr ; // Hack to fix MSVC
418
- // static_assert(false_v<T>, "Empty object map is illogical. Handle empty upstream.");
419
- }
420
- else if constexpr (n == 1 ) {
421
- return micro_map1<value_t , key_v<T, I>...>{key_value<T, I>...};
422
- }
423
- else if constexpr (n == 2 ) {
424
- return micro_map2<value_t , key_v<T, I>...>{key_value<T, I>...};
425
- }
426
- else if constexpr (n < 64 ) // don't even attempt a first character hash if we have too many keys
427
- {
428
- constexpr auto & keys = reflect<T>::keys;
429
- constexpr auto front_desc = single_char_hash<n>(keys);
430
-
431
- if constexpr (front_desc.valid ) {
432
- return make_single_char_map<value_t , front_desc>({key_value<T, I>...});
433
- }
434
- else {
435
- constexpr single_char_hash_opts rear_hash{.is_front_hash = false };
436
- constexpr auto back_desc = single_char_hash<n, rear_hash>(keys);
437
-
438
- if constexpr (back_desc.valid ) {
439
- return make_single_char_map<value_t , back_desc>({key_value<T, I>...});
440
- }
441
- else {
442
- constexpr single_char_hash_opts sum_hash{.is_front_hash = true , .is_sum_hash = true };
443
- constexpr auto sum_desc = single_char_hash<n, sum_hash>(keys);
444
-
445
- if constexpr (sum_desc.valid ) {
446
- return make_single_char_map<value_t , sum_desc>({key_value<T, I>...});
447
- }
448
- else {
449
- if constexpr (n <= naive_map_max_size) {
450
- constexpr auto naive_desc = naive_map_hash<use_hash_comparison, n>(keys);
451
- return glz::detail::make_naive_map<value_t , naive_desc>(std::array{key_value<T, I>...});
452
- }
453
- else {
454
- return glz::detail::normal_map<sv, value_t , n, use_hash_comparison>(
455
- std::array{key_value<T, I>...});
456
- }
457
- }
458
- }
459
- }
460
- }
461
- else {
462
- return glz::detail::normal_map<sv, value_t , n, use_hash_comparison>(std::array{key_value<T, I>...});
463
- }
464
- }
465
-
466
- template <class T , bool use_hash_comparison = false >
467
- requires (!reflectable<T>)
468
- constexpr auto make_map ()
469
- {
470
- constexpr auto indices = std::make_index_sequence<reflect<T>::size>{};
471
- return make_map_impl<decay_keep_volatile_t <T>, use_hash_comparison>(indices);
472
- }
473
- }
474
-
475
402
namespace glz
476
403
{
477
404
template <auto Enum>
@@ -552,93 +479,6 @@ namespace glz
552
479
// add the folllwing constructor to your type:
553
480
// my_struct(glz::make_reflectable) {}
554
481
using make_reflectable = std::initializer_list<dummy>;
555
-
556
- namespace detail
557
- {
558
- template <class Tuple >
559
- using reflection_value_tuple_variant_t = typename tuple_ptr_variant<Tuple>::type;
560
-
561
- template <class T , size_t I>
562
- struct named_member
563
- {
564
- static constexpr sv value = glz::get<I>(member_names<T>);
565
- };
566
-
567
- template <class T , bool use_hash_comparison, size_t ... I>
568
- constexpr auto make_reflection_map_impl (std::index_sequence<I...>)
569
- {
570
- using V = decltype (to_tuple (std::declval<T>()));
571
- constexpr auto n = glz::tuple_size_v<V>;
572
- constexpr auto members = member_names<T>;
573
- static_assert (members.size () == n);
574
-
575
- using value_t = reflection_value_tuple_variant_t <V>;
576
-
577
- if constexpr (n == 0 ) {
578
- return nullptr ; // Hack to fix MSVC
579
- // static_assert(false_v<T>, "Empty object map is illogical. Handle empty upstream.");
580
- }
581
- else if constexpr (n == 1 ) {
582
- return micro_map1<value_t , named_member<T, I>::value...>{
583
- pair<sv, value_t >{glz::get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...};
584
- }
585
- else if constexpr (n == 2 ) {
586
- return micro_map2<value_t , named_member<T, I>::value...>{
587
- pair<sv, value_t >{glz::get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...};
588
- }
589
- else if constexpr (n < 64 ) // don't even attempt a first character hash if we have too many keys
590
- {
591
- constexpr auto & keys = member_names<T>;
592
- constexpr auto front_desc = single_char_hash<n>(keys);
593
-
594
- if constexpr (front_desc.valid ) {
595
- return make_single_char_map<value_t , front_desc>(
596
- {{glz::get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
597
- }
598
- else {
599
- constexpr single_char_hash_opts rear_hash{.is_front_hash = false };
600
- constexpr auto back_desc = single_char_hash<n, rear_hash>(keys);
601
-
602
- if constexpr (back_desc.valid ) {
603
- return make_single_char_map<value_t , back_desc>(
604
- {{get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
605
- }
606
- else {
607
- constexpr single_char_hash_opts sum_hash{.is_front_hash = true , .is_sum_hash = true };
608
- constexpr auto sum_desc = single_char_hash<n, sum_hash>(keys);
609
-
610
- if constexpr (sum_desc.valid ) {
611
- return make_single_char_map<value_t , sum_desc>(
612
- {{get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
613
- }
614
- else {
615
- if constexpr (n <= naive_map_max_size) {
616
- constexpr auto naive_desc = naive_map_hash<use_hash_comparison, n>(keys);
617
- return glz::detail::make_naive_map<value_t , naive_desc>(std::array{
618
- pair<sv, value_t >{get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
619
- }
620
- else {
621
- return glz::detail::normal_map<sv, value_t , n, use_hash_comparison>(std::array{
622
- pair<sv, value_t >{get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
623
- }
624
- }
625
- }
626
- }
627
- }
628
- else {
629
- return glz::detail::normal_map<sv, value_t , n, use_hash_comparison>(
630
- std::array{pair<sv, value_t >{get<I>(members), std::add_pointer_t <glz::tuple_element_t <I, V>>{}}...});
631
- }
632
- }
633
-
634
- template <reflectable T, bool use_hash_comparison = false >
635
- constexpr auto make_map ()
636
- requires(!glaze_t <T> && !array_t <T> && std::is_aggregate_v<std::remove_cvref_t <T>>)
637
- {
638
- constexpr auto indices = std::make_index_sequence<count_members<T>>{};
639
- return make_reflection_map_impl<decay_keep_volatile_t <T>, use_hash_comparison>(indices);
640
- }
641
- }
642
482
}
643
483
644
484
namespace glz ::detail
0 commit comments