// 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_PAIR_H #define MP_PROXY_TYPE_PAIR_H #include namespace mp { // FIXME: Overload on output type instead of value type and switch to std::get and merge with next overload template void CustomBuildField(TypeList>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output) { auto pair = output.init(); using Accessors = typename ProxyStruct::Accessors; BuildField(TypeList(), invoke_context, Make>(pair), value.first); BuildField(TypeList(), invoke_context, Make>(pair), value.second); } template decltype(auto) CustomReadField(TypeList>, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest) { const auto& pair = input.get(); using Accessors = typename ProxyStruct::Reads>::Accessors; ReadField(TypeList(), invoke_context, Make>(pair), ReadDestEmplace(TypeList(), [&](auto&&... key_args) -> auto& { KeyLocalType* key = nullptr; ReadField(TypeList(), invoke_context, Make>(pair), ReadDestEmplace(TypeList(), [&](auto&&... value_args) -> auto& { auto& ret = read_dest.construct(std::piecewise_construct, std::forward_as_tuple(key_args...), std::forward_as_tuple(value_args...)); key = &ret.first; return ret.second; })); return *key; })); } } // namespace mp #endif // MP_PROXY_TYPE_PAIR_H