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 | #ifndef _LIBCPP___FWD_STRING_H |
10 | #define _LIBCPP___FWD_STRING_H |
11 | |
12 | #include <__config> |
13 | #include <__fwd/memory.h> |
14 | #include <__fwd/memory_resource.h> |
15 | |
16 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
17 | # pragma GCC system_header |
18 | #endif |
19 | |
20 | _LIBCPP_BEGIN_NAMESPACE_STD |
21 | |
22 | template <class _CharT> |
23 | struct _LIBCPP_TEMPLATE_VIS char_traits; |
24 | template <> |
25 | struct char_traits<char>; |
26 | |
27 | #ifndef _LIBCPP_HAS_NO_CHAR8_T |
28 | template <> |
29 | struct char_traits<char8_t>; |
30 | #endif |
31 | |
32 | template <> |
33 | struct char_traits<char16_t>; |
34 | template <> |
35 | struct char_traits<char32_t>; |
36 | |
37 | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
38 | template <> |
39 | struct char_traits<wchar_t>; |
40 | #endif |
41 | |
42 | template <class _CharT, class _Traits = char_traits<_CharT>, class _Allocator = allocator<_CharT> > |
43 | class _LIBCPP_TEMPLATE_VIS basic_string; |
44 | |
45 | using string = basic_string<char>; |
46 | |
47 | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
48 | using wstring = basic_string<wchar_t>; |
49 | #endif |
50 | |
51 | #ifndef _LIBCPP_HAS_NO_CHAR8_T |
52 | using u8string = basic_string<char8_t>; |
53 | #endif |
54 | |
55 | using u16string = basic_string<char16_t>; |
56 | using u32string = basic_string<char32_t>; |
57 | |
58 | #if _LIBCPP_STD_VER >= 17 |
59 | |
60 | namespace pmr { |
61 | template <class _CharT, class _Traits = char_traits<_CharT>> |
62 | using basic_string _LIBCPP_AVAILABILITY_PMR = std::basic_string<_CharT, _Traits, polymorphic_allocator<_CharT>>; |
63 | |
64 | using string _LIBCPP_AVAILABILITY_PMR = basic_string<char>; |
65 | |
66 | # ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
67 | using wstring _LIBCPP_AVAILABILITY_PMR = basic_string<wchar_t>; |
68 | # endif |
69 | |
70 | # ifndef _LIBCPP_HAS_NO_CHAR8_T |
71 | using u8string _LIBCPP_AVAILABILITY_PMR = basic_string<char8_t>; |
72 | # endif |
73 | |
74 | using u16string _LIBCPP_AVAILABILITY_PMR = basic_string<char16_t>; |
75 | using u32string _LIBCPP_AVAILABILITY_PMR = basic_string<char32_t>; |
76 | } // namespace pmr |
77 | |
78 | #endif // _LIBCPP_STD_VER >= 17 |
79 | |
80 | // clang-format off |
81 | template <class _CharT, class _Traits, class _Allocator> |
82 | class _LIBCPP_PREFERRED_NAME(string) |
83 | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
84 | _LIBCPP_PREFERRED_NAME(wstring) |
85 | #endif |
86 | #ifndef _LIBCPP_HAS_NO_CHAR8_T |
87 | _LIBCPP_PREFERRED_NAME(u8string) |
88 | #endif |
89 | _LIBCPP_PREFERRED_NAME(u16string) |
90 | _LIBCPP_PREFERRED_NAME(u32string) |
91 | #if _LIBCPP_STD_VER >= 17 |
92 | _LIBCPP_PREFERRED_NAME(pmr::string) |
93 | # ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
94 | _LIBCPP_PREFERRED_NAME(pmr::wstring) |
95 | # endif |
96 | # ifndef _LIBCPP_HAS_NO_CHAR8_T |
97 | _LIBCPP_PREFERRED_NAME(pmr::u8string) |
98 | # endif |
99 | _LIBCPP_PREFERRED_NAME(pmr::u16string) |
100 | _LIBCPP_PREFERRED_NAME(pmr::u32string) |
101 | #endif |
102 | basic_string; |
103 | // clang-format on |
104 | |
105 | _LIBCPP_END_NAMESPACE_STD |
106 | |
107 | #endif // _LIBCPP___FWD_STRING_H |
108 | |