From 51c3dc45b8df625991de004a5e84be9e48320318 Mon Sep 17 00:00:00 2001 From: Yat Ho Date: Wed, 25 Mar 2026 23:15:32 +0800 Subject: [PATCH] refactor: use range-checked value_if to serialize/deserialize integer types (#8727) --- libtransmission/serializer.cc | 52 +++++--------------------- tests/libtransmission/settings-test.cc | 14 ++++++- 2 files changed, 22 insertions(+), 44 deletions(-) diff --git a/libtransmission/serializer.cc b/libtransmission/serializer.cc index b00716935..ca366e3f3 100644 --- a/libtransmission/serializer.cc +++ b/libtransmission/serializer.cc @@ -136,9 +136,11 @@ tr_variant from_double(double const& val) // --- -bool to_int64(tr_variant const& src, int64_t* tgt) +template +bool to_int(tr_variant const& src, T* tgt) { - if (auto const val = src.value_if()) + static_assert(!std::is_same_v); + if (auto const val = src.value_if()) { *tgt = *val; return true; @@ -147,8 +149,10 @@ bool to_int64(tr_variant const& src, int64_t* tgt) return false; } -tr_variant from_int64(int64_t const& val) +template +tr_variant from_int(T const& val) { + static_assert(!std::is_same_v); return val; } @@ -341,42 +345,6 @@ tr_variant from_preferred_transport(small::max_size_vector()) - { - *tgt = static_cast(*val); - return true; - } - - return false; -} - -tr_variant from_size_t(size_t const& val) -{ - return uint64_t{ val }; -} - -// --- - -bool to_uint64(tr_variant const& src, uint64_t* tgt) -{ - if (auto const val = src.value_if()) - { - *tgt = static_cast(*val); - return true; - } - - return false; -} - -tr_variant from_uint64(uint64_t const& val) -{ - return val; -} - -// --- - bool to_string(tr_variant const& src, std::string* tgt) { if (auto const val = src.value_if()) @@ -573,7 +541,9 @@ void Converters::ensure_default_converters() Converters::add(to_double, from_double); Converters::add(to_encryption_mode, from_encryption_mode); Converters::add(to_fs_path, from_fs_path); - Converters::add(to_int64, from_int64); + Converters::add(to_int, from_int); + Converters::add(to_int, from_int); + Converters::add(to_int, from_int); Converters::add(to_log_level, from_log_level); Converters::add(to_mode_t, from_mode_t); Converters::add(to_msec, from_msec); @@ -581,10 +551,8 @@ void Converters::ensure_default_converters() Converters::add(to_port, from_port); Converters::add(to_preallocation_mode, from_preallocation_mode); Converters::add(to_preferred_transport, from_preferred_transport); - Converters::add(to_size_t, from_size_t); Converters::add(to_string, from_string); Converters::add(to_u8string, from_u8string); - Converters::add(to_uint64, from_uint64); Converters::add(to_verify_added_mode, from_verify_added_mode); }); } diff --git a/tests/libtransmission/settings-test.cc b/tests/libtransmission/settings-test.cc index 953eff867..7192778a3 100644 --- a/tests/libtransmission/settings-test.cc +++ b/tests/libtransmission/settings-test.cc @@ -272,12 +272,22 @@ TEST_F(SettingsTest, canLoadSizeT) static auto constexpr Key = TR_KEY_queue_stalled_minutes; auto settings = tr_session::Settings{}; - auto const expected_value = settings.queue_stalled_minutes + 5U; + auto const default_value = settings.queue_stalled_minutes; + auto const expected_value = default_value + 5U; + EXPECT_NE(expected_value, default_value); auto map = tr_variant::Map{ 1U }; map.try_emplace(Key, expected_value); - settings.load(tr_variant{ std::move(map) }); + settings.load(std::move(map)); EXPECT_EQ(expected_value, settings.queue_stalled_minutes); + + static auto constexpr NegValue = -1; + EXPECT_NE(default_value, NegValue); + settings = tr_session::Settings{}; + map = tr_variant::Map{ 1U }; + map.insert_or_assign(Key, NegValue); + settings.load(std::move(map)); + EXPECT_EQ(default_value, settings.queue_stalled_minutes); } TEST_F(SettingsTest, canSaveSizeT)