// 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_OPTIONAL_H #define MP_PROXY_TYPE_OPTIONAL_H #include namespace mp { template void CustomBuildField(TypeList>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output) { if (value) { output.setHas(); // FIXME: should std::move value if destvalue is rref? BuildField(TypeList(), invoke_context, output, *value); } } template decltype(auto) CustomReadField(TypeList>, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest) { return read_dest.update([&](auto& value) { if (!input.has()) { value.reset(); } else if (value) { ReadField(TypeList(), invoke_context, input, ReadDestUpdate(*value)); } else { ReadField(TypeList(), invoke_context, input, ReadDestEmplace(TypeList(), [&](auto&&... args) -> auto& { value.emplace(std::forward(args)...); return *value; })); } }); } } // namespace mp #endif // MP_PROXY_TYPE_OPTIONAL_H