HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
cp_1252.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
9#pragma once
10
11#include "char_converter.hpp"
12#include "../utility/utility.hpp"
13#include "../macros.hpp"
14#include <cstdint>
15#include <utility>
16
17
18
19namespace hi { inline namespace v1 {
20
21namespace detail {
22
23constexpr auto cp_1252_make_table_0000_02DC() noexcept
24{
26 for (auto i = 0x0; i != 0x2dd; ++i) {
27 r[i] = 0x3f; // '?'
28 }
29 for (auto i = 0_uz; i != 0x80; ++i) {
30 r[i] = char_cast<uint8_t>(i);
31 }
32 r[0x81] = 0x81;
33 r[0x8d] = 0x8d;
34 r[0x8f] = 0x8f;
35 r[0x90] = 0x90;
36 r[0x9d] = 0x9d;
37 for (auto i = 0xa0; i != 0x100; ++i) {
38 r[i] = char_cast<uint8_t>(i);
39 }
40
41 r[0x192] = 0x83;
42 r[0x2c6] = 0x88;
43 r[0x160] = 0x8a;
44 r[0x152] = 0x8c;
45 r[0x17d] = 0x8e;
46
47 r[0x2dc] = 0x98;
48 r[0x161] = 0x9a;
49 r[0x153] = 0x9c;
50 r[0x17e] = 0x9e;
51 r[0x178] = 0x9f;
52
53 return r;
54}
55
56constexpr auto cp_1252_make_table_2000_2122() noexcept
57{
59 for (auto i = 0x0; i != 0x123; ++i) {
60 r[i] = 0x3f; // '?'
61 }
62
63 r[0xac] = 0x80;
64 r[0x1a] = 0x82;
65 r[0x1e] = 0x84;
66 r[0x26] = 0x85;
67 r[0x20] = 0x86;
68 r[0x21] = 0x87;
69 r[0x30] = 0x89;
70 r[0x39] = 0x8b;
71
72 r[0x18] = 0x91;
73 r[0x19] = 0x92;
74 r[0x1c] = 0x93;
75 r[0x1d] = 0x94;
76 r[0x22] = 0x95;
77 r[0x13] = 0x96;
78 r[0x14] = 0x97;
79 r[0x122] = 0x99;
80 r[0x3a] = 0x9b;
81
82 return r;
83}
84
85} // namespace detail
86
90template<>
91struct char_map<"cp-1252"> {
92 using char_type = char;
93
94 [[nodiscard]] constexpr std::endian guess_endian(void const *ptr, size_t size, std::endian endian) const noexcept
95 {
96 return std::endian::native;
97 }
98
99 template<typename It, typename EndIt>
100 [[nodiscard]] constexpr std::pair<char32_t, bool> read(It& it, EndIt last) const noexcept
101 {
102 // clang-format off
103 hi_axiom(it != last);
104 hilet c = char_cast<char8_t>(*it++);
105 switch (c) {
106 case 0x80: return {0x20ac, true};
107 case 0x81: return {0x81, true};
108 case 0x82: return {0x201a, true};
109 case 0x83: return {0x0192, true};
110 case 0x84: return {0x201e, true};
111 case 0x85: return {0x2026, true};
112 case 0x86: return {0x2020, true};
113 case 0x87: return {0x2021, true};
114 case 0x88: return {0x02c6, true};
115 case 0x89: return {0x2030, true};
116 case 0x8a: return {0x0160, true};
117 case 0x8b: return {0x2039, true};
118 case 0x8c: return {0x0152, true};
119 case 0x8d: return {0x8d, true};
120 case 0x8e: return {0x017d, true};
121 case 0x8f: return {0x8f, true};
122
123 case 0x90: return {0x90, true};
124 case 0x91: return {0x2018, true};
125 case 0x92: return {0x2019, true};
126 case 0x93: return {0x201c, true};
127 case 0x94: return {0x201d, true};
128 case 0x95: return {0x2022, true};
129 case 0x96: return {0x2013, true};
130 case 0x97: return {0x2014, true};
131 case 0x98: return {0x02dc, true};
132 case 0x99: return {0x2122, true};
133 case 0x9a: return {0x0161, true};
134 case 0x9b: return {0x203a, true};
135 case 0x9c: return {0x0153, true};
136 case 0x9d: return {0x9d, true};
137 case 0x9e: return {0x017e, true};
138 case 0x9f: return {0x0178, true};
139 default: return {c, true};
140 }
141 // clang-format on
142 }
143
144 constexpr static auto range_0000_02DC = detail::cp_1252_make_table_0000_02DC();
145 constexpr static auto range_2000_2122 = detail::cp_1252_make_table_2000_2122();
146
147 [[nodiscard]] constexpr std::pair<uint8_t, bool> size(char32_t code_point) const noexcept
148 {
149 hi_axiom(code_point < 0x11'0000);
150 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
151
152 if (code_point < 0x2dd) {
153 if (code_point == 0x3f) {
154 return {uint8_t{1}, true};
155 } else {
156 return {uint8_t{1}, range_0000_02DC[code_point] != 0x3f};
157 }
158 } else if (code_point < 0x2000) {
159 return {uint8_t{1}, false};
160
161 } else if (code_point < 0x2123) {
162 return {uint8_t{1}, range_2000_2122[wide_cast<size_t>(code_point) - 0x2000] != 0x3f};
163
164 } else {
165 return {uint8_t{1}, false};
166 }
167 }
168
169 template<typename It>
170 constexpr void write(char32_t code_point, It& dst) const noexcept
171 {
172 hi_axiom(code_point < 0x11'0000);
173 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
174
175 if (code_point < 0x2dd) {
176 *dst++ = char_cast<char_type>(range_0000_02DC[code_point]);
177
178 } else if (code_point < 0x2000) {
179 *dst++ = char_cast<char_type>(0x3f);
180
181 } else if (code_point < 0x2123) {
182 *dst++ = char_cast<char_type>(range_2000_2122[code_point - 0x2000]);
183
184 } else {
185 *dst++ = char_cast<char_type>(0x3f);
186 }
187 }
188
189#if defined(HI_HAS_SSE2)
190 template<typename It>
191 hi_force_inline __m128i read_ascii_chunk16(It it) const noexcept
192 {
193 return _mm_loadu_si128(reinterpret_cast<__m128i const *>(std::addressof(*it)));
194 }
195
196 template<typename It>
197 hi_force_inline void write_ascii_chunk16(__m128i chunk, It dst) const noexcept
198 {
199 _mm_storeu_si128(reinterpret_cast<__m128i *>(std::addressof(*dst)), chunk);
200 }
201#endif
202};
203
204}} // namespace hi::v1
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:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
Character encoder/decoder template.
Definition char_converter.hpp:86
T addressof(T... args)