From 3be8ee921e4297f75f4405eda058a8a0e5238a08 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 12 Feb 2020 09:48:04 +0100 Subject: [PATCH] Starship improvements after the latest gcc fixes --- example/measurement.cpp | 1 - .../units/bits/external/fixed_string.h | 47 +++++++------------ src/include/units/quantity.h | 1 - 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/example/measurement.cpp b/example/measurement.cpp index 935ef345..50ebd3b8 100644 --- a/example/measurement.cpp +++ b/example/measurement.cpp @@ -81,7 +81,6 @@ public: #if __GNUC__ >= 10 [[nodiscard]] friend constexpr auto operator<=>(const measurement& lhs, const measurement& rhs) = default; - [[nodiscard]] friend constexpr bool operator==(const measurement& lhs, const measurement& rhs) = default; // TODO op== not needed (gcc bug) #else diff --git a/src/include/units/bits/external/fixed_string.h b/src/include/units/bits/external/fixed_string.h index 45fb5919..bb152f3e 100644 --- a/src/include/units/bits/external/fixed_string.h +++ b/src/include/units/bits/external/fixed_string.h @@ -31,6 +31,9 @@ template struct basic_fixed_string { CharT data_[N + 1] = {}; + using iterator = CharT*; + using const_iterator = const CharT*; + constexpr basic_fixed_string(CharT ch) noexcept { data_[0] = ch; } constexpr basic_fixed_string(const CharT (&txt)[N + 1]) noexcept @@ -43,6 +46,11 @@ struct basic_fixed_string { [[nodiscard]] constexpr const CharT& operator[](std::size_t index) const noexcept { return data_[index]; } [[nodiscard]] constexpr CharT operator[](std::size_t index) noexcept { return data_[index]; } + [[nodiscard]] constexpr iterator begin() noexcept { return std::begin(data_); } + [[nodiscard]] constexpr const_iterator begin() const noexcept { return std::begin(data_); } + [[nodiscard]] constexpr iterator end() noexcept { return std::end(data_); } + [[nodiscard]] constexpr const_iterator end() const noexcept { return std::end(data_); } + template [[nodiscard]] constexpr friend basic_fixed_string operator+( const basic_fixed_string& lhs, const basic_fixed_string& rhs) noexcept @@ -57,41 +65,18 @@ struct basic_fixed_string { #if __GNUC__ >= 10 - [[nodiscard]] friend constexpr bool operator==(const basic_fixed_string& lhs, const basic_fixed_string& rhs) - { - for (size_t i = 0; i != lhs.size(); ++i) - if (lhs[i] != rhs[i]) return false; - return true; - } - - [[nodiscard]] friend constexpr bool operator!=(const basic_fixed_string&, const basic_fixed_string&) = default; - - template - [[nodiscard]] friend constexpr bool operator==(const basic_fixed_string&, const basic_fixed_string&) - { - return false; - } - - template - // TODO gcc-10 error: a template cannot be defaulted - // [[nodiscard]] friend constexpr bool operator!=(const basic_fixed_string&, - // const basic_fixed_string&) = default; - [[nodiscard]] friend constexpr bool operator!=(const basic_fixed_string&, const basic_fixed_string&) - { - return true; - } - template [[nodiscard]] friend constexpr auto operator<=>(const basic_fixed_string& lhs, const basic_fixed_string& rhs) { - size_t min_size = std::min(lhs.size(), rhs.size()); - for (size_t i = 0; i != min_size; ++i) { - if (auto const cmp = lhs[i] <=> rhs[i]; cmp != 0) { - return cmp; - } - } - return lhs.size() <=> rhs.size(); + return std::lexicographical_compare_three_way(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); + } + + template + [[nodiscard]] friend constexpr bool operator==(const basic_fixed_string& lhs, + const basic_fixed_string& rhs) + { + return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()); } #else diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index dc6ac1ff..17f9bb69 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -235,7 +235,6 @@ public: return cq(lhs).count() <=> cq(rhs).count(); } - // TODO op== not needed (gcc bug) template [[nodiscard]] friend constexpr auto operator==(const quantity& lhs, const quantity& rhs) requires equivalent_dim &&