1818
1919namespace 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
3422template <class charT , class traits = std::char_traits<charT>>
3523class 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
7435template <class charT , class traits >
7536std::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-
414362template <class charT , class traits >
415363std::basic_ostream<charT, traits>& operator <<(std::basic_ostream<charT, traits>& os,
416364 basic_cstring_view<charT, traits> str) {
0 commit comments