refactor: add tr_variant::unmanaged_string(tr_quark) (#7906)

* feat: add tr_variant::unmanaged_string(tr_quark)

* refactor: use tr_variant::unmanaged_string(tr_quark)
This commit is contained in:
Charles Kerr
2025-12-09 14:58:15 -06:00
committed by GitHub
parent 20161fa044
commit fece4137c7
4 changed files with 77 additions and 61 deletions

View File

@@ -272,6 +272,11 @@ public:
return ret;
}
[[nodiscard]] static tr_variant unmanaged_string(tr_quark const key)
{
return unmanaged_string(tr_quark_get_string_view(key));
}
template<typename Val>
tr_variant& operator=(Val value)
{

View File

@@ -99,7 +99,7 @@ TEST_F(RpcTest, JsonRpcWrongVersion)
{
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_jsonrpc, "1.0");
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats));
request_map.try_emplace(TR_KEY_id, 12345);
auto response = tr_variant{};
@@ -141,9 +141,7 @@ TEST_F(RpcTest, idSync)
{
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats_kebab)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats_kebab));
request_map[TR_KEY_id].merge(request_id); // copy
auto response = tr_variant{};
@@ -189,7 +187,7 @@ TEST_F(RpcTest, idWrongType)
{
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats));
request_map[TR_KEY_id].merge(request_id); // copy
auto response = tr_variant{};
@@ -223,7 +221,7 @@ TEST_F(RpcTest, idWrongType)
TEST_F(RpcTest, tagSyncLegacy)
{
auto request_map = tr_variant::Map{ 2U };
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats));
request_map.try_emplace(TR_KEY_tag, 12345);
auto response = tr_variant{};
@@ -257,9 +255,7 @@ TEST_F(RpcTest, idAsync)
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_rename_path_kebab)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_rename_path_kebab));
request_map[TR_KEY_id].merge(request_id); // copy
auto params_map = tr_variant::Map{ 2U };
@@ -310,7 +306,7 @@ TEST_F(RpcTest, tagAsyncLegacy)
EXPECT_NE(nullptr, tor);
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_rename_path)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_rename_path));
request_map.try_emplace(TR_KEY_tag, 12345);
auto arguments_map = tr_variant::Map{ 2U };
@@ -343,7 +339,7 @@ TEST_F(RpcTest, NotificationSync)
{
auto request_map = tr_variant::Map{ 2U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats));
auto response = tr_variant{};
tr_rpc_request_exec(
@@ -361,7 +357,7 @@ TEST_F(RpcTest, NotificationAsync)
auto request_map = tr_variant::Map{ 2U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_rename_path)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_rename_path));
auto params_map = tr_variant::Map{ 2U };
params_map.try_emplace(TR_KEY_path, "files-filled-with-zeroes/512");
@@ -444,18 +440,18 @@ TEST_F(RpcTest, batch)
auto request = tr_variant::Map{ 3U };
request.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats_kebab)));
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats_kebab));
request.try_emplace(TR_KEY_id, 12345);
request_vec.emplace_back(std::move(request));
request = tr_variant::Map{ 2U };
request.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_set_kebab)));
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_set_kebab));
request_vec.emplace_back(std::move(request));
request = tr_variant::Map{ 3U };
request.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats_kebab)));
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats_kebab));
request.try_emplace(TR_KEY_id, "12345"sv);
request_vec.emplace_back(std::move(request));
@@ -477,7 +473,7 @@ TEST_F(RpcTest, batch)
request_vec.emplace_back(std::move(request));
request = tr_variant::Map{ 2U };
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats_kebab)));
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats_kebab));
request.try_emplace(TR_KEY_tag, 12345);
request_vec.emplace_back(std::move(request));
@@ -596,7 +592,7 @@ TEST_F(RpcTest, sessionGet)
auto request_map = tr_variant::Map{ 3U };
request_map.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_get)));
request_map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_get));
request_map.try_emplace(TR_KEY_id, 12345);
auto response = tr_variant{};
tr_rpc_request_exec(
@@ -768,7 +764,7 @@ TEST_F(RpcTest, torrentGet)
auto request = tr_variant::Map{ 3U };
request.try_emplace(TR_KEY_jsonrpc, JsonRpc::Version);
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_get)));
request.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_get));
request.try_emplace(TR_KEY_id, 12345);
auto params = tr_variant::Map{ 1U };

