107163879Schristos // { dg-options "-std=gnu++17" }
207163879Schristos 
3*1424dfb3Schristos // Copyright (C) 2013-2020 Free Software Foundation, Inc.
407163879Schristos //
507163879Schristos // This file is part of the GNU ISO C++ Library.  This library is free
607163879Schristos // software; you can redistribute it and/or modify it under the
707163879Schristos // terms of the GNU General Public License as published by the
807163879Schristos // Free Software Foundation; either version 3, or (at your option)
907163879Schristos // any later version.
1007163879Schristos 
1107163879Schristos // This library is distributed in the hope that it will be useful,
1207163879Schristos // but WITHOUT ANY WARRANTY; without even the implied warranty of
1307163879Schristos // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1407163879Schristos // GNU General Public License for more details.
1507163879Schristos 
1607163879Schristos // You should have received a copy of the GNU General Public License along
1707163879Schristos // with this library; see the file COPYING3.  If not see
1807163879Schristos // <http://www.gnu.org/licenses/>.
1907163879Schristos 
2007163879Schristos // basic_string_view non-member functions
2107163879Schristos 
2207163879Schristos // operator==
2307163879Schristos /*
2407163879Schristos template<class charT, class traits, class Allocator>
2507163879Schristos   bool operator==(const basic_string_view<charT,traits,Allocator>& lhs,
2607163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
2707163879Schristos 
2807163879Schristos template<class charT, class traits, class Allocator>
2907163879Schristos   bool operator==(const charT* lhs,
3007163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
3107163879Schristos 
3207163879Schristos template<class charT, class traits, class Allocator>
3307163879Schristos   bool operator==(const basic_string_view<charT,traits,Allocator>& lhs,
3407163879Schristos                   const charT* rhs);
3507163879Schristos */
3607163879Schristos 
3707163879Schristos // operator!=
3807163879Schristos /*
3907163879Schristos template<class charT, class traits, class Allocator>
4007163879Schristos   bool operator!=(const basic_string_view<charT,traits,Allocator>& lhs,
4107163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
4207163879Schristos 
4307163879Schristos template<class charT, class traits, class Allocator>
4407163879Schristos   bool operator!=(const charT* lhs,
4507163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
4607163879Schristos 
4707163879Schristos template<class charT, class traits, class Allocator>
4807163879Schristos   bool operator!=(const basic_string_view<charT,traits,Allocator>& lhs,
4907163879Schristos                   const charT* rhs);
5007163879Schristos */
5107163879Schristos 
5207163879Schristos // operator<
5307163879Schristos /*
5407163879Schristos template<class charT, class traits, class Allocator>
5507163879Schristos   bool operator< (const basic_string_view<charT,traits,Allocator>& lhs,
5607163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
5707163879Schristos 
5807163879Schristos template<class charT, class traits, class Allocator>
5907163879Schristos   bool operator< (const basic_string_view<charT,traits,Allocator>& lhs,
6007163879Schristos                   const charT* rhs);
6107163879Schristos 
6207163879Schristos template<class charT, class traits, class Allocator>
6307163879Schristos   bool operator< (const charT* lhs,
6407163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
6507163879Schristos */
6607163879Schristos 
6707163879Schristos // operator>
6807163879Schristos /*
6907163879Schristos template<class charT, class traits, class Allocator>
7007163879Schristos   bool operator> (const basic_string_view<charT,traits,Allocator>& lhs,
7107163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
7207163879Schristos 
7307163879Schristos template<class charT, class traits, class Allocator>
7407163879Schristos   bool operator> (const basic_string_view<charT,traits,Allocator>& lhs,
7507163879Schristos                   const charT* rhs);
7607163879Schristos 
7707163879Schristos template<class charT, class traits, class Allocator>
7807163879Schristos   bool operator> (const charT* lhs,
7907163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
8007163879Schristos */
8107163879Schristos 
8207163879Schristos // operator<=
8307163879Schristos /*
8407163879Schristos template<class charT, class traits, class Allocator>
8507163879Schristos   bool operator<=(const basic_string_view<charT,traits,Allocator>& lhs,
8607163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
8707163879Schristos 
8807163879Schristos template<class charT, class traits, class Allocator>
8907163879Schristos   bool operator<=(const basic_string_view<charT,traits,Allocator>& lhs,
9007163879Schristos                   const charT* rhs);
9107163879Schristos 
9207163879Schristos template<class charT, class traits, class Allocator>
9307163879Schristos   bool operator<=(const charT* lhs,
9407163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
9507163879Schristos */
9607163879Schristos 
9707163879Schristos // operator>=
9807163879Schristos /*
9907163879Schristos template<class charT, class traits, class Allocator>
10007163879Schristos   bool operator>=(const basic_string_view<charT,traits,Allocator>& lhs,
10107163879Schristos                 const basic_string_view<charT,traits,Allocator>& rhs);
10207163879Schristos 
10307163879Schristos template<class charT, class traits, class Allocator>
10407163879Schristos   bool operator>=(const basic_string_view<charT,traits,Allocator>& lhs,
10507163879Schristos                   const charT* rhs);
10607163879Schristos 
10707163879Schristos template<class charT, class traits, class Allocator>
10807163879Schristos   bool operator>=(const charT* lhs,
10907163879Schristos                   const basic_string_view<charT,traits,Allocator>& rhs);
11007163879Schristos */
11107163879Schristos 
11207163879Schristos #include <string_view>
11307163879Schristos #include <testsuite_hooks.h>
11407163879Schristos 
11507163879Schristos void
test01()11607163879Schristos test01()
11707163879Schristos {
11807163879Schristos   std::wstring_view 	str_0(L"costa rica");
11907163879Schristos   std::wstring_view 	str_1(L"costa marbella");
12007163879Schristos   std::wstring_view 	str_2(L"cost");
12107163879Schristos   std::wstring_view	str_3(L"costa ricans");
12207163879Schristos   std::wstring_view  str_4;
12307163879Schristos 
12407163879Schristos   str_4 = str_0;
12507163879Schristos   //comparisons between string_view objects
12607163879Schristos   VERIFY( !(str_0 == str_1) );
12707163879Schristos   VERIFY( !(str_0 == str_2) );
12807163879Schristos   VERIFY( !(str_0 == str_3) );
12907163879Schristos   VERIFY( !(str_1 == str_0) );
13007163879Schristos   VERIFY( !(str_2 == str_0) );
13107163879Schristos   VERIFY( !(str_3 == str_0) );
13207163879Schristos   VERIFY( str_4 == str_0 );
13307163879Schristos   VERIFY( str_0 == str_4 );
13407163879Schristos 
13507163879Schristos   VERIFY( str_0 != str_1 );
13607163879Schristos   VERIFY( str_0 != str_2 );
13707163879Schristos   VERIFY( str_0 != str_3 );
13807163879Schristos   VERIFY( str_1 != str_0 );
13907163879Schristos   VERIFY( str_2 != str_0 );
14007163879Schristos   VERIFY( str_3 != str_0 );
14107163879Schristos   VERIFY( !(str_0 != str_4) );
14207163879Schristos   VERIFY( !(str_4 != str_0) );
14307163879Schristos 
14407163879Schristos   VERIFY( str_0 > str_1 ); //true cuz r>m
14507163879Schristos   VERIFY( str_0 > str_2 );
14607163879Schristos   VERIFY( !(str_0 > str_3) );
14707163879Schristos   VERIFY( !(str_1 > str_0) ); //false cuz m<r
14807163879Schristos   VERIFY( !(str_2 > str_0) );
14907163879Schristos   VERIFY( str_3 > str_0 );
15007163879Schristos   VERIFY( !(str_0 > str_4) );
15107163879Schristos   VERIFY( !(str_4 > str_0) );
15207163879Schristos 
15307163879Schristos   VERIFY( !(str_0 < str_1) ); //false cuz r>m
15407163879Schristos   VERIFY( !(str_0 < str_2) );
15507163879Schristos   VERIFY( str_0 < str_3 );
15607163879Schristos   VERIFY( str_1 < str_0 ); //true cuz m<r
15707163879Schristos   VERIFY( str_2 < str_0 );
15807163879Schristos   VERIFY( !(str_3 < str_0) );
15907163879Schristos   VERIFY( !(str_0 < str_4) );
16007163879Schristos   VERIFY( !(str_4 < str_0) );
16107163879Schristos 
16207163879Schristos   VERIFY( str_0 >= str_1 ); //true cuz r>m
16307163879Schristos   VERIFY( str_0 >= str_2 );
16407163879Schristos   VERIFY( !(str_0 >= str_3) );
16507163879Schristos   VERIFY( !(str_1 >= str_0) );//false cuz m<r
16607163879Schristos   VERIFY( !(str_2 >= str_0) );
16707163879Schristos   VERIFY( str_3 >= str_0 );
16807163879Schristos   VERIFY( str_0 >= str_4 );
16907163879Schristos   VERIFY( str_4 >= str_0 );
17007163879Schristos 
17107163879Schristos   VERIFY( !(str_0 <= str_1) );//false cuz r>m
17207163879Schristos   VERIFY( !(str_0 <= str_2) );
17307163879Schristos   VERIFY( str_0 <= str_3 );
17407163879Schristos   VERIFY( str_1 <= str_0 );//true cuz m<r
17507163879Schristos   VERIFY( str_2 <= str_0 );
17607163879Schristos   VERIFY( !(str_3 <= str_0) );
17707163879Schristos   VERIFY( str_0 <= str_4 );
17807163879Schristos   VERIFY( str_4 <= str_0 );
17907163879Schristos 
18007163879Schristos   //comparisons between string_view object and string_view literal
18107163879Schristos   VERIFY( !(str_0 == L"costa marbella") );
18207163879Schristos   VERIFY( !(str_0 == L"cost") );
18307163879Schristos   VERIFY( !(str_0 == L"costa ricans") );
18407163879Schristos   VERIFY( !(L"costa marbella" == str_0) );
18507163879Schristos   VERIFY( !(L"cost" == str_0) );
18607163879Schristos   VERIFY( !(L"costa ricans" == str_0) );
18707163879Schristos   VERIFY( L"costa rica" == str_0 );
18807163879Schristos   VERIFY( str_0 == L"costa rica" );
18907163879Schristos 
19007163879Schristos   VERIFY( str_0 != L"costa marbella" );
19107163879Schristos   VERIFY( str_0 != L"cost" );
19207163879Schristos   VERIFY( str_0 != L"costa ricans" );
19307163879Schristos   VERIFY( L"costa marbella" != str_0 );
19407163879Schristos   VERIFY( L"cost" != str_0 );
19507163879Schristos   VERIFY( L"costa ricans" != str_0 );
19607163879Schristos   VERIFY( !(L"costa rica" != str_0) );
19707163879Schristos   VERIFY( !(str_0 != L"costa rica") );
19807163879Schristos 
19907163879Schristos   VERIFY( str_0 > L"costa marbella" ); //true cuz r>m
20007163879Schristos   VERIFY( str_0 > L"cost" );
20107163879Schristos   VERIFY( !(str_0 > L"costa ricans") );
20207163879Schristos   VERIFY( !(L"costa marbella" > str_0) );//false cuz m<r
20307163879Schristos   VERIFY( !(L"cost" > str_0) );
20407163879Schristos   VERIFY( L"costa ricans" > str_0 );
20507163879Schristos   VERIFY( !(L"costa rica" > str_0) );
20607163879Schristos   VERIFY( !(str_0 > L"costa rica") );
20707163879Schristos 
20807163879Schristos   VERIFY( !(str_0 < L"costa marbella") );//false cuz r>m
20907163879Schristos   VERIFY( !(str_0 < L"cost") );
21007163879Schristos   VERIFY( str_0 < L"costa ricans" );
21107163879Schristos   VERIFY( L"costa marbella" < str_0 );//true cuz m<r
21207163879Schristos   VERIFY( L"cost" < str_0 );
21307163879Schristos   VERIFY( !(L"costa ricans" < str_0) );
21407163879Schristos   VERIFY( !(L"costa rica" < str_0) );
21507163879Schristos   VERIFY( !(str_0 < L"costa rica") );
21607163879Schristos 
21707163879Schristos   VERIFY( str_0 >= L"costa marbella" );//true cuz r>m
21807163879Schristos   VERIFY( str_0 >= L"cost" );
21907163879Schristos   VERIFY( !(str_0 >= L"costa ricans") );
22007163879Schristos   VERIFY( !(L"costa marbella" >= str_0) );//false cuz m<r
22107163879Schristos   VERIFY( !(L"cost" >= str_0) );
22207163879Schristos   VERIFY( L"costa ricans" >= str_0 );
22307163879Schristos   VERIFY( L"costa rica" >= str_0 );
22407163879Schristos   VERIFY( str_0 >= L"costa rica" );
22507163879Schristos 
22607163879Schristos   VERIFY( !(str_0 <= L"costa marbella") );//false cuz r>m
22707163879Schristos   VERIFY( !(str_0 <= L"cost") );
22807163879Schristos   VERIFY( str_0 <= L"costa ricans" );
22907163879Schristos   VERIFY( L"costa marbella" <= str_0 );//true cuz m<r
23007163879Schristos   VERIFY( L"cost" <= str_0 );
23107163879Schristos   VERIFY( !(L"costa ricans" <= str_0) );
23207163879Schristos   VERIFY( L"costa rica" <= str_0 );
23307163879Schristos   VERIFY( str_0 <= L"costa rica" );
23407163879Schristos }
23507163879Schristos 
23607163879Schristos constexpr bool
test02()23707163879Schristos test02()
23807163879Schristos {
23907163879Schristos   std::wstring_view 	str_0(L"costa rica");
24007163879Schristos   std::wstring_view 	str_1(L"costa marbella");
24107163879Schristos   std::wstring_view 	str_2(L"cost");
24207163879Schristos   std::wstring_view	str_3(L"costa ricans");
24307163879Schristos   std::wstring_view  str_4;
24407163879Schristos 
24507163879Schristos #undef VERIFY
24607163879Schristos #define VERIFY(x) if (!(x)) return false
24707163879Schristos 
24807163879Schristos   str_4 = str_0;
24907163879Schristos   //comparisons between string_view objects
25007163879Schristos   VERIFY( !(str_0 == str_1) );
25107163879Schristos   VERIFY( !(str_0 == str_2) );
25207163879Schristos   VERIFY( !(str_0 == str_3) );
25307163879Schristos   VERIFY( !(str_1 == str_0) );
25407163879Schristos   VERIFY( !(str_2 == str_0) );
25507163879Schristos   VERIFY( !(str_3 == str_0) );
25607163879Schristos   VERIFY( str_4 == str_0 );
25707163879Schristos   VERIFY( str_0 == str_4 );
25807163879Schristos 
25907163879Schristos   VERIFY( str_0 != str_1 );
26007163879Schristos   VERIFY( str_0 != str_2 );
26107163879Schristos   VERIFY( str_0 != str_3 );
26207163879Schristos   VERIFY( str_1 != str_0 );
26307163879Schristos   VERIFY( str_2 != str_0 );
26407163879Schristos   VERIFY( str_3 != str_0 );
26507163879Schristos   VERIFY( !(str_0 != str_4) );
26607163879Schristos   VERIFY( !(str_4 != str_0) );
26707163879Schristos 
26807163879Schristos   VERIFY( str_0 > str_1 ); //true cuz r>m
26907163879Schristos   VERIFY( str_0 > str_2 );
27007163879Schristos   VERIFY( !(str_0 > str_3) );
27107163879Schristos   VERIFY( !(str_1 > str_0) ); //false cuz m<r
27207163879Schristos   VERIFY( !(str_2 > str_0) );
27307163879Schristos   VERIFY( str_3 > str_0 );
27407163879Schristos   VERIFY( !(str_0 > str_4) );
27507163879Schristos   VERIFY( !(str_4 > str_0) );
27607163879Schristos 
27707163879Schristos   VERIFY( !(str_0 < str_1) ); //false cuz r>m
27807163879Schristos   VERIFY( !(str_0 < str_2) );
27907163879Schristos   VERIFY( str_0 < str_3 );
28007163879Schristos   VERIFY( str_1 < str_0 ); //true cuz m<r
28107163879Schristos   VERIFY( str_2 < str_0 );
28207163879Schristos   VERIFY( !(str_3 < str_0) );
28307163879Schristos   VERIFY( !(str_0 < str_4) );
28407163879Schristos   VERIFY( !(str_4 < str_0) );
28507163879Schristos 
28607163879Schristos   VERIFY( str_0 >= str_1 ); //true cuz r>m
28707163879Schristos   VERIFY( str_0 >= str_2 );
28807163879Schristos   VERIFY( !(str_0 >= str_3) );
28907163879Schristos   VERIFY( !(str_1 >= str_0) );//false cuz m<r
29007163879Schristos   VERIFY( !(str_2 >= str_0) );
29107163879Schristos   VERIFY( str_3 >= str_0 );
29207163879Schristos   VERIFY( str_0 >= str_4 );
29307163879Schristos   VERIFY( str_4 >= str_0 );
29407163879Schristos 
29507163879Schristos   VERIFY( !(str_0 <= str_1) );//false cuz r>m
29607163879Schristos   VERIFY( !(str_0 <= str_2) );
29707163879Schristos   VERIFY( str_0 <= str_3 );
29807163879Schristos   VERIFY( str_1 <= str_0 );//true cuz m<r
29907163879Schristos   VERIFY( str_2 <= str_0 );
30007163879Schristos   VERIFY( !(str_3 <= str_0) );
30107163879Schristos   VERIFY( str_0 <= str_4 );
30207163879Schristos   VERIFY( str_4 <= str_0 );
30307163879Schristos 
30407163879Schristos   //comparisons between string_view object and string_view literal
30507163879Schristos   VERIFY( !(str_0 == L"costa marbella") );
30607163879Schristos   VERIFY( !(str_0 == L"cost") );
30707163879Schristos   VERIFY( !(str_0 == L"costa ricans") );
30807163879Schristos   VERIFY( !(L"costa marbella" == str_0) );
30907163879Schristos   VERIFY( !(L"cost" == str_0) );
31007163879Schristos   VERIFY( !(L"costa ricans" == str_0) );
31107163879Schristos   VERIFY( L"costa rica" == str_0 );
31207163879Schristos   VERIFY( str_0 == L"costa rica" );
31307163879Schristos 
31407163879Schristos   VERIFY( str_0 != L"costa marbella" );
31507163879Schristos   VERIFY( str_0 != L"cost" );
31607163879Schristos   VERIFY( str_0 != L"costa ricans" );
31707163879Schristos   VERIFY( L"costa marbella" != str_0 );
31807163879Schristos   VERIFY( L"cost" != str_0 );
31907163879Schristos   VERIFY( L"costa ricans" != str_0 );
32007163879Schristos   VERIFY( !(L"costa rica" != str_0) );
32107163879Schristos   VERIFY( !(str_0 != L"costa rica") );
32207163879Schristos 
32307163879Schristos   VERIFY( str_0 > L"costa marbella" ); //true cuz r>m
32407163879Schristos   VERIFY( str_0 > L"cost" );
32507163879Schristos   VERIFY( !(str_0 > L"costa ricans") );
32607163879Schristos   VERIFY( !(L"costa marbella" > str_0) );//false cuz m<r
32707163879Schristos   VERIFY( !(L"cost" > str_0) );
32807163879Schristos   VERIFY( L"costa ricans" > str_0 );
32907163879Schristos   VERIFY( !(L"costa rica" > str_0) );
33007163879Schristos   VERIFY( !(str_0 > L"costa rica") );
33107163879Schristos 
33207163879Schristos   VERIFY( !(str_0 < L"costa marbella") );//false cuz r>m
33307163879Schristos   VERIFY( !(str_0 < L"cost") );
33407163879Schristos   VERIFY( str_0 < L"costa ricans" );
33507163879Schristos   VERIFY( L"costa marbella" < str_0 );//true cuz m<r
33607163879Schristos   VERIFY( L"cost" < str_0 );
33707163879Schristos   VERIFY( !(L"costa ricans" < str_0) );
33807163879Schristos   VERIFY( !(L"costa rica" < str_0) );
33907163879Schristos   VERIFY( !(str_0 < L"costa rica") );
34007163879Schristos 
34107163879Schristos   VERIFY( str_0 >= L"costa marbella" );//true cuz r>m
34207163879Schristos   VERIFY( str_0 >= L"cost" );
34307163879Schristos   VERIFY( !(str_0 >= L"costa ricans") );
34407163879Schristos   VERIFY( !(L"costa marbella" >= str_0) );//false cuz m<r
34507163879Schristos   VERIFY( !(L"cost" >= str_0) );
34607163879Schristos   VERIFY( L"costa ricans" >= str_0 );
34707163879Schristos   VERIFY( L"costa rica" >= str_0 );
34807163879Schristos   VERIFY( str_0 >= L"costa rica" );
34907163879Schristos 
35007163879Schristos   VERIFY( !(str_0 <= L"costa marbella") );//false cuz r>m
35107163879Schristos   VERIFY( !(str_0 <= L"cost") );
35207163879Schristos   VERIFY( str_0 <= L"costa ricans" );
35307163879Schristos   VERIFY( L"costa marbella" <= str_0 );//true cuz m<r
35407163879Schristos   VERIFY( L"cost" <= str_0 );
35507163879Schristos   VERIFY( !(L"costa ricans" <= str_0) );
35607163879Schristos   VERIFY( L"costa rica" <= str_0 );
35707163879Schristos   VERIFY( str_0 <= L"costa rica" );
35807163879Schristos 
35907163879Schristos   return true;
36007163879Schristos }
36107163879Schristos 
36207163879Schristos int
main()36307163879Schristos main()
36407163879Schristos {
36507163879Schristos   test01();
36607163879Schristos   static_assert( test02() );
36707163879Schristos }
368