diff --git a/src/include/units/symbol_text.h b/src/include/units/symbol_text.h index c10fe2cc..b1f52a74 100644 --- a/src/include/units/symbol_text.h +++ b/src/include/units/symbol_text.h @@ -29,40 +29,260 @@ struct basic_symbol_text { lhs.standard_ + rhs.standard_, lhs.ascii_ + rhs.ascii_); } - template + template [[nodiscard]] constexpr friend basic_symbol_text operator+( - const basic_symbol_text& lhs, const basic_fixed_string& rhs) noexcept + const basic_symbol_text& lhs, const basic_fixed_string& rhs) noexcept { - return basic_symbol_text( - lhs.standard_ + rhs, lhs.ascii_ + rhs); + return (lhs + basic_symbol_text(rhs)); } - template + template [[nodiscard]] constexpr friend basic_symbol_text operator+( - const basic_fixed_string& lhs, const basic_symbol_text& rhs) noexcept + const basic_fixed_string& lhs, const basic_symbol_text& rhs) noexcept { - return basic_symbol_text( - lhs + rhs.standard_, lhs + rhs.ascii_); + return (basic_symbol_text(lhs) + rhs); + } + + template + [[nodiscard]] constexpr friend basic_symbol_text operator+( + const basic_symbol_text& lhs, const StandardCharT (&rhs)[N2]) noexcept + { + return (lhs + basic_symbol_text(rhs)); + } + + template + [[nodiscard]] constexpr friend basic_symbol_text operator+( + const StandardCharT (&lhs)[N2], const basic_symbol_text& rhs) noexcept + { + return (basic_symbol_text(lhs) + rhs); + } + + [[nodiscard]] constexpr friend basic_symbol_text operator+( + const basic_symbol_text& lhs, StandardCharT rhs) noexcept + { + return (lhs + basic_symbol_text(rhs)); + } + + [[nodiscard]] constexpr friend basic_symbol_text operator+( + StandardCharT lhs, const basic_symbol_text& rhs) noexcept + { + return (basic_symbol_text(lhs) + rhs); + } + + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, + const basic_symbol_text& rhs) noexcept + { + return (lhs.standard_ == rhs.standard_ && lhs.ascii_ == rhs.ascii_); + } + + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text& lhs, + 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 + { + return (lhs.standard_ == rhs); + } + + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text& lhs, + const basic_fixed_string& rhs) noexcept + { + return !(lhs == rhs); + } + + template + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text&, + const basic_fixed_string&) noexcept + { + return false; + } + + template + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text&, + const basic_fixed_string&) noexcept + { + return true; + } + + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, + const StandardCharT (&rhs)[N + 1]) noexcept + { + return (lhs.standard_ == rhs); + } + + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text& lhs, + const StandardCharT (&rhs)[N + 1]) noexcept + { + return !(lhs == rhs); + } + + template + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text&, + const StandardCharT2 (&)[N2 + 1]) noexcept + { + return false; + } + + template + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text&, + const StandardCharT2 (&)[N2 + 1]) noexcept + { + return true; + } + + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, + StandardCharT rhs) noexcept + { + return (lhs.standard_ == rhs); + } + + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text& lhs, + StandardCharT rhs) noexcept + { + return !(lhs == rhs); + } + + template + [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text&, + StandardCharT2) noexcept + { + return false; + } + + template + [[nodiscard]] constexpr friend bool operator!=(const basic_symbol_text&, + StandardCharT2) noexcept + { + return true; } 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_); } - [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, - const StandardCharT (&rhs)[N + 1]) noexcept - { - return (lhs.standard_ == basic_fixed_string(rhs)); - } - template - [[nodiscard]] constexpr friend bool operator==(const basic_symbol_text& lhs, - const StandardCharT2 (&rhs)[N2 + 1]) noexcept + [[nodiscard]] constexpr friend bool operator<(const basic_symbol_text& lhs, + const basic_fixed_string& rhs) noexcept { - return false; + return (lhs.standard_ < rhs); + } + + template + [[nodiscard]] constexpr friend bool operator<(const basic_symbol_text& lhs, + const StandardCharT2 (&rhs)[N2]) noexcept + { + return (lhs.standard_ < basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator<(const basic_symbol_text& lhs, + StandardCharT2 rhs) noexcept + { + return (lhs.standard_ < basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator>(const basic_symbol_text& lhs, + const basic_symbol_text& rhs) noexcept + { + return (lhs.standard_ > rhs.standard_); + } + + template + [[nodiscard]] constexpr friend bool operator>(const basic_symbol_text& lhs, + const basic_fixed_string& rhs) noexcept + { + return (lhs.standard_ > rhs); + } + + template + [[nodiscard]] constexpr friend bool operator>(const basic_symbol_text& lhs, + const StandardCharT2 (&rhs)[N2]) noexcept + { + return (lhs.standard_ > basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator>(const basic_symbol_text& lhs, + StandardCharT2 rhs) noexcept + { + return (lhs.standard_ > basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator<=(const basic_symbol_text& lhs, + const basic_symbol_text& rhs) noexcept + { + return (lhs.standard_ <= rhs.standard_); + } + + template + [[nodiscard]] constexpr friend bool operator<=(const basic_symbol_text& lhs, + const basic_fixed_string& rhs) noexcept + { + return (lhs.standard_ <= rhs); + } + + template + [[nodiscard]] constexpr friend bool operator<=(const basic_symbol_text& lhs, + const StandardCharT2 (&rhs)[N2]) noexcept + { + return (lhs.standard_ <= basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator<=(const basic_symbol_text& lhs, + StandardCharT2 rhs) noexcept + { + return (lhs.standard_ <= basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator>=(const basic_symbol_text& lhs, + const basic_symbol_text& rhs) noexcept + { + return (lhs.standard_ >= rhs.standard_); + } + + template + [[nodiscard]] constexpr friend bool operator>=(const basic_symbol_text& lhs, + const basic_fixed_string& rhs) noexcept + { + return (lhs.standard_ >= rhs); + } + + template + [[nodiscard]] constexpr friend bool operator>=(const basic_symbol_text& lhs, + const StandardCharT2 (&rhs)[N2]) noexcept + { + return (lhs.standard_ >= basic_fixed_string(rhs)); + } + + template + [[nodiscard]] constexpr friend bool operator>=(const basic_symbol_text& lhs, + StandardCharT2 rhs) noexcept + { + return (lhs.standard_ >= basic_fixed_string(rhs)); } }; @@ -76,14 +296,14 @@ template basic_symbol_text(const StandardCharT (&)[N]) -> basic_symbol_text; template -basic_symbol_text(const basic_fixed_string& s) -> basic_symbol_text; +basic_symbol_text(const basic_fixed_string&) -> basic_symbol_text; template basic_symbol_text(const StandardCharT (&)[N], const ASCIICharT (&)[M]) -> basic_symbol_text; template -basic_symbol_text(const basic_fixed_string& s, - const basic_fixed_string& a) --> basic_symbol_text; +basic_symbol_text(const basic_fixed_string&, + const basic_fixed_string&) +-> basic_symbol_text; } // namespace units diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index 0b8c036b..e6be02ad 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -28,6 +28,7 @@ add_library(unit_tests_static dimension_op_test.cpp dimensions_concepts_test.cpp fixed_string_test.cpp + fixed_symbol_test.cpp math_test.cpp quantity_test.cpp ratio_test.cpp diff --git a/test/unit_test/static/fixed_symbol_test.cpp b/test/unit_test/static/fixed_symbol_test.cpp new file mode 100644 index 00000000..03ed14ad --- /dev/null +++ b/test/unit_test/static/fixed_symbol_test.cpp @@ -0,0 +1,91 @@ +#include "units/symbol_text.h" + +using namespace units; + +namespace { + +constexpr basic_symbol_text sym1('b'); +static_assert(sym1 == 'b'); +static_assert(sym1 != 'a'); +static_assert(sym1 != "ab"); +static_assert(sym1 < 'c'); +static_assert(sym1 > 'a'); +static_assert(sym1 <= 'b'); +static_assert(sym1 <= 'c'); +static_assert(sym1 >= 'b'); +static_assert(sym1 >= 'a'); +static_assert(sym1.standard() == 'b'); +static_assert(sym1.ascii() == 'b'); + +constexpr basic_symbol_text sym2('a', 'b'); +static_assert(sym2 == 'a'); +static_assert(sym2 != 'b'); +static_assert(sym2.standard() == 'a'); +static_assert(sym2.ascii() == 'b'); + +constexpr basic_symbol_text sym3("ab"); +static_assert(sym3.standard() == "ab"); +static_assert(sym3.ascii() == "ab"); + +constexpr basic_fixed_string txt1("bc"); +constexpr basic_symbol_text sym4(txt1); +static_assert(sym4.standard() == "bc"); +static_assert(sym4.ascii() == "bc"); + +constexpr basic_symbol_text sym5("bc", "de"); +static_assert(sym5.standard() == "bc"); +static_assert(sym5.ascii() == "de"); + +constexpr basic_fixed_string txt2("de"); +constexpr basic_symbol_text sym6(txt1, txt2); +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("bcd", "ef")); +static_assert(sym6 != basic_symbol_text("bc", "def")); + +static_assert(sym6 == basic_fixed_string("bc")); +static_assert(sym6 != basic_fixed_string("de")); +static_assert(sym6 != basic_fixed_string("fg")); +static_assert(sym6 != basic_fixed_string("bcd")); + +static_assert(sym6 == "bc"); +static_assert(sym6 != "de"); +static_assert(sym6 != "fg"); +static_assert(sym6 != "bcd"); + +static_assert(sym6 < basic_fixed_string("c")); +static_assert(sym6 > basic_fixed_string("a")); +static_assert(sym6 <= basic_fixed_string("c")); +static_assert(sym6 <= basic_fixed_string("bcd")); +static_assert(sym6 >= basic_fixed_string("a")); +static_assert(sym6 >= basic_fixed_string("bc")); + +static_assert(sym6 < "c"); +static_assert(sym6 > "a"); +static_assert(sym6 <= "c"); +static_assert(sym6 <= "bcd"); +static_assert(sym6 >= "a"); +static_assert(sym6 >= "bc"); + +static_assert(basic_symbol_text("a") + sym4 == basic_symbol_text("abc")); +static_assert(sym4 + basic_symbol_text("f") == basic_symbol_text("bcf")); + +static_assert(basic_fixed_string("a") + sym4 == basic_symbol_text("abc")); +static_assert(sym4 + basic_fixed_string("f") == basic_symbol_text("bcf")); + +static_assert(basic_symbol_text("a", "f") + sym6 == basic_symbol_text("abc", "fde")); +static_assert(sym6 + basic_symbol_text("a", "f") == basic_symbol_text("bca", "def")); + +static_assert('a' + sym6 == basic_symbol_text("abc", "ade")); +static_assert(sym6 + 'f' == basic_symbol_text("bcf", "def")); + +static_assert(basic_fixed_string("a") + sym6 == basic_symbol_text("abc", "ade")); +static_assert(sym6 + basic_fixed_string("f") == basic_symbol_text("bcf", "def")); + +static_assert("a" + sym6 == basic_symbol_text("abc", "ade")); +static_assert(sym6 + "f" == basic_symbol_text("bcf", "def")); +}