From c646a26c4318987c6047d199e16285e24d349d90 Mon Sep 17 00:00:00 2001 From: Mike Gelfand Date: Sat, 25 Sep 2021 16:56:34 +0300 Subject: [PATCH] Reimplement quarks order check as a static assert (#1836) --- libtransmission/quark.cc | 33 ++++++++++++++++++++++++++++- tests/libtransmission/quark-test.cc | 10 --------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/libtransmission/quark.cc b/libtransmission/quark.cc index 2097a5ce6..3444ad9cb 100644 --- a/libtransmission/quark.cc +++ b/libtransmission/quark.cc @@ -9,6 +9,7 @@ #include #include /* bsearch() */ #include /* memcmp() */ +#include #include "transmission.h" #include "ptrarray.h" @@ -27,7 +28,7 @@ struct tr_key_struct "" name "", sizeof("" name "") - 1, \ } -static struct tr_key_struct const my_static[] = { +static struct tr_key_struct constexpr my_static[] = { Q(""), Q("activeTorrentCount"), Q("activity-date"), @@ -418,6 +419,36 @@ static struct tr_key_struct const my_static[] = { Q("webseedsSendingToUs"), }; +static size_t constexpr quarks_are_sorted = ( // + []() constexpr + { + for (size_t i = 1; i < std::size(my_static); ++i) + { + char const* lhs = my_static[i - 1].str; + char const* rhs = my_static[i].str; + + while (true) + { + if (*lhs > *rhs) + { + return false; + } + + if (*lhs < *rhs || *lhs == '\0' || *rhs == '\0') + { + break; + } + + ++lhs; + ++rhs; + } + } + + return true; + })(); + +static_assert(quarks_are_sorted, "Predefined quarks must be sorted by their string value"); + #undef Q static int compareKeys(void const* va, void const* vb) diff --git a/tests/libtransmission/quark-test.cc b/tests/libtransmission/quark-test.cc index d8a61d9f1..1918cd4e9 100644 --- a/tests/libtransmission/quark-test.cc +++ b/tests/libtransmission/quark-test.cc @@ -39,16 +39,6 @@ TEST_F(QuarkTest, allPredefinedKeysCanBeLookedUp) } } -TEST_F(QuarkTest, allPredefinedKeysAreSorted) -{ - for (int i = 0; i + 1 < TR_N_KEYS; i++) - { - auto const str1 = quarkGetString(i); - auto const str2 = quarkGetString(i + 1); - EXPECT_LT(str1, str2); - } -} - TEST_F(QuarkTest, newEmptyQuarkReturnsNone) { auto const q = tr_quark_new(nullptr, TR_BAD_SIZE);