Skip to content

Commit 074e063

Browse files
committed
fix: move comparisons to hidden friends, fixes #24
1 parent 668c504 commit 074e063

File tree

2 files changed

+29
-80
lines changed

2 files changed

+29
-80
lines changed

include/beman/cstring_view/cstring_view.hpp

Lines changed: 28 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@
1818

1919
namespace beman {
2020

21-
namespace detail {
22-
23-
template <typename T>
24-
struct type_identity {
25-
using type = T;
26-
};
27-
28-
template <typename T>
29-
using type_identity_t = typename type_identity<T>::type;
30-
31-
} // namespace detail
32-
3321
// [cstring.view.template], class template basic_cstring_view
3422
template <class charT, class traits = std::char_traits<charT>>
3523
class basic_cstring_view; // partially freestanding
@@ -43,33 +31,6 @@ namespace ranges {
4331
}
4432
#endif
4533
*/
46-
// [cstring.view.comparison], non-member comparison functions
47-
template <class charT, class traits>
48-
constexpr bool operator==(basic_cstring_view<charT, traits> x,
49-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
50-
51-
#if __cpp_lib_three_way_comparison
52-
template <class charT, class traits>
53-
constexpr auto operator<=>(basic_cstring_view<charT, traits> x,
54-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
55-
#else
56-
template <class charT, class traits>
57-
constexpr bool operator!=(basic_cstring_view<charT, traits> x,
58-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
59-
template <class charT, class traits>
60-
constexpr bool operator<(basic_cstring_view<charT, traits> x,
61-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
62-
template <class charT, class traits>
63-
constexpr bool operator>(basic_cstring_view<charT, traits> x,
64-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
65-
template <class charT, class traits>
66-
constexpr bool operator<=(basic_cstring_view<charT, traits> x,
67-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
68-
template <class charT, class traits>
69-
constexpr bool operator>=(basic_cstring_view<charT, traits> x,
70-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept;
71-
#endif
72-
7334
// [cstring.view.io], inserters and extractors
7435
template <class charT, class traits>
7536
std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os,
@@ -344,6 +305,34 @@ class basic_cstring_view {
344305
return std::basic_string_view<charT, traits>(*this).find_last_not_of(s, pos);
345306
}
346307

308+
#if __cpp_lib_three_way_comparison
309+
friend constexpr bool operator==(basic_cstring_view x, basic_cstring_view y) noexcept {
310+
return std::basic_string_view<charT, traits>(x) == std::basic_string_view<charT, traits>(y);
311+
}
312+
friend constexpr auto operator<=>(basic_cstring_view x, basic_cstring_view y) noexcept {
313+
return std::basic_string_view<charT, traits>(x) <=> std::basic_string_view<charT, traits>(y);
314+
}
315+
#else
316+
friend constexpr bool operator==(basic_cstring_view x, basic_cstring_view y) noexcept {
317+
return std::basic_string_view<charT, traits>(x) == std::basic_string_view<charT, traits>(y);
318+
}
319+
friend constexpr bool operator!=(basic_cstring_view x, basic_cstring_view y) noexcept {
320+
return std::basic_string_view<charT, traits>(x) != std::basic_string_view<charT, traits>(y);
321+
}
322+
friend constexpr bool operator<(basic_cstring_view x, basic_cstring_view y) noexcept {
323+
return std::basic_string_view<charT, traits>(x) < std::basic_string_view<charT, traits>(y);
324+
}
325+
friend constexpr bool operator>(basic_cstring_view x, basic_cstring_view y) noexcept {
326+
return std::basic_string_view<charT, traits>(x) > std::basic_string_view<charT, traits>(y);
327+
}
328+
friend constexpr bool operator<=(basic_cstring_view x, basic_cstring_view y) noexcept {
329+
return std::basic_string_view<charT, traits>(x) <= std::basic_string_view<charT, traits>(y);
330+
}
331+
friend constexpr bool operator>=(basic_cstring_view x, basic_cstring_view y) noexcept {
332+
return std::basic_string_view<charT, traits>(x) >= std::basic_string_view<charT, traits>(y);
333+
}
334+
#endif
335+
347336
private:
348337
const_pointer data_; // exposition only
349338
size_type size_; // exposition only
@@ -370,47 +359,6 @@ constexpr wcstring_view operator""_csv(const wchar_t* str, size_t len) noexcept
370359
} // namespace cstring_view_literals
371360
} // namespace literals
372361

373-
template <class charT, class traits>
374-
constexpr bool operator==(basic_cstring_view<charT, traits> x,
375-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
376-
return std::basic_string_view<charT, traits>(x) == std::basic_string_view<charT, traits>(y);
377-
}
378-
379-
#if __cpp_lib_three_way_comparison
380-
template <class charT, class traits>
381-
constexpr auto operator<=>(basic_cstring_view<charT, traits> x,
382-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
383-
return std::basic_string_view<charT, traits>(x) <=> std::basic_string_view<charT, traits>(y);
384-
}
385-
#else
386-
template <class charT, class traits>
387-
constexpr bool operator!=(basic_cstring_view<charT, traits> x,
388-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
389-
return std::basic_string_view<charT, traits>(x) != std::basic_string_view<charT, traits>(y);
390-
}
391-
// Definitions
392-
template <class charT, class traits>
393-
constexpr bool operator<(basic_cstring_view<charT, traits> x,
394-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
395-
return std::basic_string_view<charT, traits>(x) < std::basic_string_view<charT, traits>(y);
396-
}
397-
template <class charT, class traits>
398-
constexpr bool operator>(basic_cstring_view<charT, traits> x,
399-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
400-
return std::basic_string_view<charT, traits>(x) > std::basic_string_view<charT, traits>(y);
401-
}
402-
template <class charT, class traits>
403-
constexpr bool operator<=(basic_cstring_view<charT, traits> x,
404-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
405-
return std::basic_string_view<charT, traits>(x) <= std::basic_string_view<charT, traits>(y);
406-
}
407-
template <class charT, class traits>
408-
constexpr bool operator>=(basic_cstring_view<charT, traits> x,
409-
detail::type_identity_t<basic_cstring_view<charT, traits>> y) noexcept {
410-
return std::basic_string_view<charT, traits>(x) >= std::basic_string_view<charT, traits>(y);
411-
}
412-
#endif
413-
414362
template <class charT, class traits>
415363
std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os,
416364
basic_cstring_view<charT, traits> str) {

tests/beman/cstring_view/cstring_view.test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ TEST(StringView, ConstructionDestruction) {
1717
EXPECT_NE(h1.c_str(), s.c_str());
1818
EXPECT_TRUE(h1 == h2);
1919
EXPECT_TRUE(h1 == s);
20+
EXPECT_TRUE(s == h1);
2021
#if __cpp_lib_starts_ends_with >= 201711L
2122
EXPECT_TRUE(h1.starts_with("he"));
2223
EXPECT_TRUE(h1.ends_with("lo"));

0 commit comments

Comments
 (0)