diff --git a/src/include/units/symbol_text.h b/src/include/units/symbol_text.h index 198cd1d5..2c79915b 100644 --- a/src/include/units/symbol_text.h +++ b/src/include/units/symbol_text.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace units { @@ -75,39 +76,39 @@ struct basic_symbol_text { [[nodiscard]] friend constexpr auto operator<=>(const basic_symbol_text& lhs, const basic_symbol_text& rhs) { - return std::lexicographical_compare_three_way(lhs.standard_.begin(), lhs.standard_.end(), rhs.standard_.begin(), rhs.standard_.end()); + auto comparison = std::lexicographical_compare_three_way(lhs.standard_.begin(), lhs.standard_.end(), rhs.standard_.begin(), rhs.standard_.end()); + assert(std::lexicographical_compare_three_way(lhs.ascii_.begin(), lhs.ascii_.end(), rhs.ascii_.begin(), rhs.ascii_.end()) == comparison); + return comparison; } template [[nodiscard]] friend constexpr auto operator<=>(const basic_symbol_text& lhs, const basic_fixed_string& rhs) { - auto rhs_symbol = basic_symbol_text(rhs); - return lhs <=> rhs_symbol; + return std::lexicographical_compare_three_way(lhs.standard_.begin(), lhs.standard_.end(), rhs.begin(), rhs.end()); } template [[nodiscard]] friend constexpr auto operator<=>(const basic_symbol_text& lhs, const StandardCharT2 (&rhs)[N2]) { - auto rhs_symbol = basic_symbol_text(rhs); - return lhs <=> rhs_symbol; + return lhs <=> basic_fixed_string(rhs); } template [[nodiscard]] friend constexpr auto operator<=>(const basic_symbol_text& lhs, StandardCharT2 rhs) { - auto rhs_symbol = basic_symbol_text(rhs); - return lhs <=> rhs_symbol; + return lhs <=> basic_fixed_string(rhs); } template [[nodiscard]] friend constexpr bool operator==(const basic_symbol_text& lhs, const basic_symbol_text& rhs) { - return std::equal(lhs.standard_.begin(), lhs.standard_.end(), rhs.standard_.begin(), rhs.standard_.end()) - && std::equal(lhs.ascii_.begin(), lhs.ascii_.end(), rhs.ascii_.begin(), rhs.ascii_.end()); + bool comparison = std::equal(lhs.standard_.begin(), lhs.standard_.end(), rhs.standard_.begin(), rhs.standard_.end()); + assert(std::equal(lhs.ascii_.begin(), lhs.ascii_.end(), rhs.ascii_.begin(), rhs.ascii_.end()) == comparison); + return comparison; } template @@ -133,32 +134,22 @@ struct basic_symbol_text { #else + template [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, - const basic_symbol_text& rhs) noexcept + const basic_symbol_text& rhs) noexcept { - return lhs.standard_ == rhs.standard_ && lhs.ascii_ == rhs.ascii_; + bool comparison = (lhs.standard_ == rhs.standard_); + assert((lhs.ascii_ == rhs.ascii_) == comparison); + return comparison; } + template [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text& lhs, - const basic_symbol_text& rhs) noexcept + const basic_symbol_text& rhs) noexcept { return !(lhs == rhs); } - template - [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text&, - const basic_symbol_text&) noexcept - { - return false; - } - - template - [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text&, - const basic_symbol_text&) noexcept - { - return true; - } - [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, const basic_fixed_string& rhs) noexcept { @@ -241,7 +232,9 @@ struct basic_symbol_text { [[nodiscard]] constexpr friend bool operator<(const basic_symbol_text& lhs, const basic_symbol_text& rhs) noexcept { - return lhs.standard_ < rhs.standard_; + bool comparison = lhs.standard_ < rhs.standard_; + assert((lhs.ascii_ < rhs.ascii_) == comparison); + return comparison; } template @@ -269,7 +262,9 @@ struct basic_symbol_text { [[nodiscard]] constexpr friend bool operator>(const basic_symbol_text& lhs, const basic_symbol_text& rhs) noexcept { - return lhs.standard_ > rhs.standard_; + bool comparison = lhs.standard_ > rhs.standard_; + assert((lhs.ascii_ > rhs.ascii_) == comparison); + return comparison; } template @@ -297,7 +292,9 @@ struct basic_symbol_text { [[nodiscard]] constexpr friend bool operator<=(const basic_symbol_text& lhs, const basic_symbol_text& rhs) noexcept { - return lhs.standard_ <= rhs.standard_; + bool comparison = lhs.standard_ <= rhs.standard_; + assert((lhs.ascii_ <= rhs.ascii_) == comparison); + return comparison; } template @@ -325,7 +322,9 @@ struct basic_symbol_text { [[nodiscard]] constexpr friend bool operator>=(const basic_symbol_text& lhs, const basic_symbol_text& rhs) noexcept { - return lhs.standard_ >= rhs.standard_; + bool comparison = lhs.standard_ >= rhs.standard_; + assert((lhs.ascii_ >= rhs.ascii_) == comparison); + return comparison; } template diff --git a/test/unit_test/static/fixed_symbol_test.cpp b/test/unit_test/static/fixed_symbol_test.cpp index 03ed14ad..c9bcea18 100644 --- a/test/unit_test/static/fixed_symbol_test.cpp +++ b/test/unit_test/static/fixed_symbol_test.cpp @@ -42,10 +42,8 @@ static_assert(sym6.standard() == "bc"); static_assert(sym6.ascii() == "de"); static_assert(sym6 == basic_symbol_text("bc", "de")); -static_assert(sym6 != basic_symbol_text("bc", "bc")); -static_assert(sym6 != basic_symbol_text("de", "de")); +static_assert(sym6 != basic_symbol_text("fg", "hi")); static_assert(sym6 != basic_symbol_text("bcd", "ef")); -static_assert(sym6 != basic_symbol_text("bc", "def")); static_assert(sym6 == basic_fixed_string("bc")); static_assert(sym6 != basic_fixed_string("de"));