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 "../cast.hpp"
13#include "../utility.hpp"
14#include "../architecture.hpp"
15#include <cstdint>
16#include <utility>
17
18namespace hi { inline namespace v1 {
19
20namespace detail {
21
22constexpr auto cp_1252_make_table_0000_02DC() noexcept
23{
25 for (auto i = 0x0; i != 0x2dd; ++i) {
26 r[i] = 0x3f; // '?'
27 }
28 for (auto i = 0_uz; i != 0x80; ++i) {
29 r[i] = char_cast<uint8_t>(i);
30 }
31 r[0x81] = 0x81;
32 r[0x8d] = 0x8d;
33 r[0x8f] = 0x8f;
34 r[0x90] = 0x90;
35 r[0x9d] = 0x9d;
36 for (auto i = 0xa0; i != 0x100; ++i) {
37 r[i] = char_cast<uint8_t>(i);
38 }
39
40 r[0x192] = 0x83;
41 r[0x2c6] = 0x88;
42 r[0x160] = 0x8a;
43 r[0x152] = 0x8c;
44 r[0x17d] = 0x8e;
45
46 r[0x2dc] = 0x98;
47 r[0x161] = 0x9a;
48 r[0x153] = 0x9c;
49 r[0x17e] = 0x9e;
50 r[0x178] = 0x9f;
51
52 return r;
53}
54
55constexpr auto cp_1252_make_table_2000_2122() noexcept
56{
58 for (auto i = 0x0; i != 0x123; ++i) {
59 r[i] = 0x3f; // '?'
60 }
61
62 r[0xac] = 0x80;
63 r[0x1a] = 0x82;
64 r[0x1e] = 0x84;
65 r[0x26] = 0x85;
66 r[0x20] = 0x86;
67 r[0x21] = 0x87;
68 r[0x30] = 0x89;
69 r[0x39] = 0x8b;
70
71 r[0x18] = 0x91;
72 r[0x19] = 0x92;
73 r[0x1c] = 0x93;
74 r[0x1d] = 0x94;
75 r[0x22] = 0x95;
76 r[0x13] = 0x96;
77 r[0x14] = 0x97;
78 r[0x122] = 0x99;
79 r[0x3a] = 0x9b;
80
81 return r;
82}
83
84} // namespace detail
85
89template<>
90struct char_map<"cp-1252"> {
91 using char_type = char;
92
93 [[nodiscard]] constexpr std::endian guess_endian(void const *ptr, size_t size, std::endian endian) const noexcept
94 {
95 return std::endian::native;
96 }
97
98 template<typename It, typename EndIt>
99 [[nodiscard]] constexpr std::pair<char32_t, bool> read(It& it, EndIt last) const noexcept
100 {
101 // clang-format off
102 hi_axiom(it != last);
103 hilet c = char_cast<char8_t>(*it++);
104 switch (c) {
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};
121
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};
139 }
140 // clang-format on
141 }
142
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();
145
146 [[nodiscard]] constexpr std::pair<uint8_t, bool> size(char32_t code_point) const noexcept
147 {
148 hi_axiom(code_point < 0x11'0000);
149 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
150
151 if (code_point < 0x2dd) {
152 if (code_point == 0x3f) {
153 return {uint8_t{1}, true};
154 } else {
155 return {uint8_t{1}, range_0000_02DC[code_point] != 0x3f};
156 }
157 } else if (code_point < 0x2000) {
158 return {uint8_t{1}, false};
159
160 } else if (code_point < 0x2123) {
161 return {uint8_t{1}, range_2000_2122[code_point - 0x2000] != 0x3f};
162
163 } else {
164 return {uint8_t{1}, false};
165 }
166 }
167
168 template<typename It>
169 constexpr void write(char32_t code_point, It& dst) const noexcept
170 {
171 hi_axiom(code_point < 0x11'0000);
172 hi_axiom(not(code_point >= 0xd800 and code_point < 0xe000));
173
174 if (code_point < 0x2dd) {
175 *dst++ = char_cast<char_type>(range_0000_02DC[code_point]);
176
177 } else if (code_point < 0x2000) {
178 *dst++ = char_cast<char_type>(0x3f);
179
180 } else if (code_point < 0x2123) {
181 *dst++ = char_cast<char_type>(range_2000_2122[code_point - 0x2000]);
182
183 } else {
184 *dst++ = char_cast<char_type>(0x3f);
185 }
186 }
187
188#if defined(HI_HAS_SSE2)
189 template<typename It>
190 hi_force_inline __m128i read_ascii_chunk16(It it) const noexcept
191 {
192 return _mm_loadu_si128(reinterpret_cast<__m128i const *>(std::addressof(*it)));
193 }
194
195 template<typename It>
196 hi_force_inline void write_ascii_chunk16(__m128i chunk, It dst) const noexcept
197 {
198 _mm_storeu_si128(reinterpret_cast<__m128i *>(std::addressof(*dst)), chunk);
199 }
200#endif
201};
202
203}} // namespace hi::v1
#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
geometry/margins.hpp
Definition assert.hpp:18
Character encoder/decoder template.
Definition char_converter.hpp:85
T addressof(T... args)