@@ -509,13 +509,13 @@ namespace cmcpp
509509 template <typename T>
510510 concept Field = ValTrait<T>::type != ValType::UNKNOWN;
511511
512- // Record --------------------------------------------------------------------
512+ // Tuple --------------------------------------------------------------------
513513 template <Field... Ts>
514- using record_t = std::tuple<Ts...>;
514+ using tuple_t = std::tuple<Ts...>;
515515 template <Field... Ts>
516- struct ValTrait <record_t <Ts...>>
516+ struct ValTrait <tuple_t <Ts...>>
517517 {
518- static constexpr ValType type = ValType::Record ;
518+ static constexpr ValType type = ValType::Tuple ;
519519 using inner_type = typename std::tuple<Ts...>;
520520 static constexpr size_t flat_types_len = []() constexpr
521521 {
@@ -541,22 +541,117 @@ namespace cmcpp
541541 }();
542542 };
543543 template <typename T>
544+ concept Tuple = ValTrait<T>::type == ValType::Tuple;
545+
546+ // Record ------------------------------------------------------------------
547+ template <typename S>
548+ concept Struct = (std::is_aggregate_v<S>);
549+
550+ template <Struct R>
551+ using record_t = R;
552+
553+ template <Struct R>
554+ struct ValTrait <record_t <R>>
555+ {
556+ static constexpr ValType type = ValType::Record;
557+ using inner_type = R;
558+
559+ // using tuple_type = tuple_t<Ts...>;
560+ // static constexpr size_t flat_types_len = ValTrait<tuple_type>::flat_types_len;
561+ // static constexpr std::array<WasmValType, flat_types_len> flat_types = ValTrait<tuple_type>::flat_types;
562+ };
563+ template <typename T>
544564 concept Record = ValTrait<T>::type == ValType::Record;
545565
546- template <typename T, Record R , std::size_t ... I>
547- T to_struct_impl (const R &t, std::index_sequence<I...>)
566+ template <Record R, Tuple T , std::size_t ... I>
567+ R to_struct_impl (const T &t, std::index_sequence<I...>)
548568 {
549- return T {std::get<I>(t)...};
569+ return R {std::get<I>(t)...};
550570 }
551571
552- template <typename T, Record R >
553- T to_struct (const R &t)
572+ template <Record R, Tuple T >
573+ R to_struct (const T &t)
554574 {
555- return to_struct_impl<T >(t, std::make_index_sequence<std::tuple_size_v<R >>{});
575+ return to_struct_impl<R >(t, std::make_index_sequence<std::tuple_size_v<T >>{});
556576 }
557577
578+ // {
579+ // using inner_type = std::tuple<Ts...>;
580+ // inner_type fields;
581+
582+ // template <size_t I>
583+ // auto get() const
584+ // {
585+ // return std::get<I>(fields);
586+ // }
587+ // };
588+
589+ // template <RecordConcept T, Field... Ts>
590+ // tuple_t<Ts...> toTupleImpl(const T &record, Ts... members)
591+ // {
592+ // return std::make_tuple(record.*members...);
593+ // }
594+
595+ // Helper to get the value from Field
596+
597+ // Helper to get field by index
598+
599+ // Recursive template to build the tuple
600+
601+ // struct record_t
602+ // {
603+ // using inner_type = std::tuple<Ts...>;
604+ // inner_type fields;
605+
606+ // template <size_t I>
607+ // auto get() const
608+ // {
609+ // return std::get<I>(fields);
610+ // }
611+
612+ // // auto toTupleImpl(const T &record, Ts... members)
613+ // // {
614+ // // return std::make_tuple(record.*members...);
615+ // // }
616+
617+ // // auto toTuple(const T &record, Ts... members)
618+ // // {
619+ // // return toTupleImpl(record, members...);
620+ // // }
621+ // };
622+
623+ // template <Field... Ts>
624+ // struct ValTrait<record_t<Ts...>>
625+ // {
626+ // static constexpr ValType type = ValType::Record;
627+ // };
628+ // template <typename T>
629+ // concept Record = ValTrait<T>::type == ValType::Record;
630+
631+ // struct MyStruct : public record_t<int32_t, int64_t, float32_t, float64_t>
632+ // {
633+ // int32_t a;
634+ // int64_t b;
635+ // float32_t c;
636+ // float64_t d;
637+ // };
638+ // record_t<int32_t, int64_t, float32_t, float64_t> r = {{1, 2, 3.0, 4.0}};
639+
640+ // template <typename T, Tuple R, std::size_t... I>
641+ // T to_struct_impl(const R &t, std::index_sequence<I...>)
642+ // {
643+ // return T{std::get<I>(t)...};
644+ // }
645+
646+ // template <typename T, Tuple R>
647+ // T to_struct(const R &t)
648+ // {
649+ // return to_struct_impl<T>(t, std::make_index_sequence<std::tuple_size_v<R>>{});
650+ // }
651+
558652 // Variant ------------------------------------------------------------------
559- inline constexpr WasmValType join (WasmValType a, WasmValType b)
653+ inline constexpr WasmValType
654+ join (WasmValType a, WasmValType b)
560655 {
561656 if (a == b)
562657 {
0 commit comments