/* * Copyright (C) 2023-present ScyllaDB * */ /* * SPDX-License-Identifier: (LicenseRef-ScyllaDB-Source-Available-1.0 and Apache-2.0) */ #pragma once #include "utils/tuple_utils.hh" #include #include namespace utils { namespace internal { class rpc_default_value { template struct marker {}; template static auto create(marker>) { return std::make_unique(); } template static auto create(marker>) { return std::make_shared(); } template static auto create(marker>) { return make_lw_shared(); } template static auto create(marker>) { return make_shared(); } template static auto create(marker>) { return make_foreign(create()); } template static auto create(marker) { return T{}; } public: template static T create() { return create(marker{}); } }; } // The Seastar RPC infrastructure does not support null values in tuples in handler responses. // This function generates a tuple by default constructing all of its elements, except for // smart pointer types. For those, it returns a pointer to the default constructed value. template T make_default_rpc_tuple() { return std::invoke([&](std::index_sequence) { return T { internal::rpc_default_value::create>()... }; }, std::make_index_sequence>()); } }