// Copyright (c) 2025 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef MP_PROXY_TYPE_STRUCT_H #define MP_PROXY_TYPE_STRUCT_H #include namespace mp { template void BuildOne(TypeList param, InvokeContext& invoke_context, Output&& output, Value&& value, typename std::enable_if < index::fields>::type * enable = nullptr) { using Index = std::integral_constant; using Struct = typename ProxyType::Struct; using Accessor = typename std::tuple_element::Accessors>::type; auto&& field_output = Make(output); auto&& field_value = value.*ProxyType::get(Index()); BuildField(TypeList>(), invoke_context, field_output, field_value); BuildOne(param, invoke_context, output, value); } template void BuildOne(TypeList param, InvokeContext& invoke_context, Output&& output, Value&& value, typename std::enable_if::fields>::type* enable = nullptr) { } template void CustomBuildField(TypeList local_type, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output, typename ProxyType::Struct* enable = nullptr) { BuildOne<0>(local_type, invoke_context, output.init(), value); } template void ReadOne(TypeList param, InvokeContext& invoke_context, Input&& input, Value&& value, typename std::enable_if::fields>::type* enable = nullptr) { using Index = std::integral_constant; using Struct = typename ProxyType::Struct; using Accessor = typename std::tuple_element::Accessors>::type; const auto& struc = input.get(); auto&& field_value = value.*ProxyType::get(Index()); ReadField(TypeList>(), invoke_context, Make(struc), ReadDestUpdate(field_value)); ReadOne(param, invoke_context, input, value); } template void ReadOne(TypeList param, InvokeContext& invoke_context, Input& input, Value& value, typename std::enable_if::fields>::type* enable = nullptr) { } template decltype(auto) CustomReadField(TypeList param, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest, typename ProxyType::Struct* enable = nullptr) { return read_dest.update([&](auto& value) { ReadOne<0>(param, invoke_context, input, value); }); } } // namespace mp #endif // MP_PROXY_TYPE_STRUCT_H