xref: /llvm-project/libcxx/test/std/strings/basic.string.hash/enabled_hashes.pass.cpp (revision 33325524f5e80a898a7ae875e208a54af132001b)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03
10 
11 // <string>
12 
13 // Test that <string> provides all of the arithmetic, enum, and pointer
14 // hash specializations.
15 
16 #include <string>
17 
18 #include "constexpr_char_traits.h"
19 #include "poisoned_hash_helper.h"
20 #include "test_allocator.h"
21 #include "test_macros.h"
22 
23 struct MyChar {
24   char c;
25 };
26 
27 template <>
28 struct std::char_traits<MyChar> {
29   using char_type  = MyChar;
30   using int_type   = std::char_traits<char>::int_type;
31   using off_type   = std::char_traits<char>::off_type;
32   using pos_type   = std::char_traits<char>::pos_type;
33   using state_type = std::char_traits<char>::state_type;
34 
35   static void assign(char_type&, const char_type&);
36   static bool eq(char_type, char_type);
37   static bool lt(char_type, char_type);
38 
39   static int compare(const char_type*, const char_type*, std::size_t);
40   static std::size_t length(const char_type*);
41   static const char_type* find(const char_type*, std::size_t, const char_type&);
42   static char_type* move(char_type*, const char_type*, std::size_t);
43   static char_type* copy(char_type*, const char_type*, std::size_t);
44   static char_type* assign(char_type*, std::size_t, char_type);
45 
46   static int_type not_eof(int_type);
47   static char_type to_char_type(int_type);
48   static int_type to_int_type(char_type);
49   static bool eq_int_type(int_type, int_type);
50   static int_type eof();
51 };
52 
53 int main(int, char**) {
54   test_library_hash_specializations_available();
55   {
56     test_hash_enabled<std::string>();
57 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
58     test_hash_enabled<std::wstring>();
59 #endif
60 #ifndef TEST_HAS_NO_CHAR8_T
61     test_hash_enabled<std::u8string>();
62 #endif
63     test_hash_enabled<std::u16string>();
64     test_hash_enabled<std::u32string>();
65     test_hash_enabled<std::basic_string<char, std::char_traits<char>, test_allocator<char>>>();
66     test_hash_disabled<std::basic_string<MyChar, std::char_traits<MyChar>, std::allocator<MyChar>>>();
67     test_hash_disabled<std::basic_string<char, constexpr_char_traits<char>, std::allocator<char>>>();
68   }
69 
70   return 0;
71 }
72