18namespace hi {
inline namespace v1 {
22constexpr auto cp_1252_make_table_0000_02DC() noexcept
25 for (
auto i = 0x0; i != 0x2dd; ++i) {
28 for (
auto i = 0_uz; i != 0x80; ++i) {
29 r[i] = char_cast<uint8_t>(i);
36 for (
auto i = 0xa0; i != 0x100; ++i) {
37 r[i] = char_cast<uint8_t>(i);
55constexpr auto cp_1252_make_table_2000_2122() noexcept
58 for (
auto i = 0x0; i != 0x123; ++i) {
91 using char_type = char;
93 [[nodiscard]]
constexpr std::endian guess_endian(
void const *ptr,
size_t size, std::endian endian)
const noexcept
95 return std::endian::native;
98 template<
typename It,
typename EndIt>
103 hilet c = char_cast<char8_t>(*it++);
105 case 0x80:
return {0x20ac,
true};
106 case 0x81:
return {0x81,
true};
107 case 0x82:
return {0x201a,
true};
108 case 0x83:
return {0x0192,
true};
109 case 0x84:
return {0x201e,
true};
110 case 0x85:
return {0x2026,
true};
111 case 0x86:
return {0x2020,
true};
112 case 0x87:
return {0x2021,
true};
113 case 0x88:
return {0x02c6,
true};
114 case 0x89:
return {0x2030,
true};
115 case 0x8a:
return {0x0160,
true};
116 case 0x8b:
return {0x2039,
true};
117 case 0x8c:
return {0x0152,
true};
118 case 0x8d:
return {0x8d,
true};
119 case 0x8e:
return {0x017d,
true};
120 case 0x8f:
return {0x8f,
true};
122 case 0x90:
return {0x90,
true};
123 case 0x91:
return {0x2018,
true};
124 case 0x92:
return {0x2019,
true};
125 case 0x93:
return {0x201c,
true};
126 case 0x94:
return {0x201d,
true};
127 case 0x95:
return {0x2022,
true};
128 case 0x96:
return {0x2013,
true};
129 case 0x97:
return {0x2014,
true};
130 case 0x98:
return {0x02dc,
true};
131 case 0x99:
return {0x2122,
true};
132 case 0x9a:
return {0x0161,
true};
133 case 0x9b:
return {0x203a,
true};
134 case 0x9c:
return {0x0153,
true};
135 case 0x9d:
return {0x9d,
true};
136 case 0x9e:
return {0x017e,
true};
137 case 0x9f:
return {0x0178,
true};
138 default:
return {c,
true};
143 constexpr static auto range_0000_02DC = detail::cp_1252_make_table_0000_02DC();
144 constexpr static auto range_2000_2122 = detail::cp_1252_make_table_2000_2122();
149 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
151 if (code_point < 0x2dd) {
152 if (code_point == 0x3f) {
153 return {uint8_t{1},
true};
155 return {uint8_t{1}, range_0000_02DC[code_point] != 0x3f};
157 }
else if (code_point < 0x2000) {
158 return {uint8_t{1},
false};
160 }
else if (code_point < 0x2123) {
161 return {uint8_t{1}, range_2000_2122[code_point - 0x2000] != 0x3f};
164 return {uint8_t{1},
false};
168 template<
typename It>
169 constexpr void write(
char32_t code_point, It& dst)
const noexcept
172 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
174 if (code_point < 0x2dd) {
175 *dst++ = char_cast<char_type>(range_0000_02DC[code_point]);
177 }
else if (code_point < 0x2000) {
178 *dst++ = char_cast<char_type>(0x3f);
180 }
else if (code_point < 0x2123) {
181 *dst++ = char_cast<char_type>(range_2000_2122[code_point - 0x2000]);
184 *dst++ = char_cast<char_type>(0x3f);
188#if defined(HI_HAS_SSE2)
189 template<
typename It>
190 hi_force_inline __m128i read_ascii_chunk16(It it)
const noexcept
192 return _mm_loadu_si128(
reinterpret_cast<__m128i
const *
>(
std::addressof(*it)));
195 template<
typename It>
196 hi_force_inline
void write_ascii_chunk16(__m128i chunk, It dst)
const noexcept
198 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(
std::addressof(*dst)), chunk);
#define hi_axiom(expression)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
Utilities used by the HikoGUI library itself.
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
Functions and macros for handling architectural difference between compilers, CPUs and operating syst...
Definition of the char_converter<From,To> functor.
@ read
Allow read access to a file.
@ write
Allow write access to a file.
DOXYGEN BUG.
Definition algorithm.hpp:15
The HikoGUI namespace.
Definition ascii.hpp:19
Character encoder/decoder template.
Definition char_converter.hpp:85