View File

@@ -24,7 +24,11 @@
using namespace std::literals;
using VariantTest = ::testing::Test;
class VariantTest : public ::testing::Test
{
protected:
static void expectVariantMatchesQuark(tr_quark key);
};
#ifndef _WIN32
#define STACK_SMASH_DEPTH (1 * 1000 * 1000)
@@ -82,6 +86,35 @@ TEST_F(VariantTest, getType)
EXPECT_EQ(strkey, *sv);
}
// static
void VariantTest::expectVariantMatchesQuark(tr_quark const key)
{
auto const key_sv = tr_quark_get_string_view(key);
auto const var = tr_variant::unmanaged_string(key);
auto const var_sv = var.value_if<std::string_view>();
ASSERT_TRUE(var_sv);
// The strings should not just be equal,
// but should point to literally the same memory
EXPECT_EQ(key_sv, *var_sv);
EXPECT_EQ(std::data(key_sv), std::data(*var_sv));
}
TEST_F(VariantTest, unmanagedStringFromPredefinedQuark)
{
expectVariantMatchesQuark(TR_KEY_name);
}
TEST_F(VariantTest, unmanagedStringFromNewQuark)
{
static auto constexpr NewString = std::string_view{ "this-string-is-not-already-interned" };
ASSERT_FALSE(tr_quark_lookup(NewString));
auto const key = tr_quark_new(NewString);
expectVariantMatchesQuark(key);
}
TEST_F(VariantTest, parseInt)
{
static auto constexpr Benc = "i64e"sv;

View File

@@ -2525,7 +2525,7 @@ tr_variant::Map& ensure_sset(tr_variant& sset)
{
sset = tr_variant::Map{ 3 };
map = sset.get_if<tr_variant::Map>();
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_set_kebab)));
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_set_kebab));
}
auto* args = map->find_if<tr_variant::Map>(TR_KEY_arguments);
@@ -2543,7 +2543,7 @@ tr_variant::Map& ensure_tset(tr_variant& tset)
{
tset = tr_variant::Map{ 3 };
map = tset.get_if<tr_variant::Map>();
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_set_kebab)));
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_set_kebab));
}
auto* args = map->find_if<tr_variant::Map>(TR_KEY_arguments);
@@ -2561,7 +2561,7 @@ tr_variant::Map& ensure_tadd(tr_variant& tadd)
{
tadd = tr_variant::Map{ 3 };
map = tadd.get_if<tr_variant::Map>();
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_add_kebab)));
map->try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_add_kebab));
map->try_emplace(TR_KEY_tag, TAG_TORRENT_ADD);
}
@@ -2745,7 +2745,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
for (auto const& key : DetailsKeys)
{
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
fields.emplace_back(tr_variant::unmanaged_string(key));
}
add_id_arg(args, config, "all");
@@ -2755,7 +2755,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
for (auto const& key : DetailsKeys)
{
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
fields.emplace_back(tr_variant::unmanaged_string(key));
}
add_id_arg(args, config);
@@ -2766,7 +2766,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
for (auto const& key : ListKeys)
{
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
fields.emplace_back(tr_variant::unmanaged_string(key));
}
add_id_arg(args, config, "all");
@@ -2777,7 +2777,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
for (auto const& key : FilesKeys)
{
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
fields.emplace_back(tr_variant::unmanaged_string(key));
}
add_id_arg(args, config);
@@ -2785,20 +2785,20 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 941:
map.insert_or_assign(TR_KEY_tag, TAG_PEERS);
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_peers)));
fields.emplace_back(tr_variant::unmanaged_string(TR_KEY_peers));
add_id_arg(args, config);
break;
case 942:
map.insert_or_assign(TR_KEY_tag, TAG_PIECES);
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_pieces)));
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_piece_count_camel)));
fields.emplace_back(tr_variant::unmanaged_string(TR_KEY_pieces));
fields.emplace_back(tr_variant::unmanaged_string(TR_KEY_piece_count_camel));
add_id_arg(args, config);
break;
case 943:
map.insert_or_assign(TR_KEY_tag, TAG_TRACKERS);
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_tracker_stats_camel)));
fields.emplace_back(tr_variant::unmanaged_string(TR_KEY_tracker_stats_camel));
add_id_arg(args, config);
break;
@@ -2808,7 +2808,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
}
args.insert_or_assign(TR_KEY_fields, std::move(fields));
fields.emplace_back(tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_get_kebab)));
fields.emplace_back(tr_variant::unmanaged_string(TR_KEY_torrent_get_kebab));
map.insert_or_assign(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3240,7 +3240,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
args.try_emplace(TR_KEY_delete_local_data_kebab, c == 840);
add_id_arg(args, config);
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_remove_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_remove_kebab));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
@@ -3264,7 +3264,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
auto args = tr_variant::Map{ 1 };
add_id_arg(args, config);
auto const key = is_stop ? TR_KEY_torrent_stop_kebab : TR_KEY_torrent_start_kebab;
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(key));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
@@ -3302,7 +3302,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
auto args = tr_variant::Map{ 1 };
add_id_arg(args, config);
auto const key = Method(c);
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(tr_quark_get_string_view(key)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(key));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3314,9 +3314,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 920: /* session-info */
{
auto map = tr_variant::Map{ 2 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_get_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_get_kebab));
map.try_emplace(TR_KEY_tag, TAG_SESSION);
auto top = tr_variant{ std::move(map) };
@@ -3334,9 +3332,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 850:
{
auto map = tr_variant::Map{ 1 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_close_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_close_kebab));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
}
@@ -3345,9 +3341,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 963:
{
auto map = tr_variant::Map{ 1 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_blocklist_update_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_blocklist_update_kebab));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
}
@@ -3356,9 +3350,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 921:
{
auto map = tr_variant::Map{ 2 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_session_stats_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_session_stats_kebab));
map.try_emplace(TR_KEY_tag, TAG_STATS);
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3368,9 +3360,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 962:
{
auto map = tr_variant::Map{ 2 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_port_test_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_port_test_kebab));
map.try_emplace(TR_KEY_tag, TAG_PORTTEST);
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3384,9 +3374,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
args.try_emplace(TR_KEY_location, optarg_sv);
args.try_emplace(TR_KEY_move, true);
add_id_arg(args, config);
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_set_location_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_set_location_kebab));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3413,9 +3401,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
args.try_emplace(TR_KEY_location, optarg_sv);
args.try_emplace(TR_KEY_move, false);
add_id_arg(args, config);
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_set_location_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_set_location_kebab));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3429,9 +3415,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
args.try_emplace(TR_KEY_path, rename_from);
args.try_emplace(TR_KEY_name, optarg_sv);
add_id_arg(args, config);
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_torrent_rename_path_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_torrent_rename_path_kebab));
map.try_emplace(TR_KEY_arguments, std::move(args));
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);
@@ -3446,9 +3430,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
case 732:
{
auto map = tr_variant::Map{ 2 };
map.try_emplace(
TR_KEY_method,
tr_variant::unmanaged_string(tr_quark_get_string_view(TR_KEY_group_get_kebab)));
map.try_emplace(TR_KEY_method, tr_variant::unmanaged_string(TR_KEY_group_get_kebab));
map.try_emplace(TR_KEY_tag, TAG_GROUPS);
auto top = tr_variant{ std::move(map) };
status |= flush(rpcurl, &top, config);