xref: /llvm-project/libcxx/test/std/strings/string.view/string.view.comparison/comparison.verify.cpp (revision 9bb9ec380ace81d040d3a0a0a2ae9a75733ab330)
13818b4dfSMark de Wever //===----------------------------------------------------------------------===//
23818b4dfSMark de Wever //
33818b4dfSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43818b4dfSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
53818b4dfSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63818b4dfSMark de Wever //
73818b4dfSMark de Wever //===----------------------------------------------------------------------===//
83818b4dfSMark de Wever 
93818b4dfSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
103818b4dfSMark de Wever 
113818b4dfSMark de Wever // <string_view>
123818b4dfSMark de Wever 
133818b4dfSMark de Wever // template<class charT, class traits>
143818b4dfSMark de Wever //   constexpr auto operator<=>(basic_string_view<charT, traits> lhs, basic_string_view<charT, traits> rhs);
153818b4dfSMark de Wever //
163818b4dfSMark de Wever // LWG 3432
173818b4dfSMark de Wever // [string.view]/4
183818b4dfSMark de Wever // Mandates: R denotes a comparison category type ([cmp.categories]).
193818b4dfSMark de Wever 
203818b4dfSMark de Wever #include <string_view>
213818b4dfSMark de Wever 
223818b4dfSMark de Wever #include "test_macros.h"
233818b4dfSMark de Wever 
243818b4dfSMark de Wever template <class CharT, class Ordering>
253818b4dfSMark de Wever struct traits {
263818b4dfSMark de Wever   typedef CharT char_type;
273818b4dfSMark de Wever   typedef int int_type;
283818b4dfSMark de Wever   typedef std::streamoff off_type;
293818b4dfSMark de Wever   typedef std::streampos pos_type;
303818b4dfSMark de Wever   typedef std::mbstate_t state_type;
313818b4dfSMark de Wever   using comparison_category = Ordering;
323818b4dfSMark de Wever 
333818b4dfSMark de Wever   static constexpr void assign(char_type&, const char_type&) noexcept;
343818b4dfSMark de Wever   static constexpr bool eq(char_type&, const char_type&) noexcept;
353818b4dfSMark de Wever   static constexpr bool lt(char_type&, const char_type&) noexcept;
363818b4dfSMark de Wever 
comparetraits37fb855eb9SMark de Wever   static constexpr int compare(const char_type*, const char_type*, std::size_t) { return 0; }
38fb855eb9SMark de Wever   static constexpr std::size_t length(const char_type*);
39fb855eb9SMark de Wever   static constexpr const char_type* find(const char_type*, std::size_t, const char_type&);
40fb855eb9SMark de Wever   static constexpr char_type* move(char_type*, const char_type*, std::size_t);
41fb855eb9SMark de Wever   static constexpr char_type* copy(char_type*, const char_type*, std::size_t);
42fb855eb9SMark de Wever   static constexpr char_type* assign(char_type*, std::size_t, char_type);
433818b4dfSMark de Wever 
443818b4dfSMark de Wever   static constexpr int_type not_eof(int_type) noexcept;
453818b4dfSMark de Wever 
463818b4dfSMark de Wever   static constexpr char_type to_char_type(int_type) noexcept;
473818b4dfSMark de Wever 
483818b4dfSMark de Wever   static constexpr int_type to_int_type(char_type) noexcept;
493818b4dfSMark de Wever 
503818b4dfSMark de Wever   static constexpr bool eq_int_type(int_type, int_type) noexcept;
513818b4dfSMark de Wever 
523818b4dfSMark de Wever   static constexpr int_type eof() noexcept;
533818b4dfSMark de Wever };
543818b4dfSMark de Wever 
553818b4dfSMark de Wever template <class CharT, class Ordering, bool Valid>
test()563818b4dfSMark de Wever void test() {
573818b4dfSMark de Wever   using type = std::basic_string_view<CharT, traits<CharT, Ordering>>;
583818b4dfSMark de Wever   if constexpr (Valid)
593818b4dfSMark de Wever     type{} <=> type{};
603818b4dfSMark de Wever   else
613818b4dfSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
623818b4dfSMark de Wever   // These diagnostics are issued for
633818b4dfSMark de Wever   // - Every invalid ordering
643818b4dfSMark de Wever   // - Every type
65*9bb9ec38SLouis Dionne   // expected-error-re@string_view:* 15 {{static assertion failed{{.*}}return type is not a comparison category type}}
663818b4dfSMark de Wever 
673818b4dfSMark de Wever   // This diagnostic is not issued for Ordering == void.
683818b4dfSMark de Wever   // expected-error@string_view:* 10 {{no matching conversion for static_cast from}}
693818b4dfSMark de Wever #else
703818b4dfSMark de Wever   // One less test run when wchar_t is unavailable.
71*9bb9ec38SLouis Dionne   // expected-error-re@string_view:* 12 {{static assertion failed{{.*}}return type is not a comparison category type}}
723818b4dfSMark de Wever   // expected-error@string_view:* 8 {{no matching conversion for static_cast from}}
733818b4dfSMark de Wever #endif
743818b4dfSMark de Wever     type{} <=> type{};
753818b4dfSMark de Wever }
763818b4dfSMark de Wever 
773818b4dfSMark de Wever template <class CharT>
test_all_orders()783818b4dfSMark de Wever void test_all_orders() {
793818b4dfSMark de Wever   test<CharT, std::strong_ordering, true>();
803818b4dfSMark de Wever   test<CharT, std::weak_ordering, true>();
813818b4dfSMark de Wever   test<CharT, std::partial_ordering, true>();
823818b4dfSMark de Wever 
833818b4dfSMark de Wever   test<CharT, void, false>();
843818b4dfSMark de Wever   test<CharT, int, false>();
853818b4dfSMark de Wever   test<CharT, float, false>();
863818b4dfSMark de Wever }
873818b4dfSMark de Wever 
test_all_types()883818b4dfSMark de Wever void test_all_types() {
893818b4dfSMark de Wever   test_all_orders<char>();
903818b4dfSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
913818b4dfSMark de Wever   test_all_orders<wchar_t>();
923818b4dfSMark de Wever #endif
933818b4dfSMark de Wever   test_all_orders<char8_t>();
943818b4dfSMark de Wever   test_all_orders<char16_t>();
953818b4dfSMark de Wever   test_all_orders<char32_t>();
963818b4dfSMark de Wever }
97