/src/simdutf/src/fallback/implementation.cpp
Line | Count | Source |
1 | | #include "simdutf/fallback/begin.h" |
2 | | |
3 | | namespace simdutf { |
4 | | namespace SIMDUTF_IMPLEMENTATION { |
5 | | |
6 | | #if SIMDUTF_FEATURE_DETECT_ENCODING |
7 | | simdutf_warn_unused int |
8 | | implementation::detect_encodings(const char *input, |
9 | 650 | size_t length) const noexcept { |
10 | | // If there is a BOM, then we trust it. |
11 | 650 | auto bom_encoding = simdutf::BOM::check_bom(input, length); |
12 | 650 | if (bom_encoding != encoding_type::unspecified) { |
13 | 40 | return bom_encoding; |
14 | 40 | } |
15 | 610 | int out = 0; |
16 | | // todo: reimplement as a one-pass algorithm. |
17 | 610 | if (validate_utf8(input, length)) { |
18 | 98 | out |= encoding_type::UTF8; |
19 | 98 | } |
20 | 610 | if ((length % 2) == 0) { |
21 | 382 | if (validate_utf16le(reinterpret_cast<const char16_t *>(input), |
22 | 382 | length / 2)) { |
23 | 208 | out |= encoding_type::UTF16_LE; |
24 | 208 | } |
25 | 382 | } |
26 | 610 | if ((length % 4) == 0) { |
27 | 288 | if (validate_utf32(reinterpret_cast<const char32_t *>(input), length / 4)) { |
28 | 63 | out |= encoding_type::UTF32_LE; |
29 | 63 | } |
30 | 288 | } |
31 | 610 | return out; |
32 | 650 | } |
33 | | #endif // SIMDUTF_FEATURE_DETECT_ENCODING |
34 | | |
35 | | #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING |
36 | | simdutf_warn_unused bool |
37 | 35.4k | implementation::validate_utf8(const char *buf, size_t len) const noexcept { |
38 | 35.4k | return scalar::utf8::validate(buf, len); |
39 | 35.4k | } |
40 | | #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING |
41 | | |
42 | | #if SIMDUTF_FEATURE_UTF8 |
43 | | simdutf_warn_unused result implementation::validate_utf8_with_errors( |
44 | 11.0k | const char *buf, size_t len) const noexcept { |
45 | 11.0k | return scalar::utf8::validate_with_errors(buf, len); |
46 | 11.0k | } |
47 | | #endif // SIMDUTF_FEATURE_UTF8 |
48 | | |
49 | | #if SIMDUTF_FEATURE_ASCII |
50 | | simdutf_warn_unused bool |
51 | 201 | implementation::validate_ascii(const char *buf, size_t len) const noexcept { |
52 | 201 | return scalar::ascii::validate(buf, len); |
53 | 201 | } |
54 | | |
55 | | simdutf_warn_unused result implementation::validate_ascii_with_errors( |
56 | 285 | const char *buf, size_t len) const noexcept { |
57 | 285 | return scalar::ascii::validate_with_errors(buf, len); |
58 | 285 | } |
59 | | #endif // SIMDUTF_FEATURE_ASCII |
60 | | |
61 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII |
62 | | simdutf_warn_unused bool |
63 | | implementation::validate_utf16le_as_ascii(const char16_t *buf, |
64 | 206 | size_t len) const noexcept { |
65 | 206 | return scalar::utf16::validate_as_ascii<endianness::LITTLE>(buf, len); |
66 | 206 | } |
67 | | |
68 | | simdutf_warn_unused bool |
69 | | implementation::validate_utf16be_as_ascii(const char16_t *buf, |
70 | 206 | size_t len) const noexcept { |
71 | 206 | return scalar::utf16::validate_as_ascii<endianness::BIG>(buf, len); |
72 | 206 | } |
73 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII |
74 | | #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING |
75 | | simdutf_warn_unused bool |
76 | | implementation::validate_utf16le(const char16_t *buf, |
77 | 23.3k | size_t len) const noexcept { |
78 | 23.3k | return scalar::utf16::validate<endianness::LITTLE>(buf, len); |
79 | 23.3k | } |
80 | | #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING |
81 | | |
82 | | #if SIMDUTF_FEATURE_UTF16 |
83 | | simdutf_warn_unused bool |
84 | | implementation::validate_utf16be(const char16_t *buf, |
85 | 22.3k | size_t len) const noexcept { |
86 | 22.3k | return scalar::utf16::validate<endianness::BIG>(buf, len); |
87 | 22.3k | } |
88 | | |
89 | | simdutf_warn_unused result implementation::validate_utf16le_with_errors( |
90 | 8.28k | const char16_t *buf, size_t len) const noexcept { |
91 | 8.28k | return scalar::utf16::validate_with_errors<endianness::LITTLE>(buf, len); |
92 | 8.28k | } |
93 | | |
94 | | simdutf_warn_unused result implementation::validate_utf16be_with_errors( |
95 | 8.17k | const char16_t *buf, size_t len) const noexcept { |
96 | 8.17k | return scalar::utf16::validate_with_errors<endianness::BIG>(buf, len); |
97 | 8.17k | } |
98 | | |
99 | | void implementation::to_well_formed_utf16le(const char16_t *input, size_t len, |
100 | 623 | char16_t *output) const noexcept { |
101 | 623 | return scalar::utf16::to_well_formed_utf16<endianness::LITTLE>(input, len, |
102 | 623 | output); |
103 | 623 | } |
104 | | |
105 | | void implementation::to_well_formed_utf16be(const char16_t *input, size_t len, |
106 | 623 | char16_t *output) const noexcept { |
107 | 623 | return scalar::utf16::to_well_formed_utf16<endianness::BIG>(input, len, |
108 | 623 | output); |
109 | 623 | } |
110 | | #endif // SIMDUTF_FEATURE_UTF16 |
111 | | |
112 | | #if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING |
113 | | simdutf_warn_unused bool |
114 | 16.7k | implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { |
115 | 16.7k | return scalar::utf32::validate(buf, len); |
116 | 16.7k | } |
117 | | #endif // SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING |
118 | | |
119 | | #if SIMDUTF_FEATURE_UTF32 |
120 | | simdutf_warn_unused result implementation::validate_utf32_with_errors( |
121 | 2.64k | const char32_t *buf, size_t len) const noexcept { |
122 | 2.64k | return scalar::utf32::validate_with_errors(buf, len); |
123 | 2.64k | } |
124 | | #endif // SIMDUTF_FEATURE_UTF32 |
125 | | |
126 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
127 | | simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( |
128 | 7.99k | const char *buf, size_t len, char *utf8_output) const noexcept { |
129 | 7.99k | return scalar::latin1_to_utf8::convert(buf, len, utf8_output); |
130 | 7.99k | } |
131 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
132 | | |
133 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1 |
134 | | simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( |
135 | 6.93k | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
136 | 6.93k | return scalar::latin1_to_utf16::convert<endianness::LITTLE>(buf, len, |
137 | 6.93k | utf16_output); |
138 | 6.93k | } |
139 | | |
140 | | simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( |
141 | 6.96k | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
142 | 6.96k | return scalar::latin1_to_utf16::convert<endianness::BIG>(buf, len, |
143 | 6.96k | utf16_output); |
144 | 6.96k | } |
145 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1 |
146 | | |
147 | | #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1 |
148 | | simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( |
149 | 6.95k | const char *buf, size_t len, char32_t *utf32_output) const noexcept { |
150 | 6.95k | return scalar::latin1_to_utf32::convert(buf, len, utf32_output); |
151 | 6.95k | } |
152 | | #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1 |
153 | | |
154 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
155 | | simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( |
156 | 14.4k | const char *buf, size_t len, char *latin1_output) const noexcept { |
157 | 14.4k | return scalar::utf8_to_latin1::convert(buf, len, latin1_output); |
158 | 14.4k | } |
159 | | |
160 | | simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( |
161 | 730 | const char *buf, size_t len, char *latin1_output) const noexcept { |
162 | 730 | return scalar::utf8_to_latin1::convert_with_errors(buf, len, latin1_output); |
163 | 730 | } |
164 | | |
165 | | simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( |
166 | 0 | const char *buf, size_t len, char *latin1_output) const noexcept { |
167 | 0 | return scalar::utf8_to_latin1::convert_valid(buf, len, latin1_output); |
168 | 0 | } |
169 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
170 | | |
171 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
172 | | simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( |
173 | 14.6k | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
174 | 14.6k | return scalar::utf8_to_utf16::convert<endianness::LITTLE>(buf, len, |
175 | 14.6k | utf16_output); |
176 | 14.6k | } |
177 | | |
178 | | simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( |
179 | 14.6k | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
180 | 14.6k | return scalar::utf8_to_utf16::convert<endianness::BIG>(buf, len, |
181 | 14.6k | utf16_output); |
182 | 14.6k | } |
183 | | |
184 | | simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( |
185 | 746 | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
186 | 746 | return scalar::utf8_to_utf16::convert_with_errors<endianness::LITTLE>( |
187 | 746 | buf, len, utf16_output); |
188 | 746 | } |
189 | | |
190 | | simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( |
191 | 934 | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
192 | 934 | return scalar::utf8_to_utf16::convert_with_errors<endianness::BIG>( |
193 | 934 | buf, len, utf16_output); |
194 | 934 | } |
195 | | |
196 | | simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( |
197 | 380 | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
198 | 380 | return scalar::utf8_to_utf16::convert_valid<endianness::LITTLE>(buf, len, |
199 | 380 | utf16_output); |
200 | 380 | } |
201 | | |
202 | | simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( |
203 | 518 | const char *buf, size_t len, char16_t *utf16_output) const noexcept { |
204 | 518 | return scalar::utf8_to_utf16::convert_valid<endianness::BIG>(buf, len, |
205 | 518 | utf16_output); |
206 | 518 | } |
207 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
208 | | |
209 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
210 | | simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( |
211 | 7.81k | const char *buf, size_t len, char32_t *utf32_output) const noexcept { |
212 | 7.81k | return scalar::utf8_to_utf32::convert(buf, len, utf32_output); |
213 | 7.81k | } |
214 | | |
215 | | simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( |
216 | 926 | const char *buf, size_t len, char32_t *utf32_output) const noexcept { |
217 | 926 | return scalar::utf8_to_utf32::convert_with_errors(buf, len, utf32_output); |
218 | 926 | } |
219 | | |
220 | | simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( |
221 | 506 | const char *input, size_t size, char32_t *utf32_output) const noexcept { |
222 | 506 | return scalar::utf8_to_utf32::convert_valid(input, size, utf32_output); |
223 | 506 | } |
224 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
225 | | |
226 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1 |
227 | | simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( |
228 | 6.97k | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
229 | 6.97k | return scalar::utf16_to_latin1::convert<endianness::LITTLE>(buf, len, |
230 | 6.97k | latin1_output); |
231 | 6.97k | } |
232 | | |
233 | | simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( |
234 | 6.95k | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
235 | 6.95k | return scalar::utf16_to_latin1::convert<endianness::BIG>(buf, len, |
236 | 6.95k | latin1_output); |
237 | 6.95k | } |
238 | | |
239 | | simdutf_warn_unused result |
240 | | implementation::convert_utf16le_to_latin1_with_errors( |
241 | 280 | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
242 | 280 | return scalar::utf16_to_latin1::convert_with_errors<endianness::LITTLE>( |
243 | 280 | buf, len, latin1_output); |
244 | 280 | } |
245 | | |
246 | | simdutf_warn_unused result |
247 | | implementation::convert_utf16be_to_latin1_with_errors( |
248 | 248 | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
249 | 248 | return scalar::utf16_to_latin1::convert_with_errors<endianness::BIG>( |
250 | 248 | buf, len, latin1_output); |
251 | 248 | } |
252 | | |
253 | | simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( |
254 | 0 | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
255 | 0 | return scalar::utf16_to_latin1::convert_valid<endianness::LITTLE>( |
256 | 0 | buf, len, latin1_output); |
257 | 0 | } |
258 | | |
259 | | simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( |
260 | 0 | const char16_t *buf, size_t len, char *latin1_output) const noexcept { |
261 | 0 | return scalar::utf16_to_latin1::convert_valid<endianness::BIG>(buf, len, |
262 | 0 | latin1_output); |
263 | 0 | } |
264 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1 |
265 | | |
266 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
267 | | simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( |
268 | 14.5k | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
269 | 14.5k | return scalar::utf16_to_utf8::convert<endianness::LITTLE>(buf, len, |
270 | 14.5k | utf8_output); |
271 | 14.5k | } |
272 | | |
273 | | simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( |
274 | 13.8k | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
275 | 13.8k | return scalar::utf16_to_utf8::convert<endianness::BIG>(buf, len, utf8_output); |
276 | 13.8k | } |
277 | | |
278 | | simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( |
279 | 686 | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
280 | 686 | return scalar::utf16_to_utf8::convert_with_errors<endianness::LITTLE>( |
281 | 686 | buf, len, utf8_output); |
282 | 686 | } |
283 | | |
284 | | simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( |
285 | 556 | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
286 | 556 | return scalar::utf16_to_utf8::convert_with_errors<endianness::BIG>( |
287 | 556 | buf, len, utf8_output); |
288 | 556 | } |
289 | | |
290 | | simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( |
291 | 402 | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
292 | 402 | return scalar::utf16_to_utf8::convert_valid<endianness::LITTLE>(buf, len, |
293 | 402 | utf8_output); |
294 | 402 | } |
295 | | |
296 | | simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( |
297 | 450 | const char16_t *buf, size_t len, char *utf8_output) const noexcept { |
298 | 450 | return scalar::utf16_to_utf8::convert_valid<endianness::BIG>(buf, len, |
299 | 450 | utf8_output); |
300 | 450 | } |
301 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
302 | | |
303 | | #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1 |
304 | | simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( |
305 | 7.04k | const char32_t *buf, size_t len, char *latin1_output) const noexcept { |
306 | 7.04k | return scalar::utf32_to_latin1::convert(buf, len, latin1_output); |
307 | 7.04k | } |
308 | | |
309 | | simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( |
310 | 420 | const char32_t *buf, size_t len, char *latin1_output) const noexcept { |
311 | 420 | return scalar::utf32_to_latin1::convert_with_errors(buf, len, latin1_output); |
312 | 420 | } |
313 | | |
314 | | simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( |
315 | 0 | const char32_t *buf, size_t len, char *latin1_output) const noexcept { |
316 | 0 | return scalar::utf32_to_latin1::convert_valid(buf, len, latin1_output); |
317 | 0 | } |
318 | | #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1 |
319 | | |
320 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
321 | | simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( |
322 | 7.37k | const char32_t *buf, size_t len, char *utf8_output) const noexcept { |
323 | 7.37k | return scalar::utf32_to_utf8::convert(buf, len, utf8_output); |
324 | 7.37k | } |
325 | | |
326 | | simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( |
327 | 864 | const char32_t *buf, size_t len, char *utf8_output) const noexcept { |
328 | 864 | return scalar::utf32_to_utf8::convert_with_errors(buf, len, utf8_output); |
329 | 864 | } |
330 | | |
331 | | simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( |
332 | 216 | const char32_t *buf, size_t len, char *utf8_output) const noexcept { |
333 | 216 | return scalar::utf32_to_utf8::convert_valid(buf, len, utf8_output); |
334 | 216 | } |
335 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
336 | | |
337 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
338 | | simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( |
339 | 486 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
340 | 486 | return scalar::utf32_to_utf16::convert<endianness::LITTLE>(buf, len, |
341 | 486 | utf16_output); |
342 | 486 | } |
343 | | |
344 | | simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( |
345 | 488 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
346 | 488 | return scalar::utf32_to_utf16::convert<endianness::BIG>(buf, len, |
347 | 488 | utf16_output); |
348 | 488 | } |
349 | | |
350 | | simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( |
351 | 748 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
352 | 748 | return scalar::utf32_to_utf16::convert_with_errors<endianness::LITTLE>( |
353 | 748 | buf, len, utf16_output); |
354 | 748 | } |
355 | | |
356 | | simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( |
357 | 670 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
358 | 670 | return scalar::utf32_to_utf16::convert_with_errors<endianness::BIG>( |
359 | 670 | buf, len, utf16_output); |
360 | 670 | } |
361 | | |
362 | | simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( |
363 | 320 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
364 | 320 | return scalar::utf32_to_utf16::convert_valid<endianness::LITTLE>( |
365 | 320 | buf, len, utf16_output); |
366 | 320 | } |
367 | | |
368 | | simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( |
369 | 132 | const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { |
370 | 132 | return scalar::utf32_to_utf16::convert_valid<endianness::BIG>(buf, len, |
371 | 132 | utf16_output); |
372 | 132 | } |
373 | | |
374 | | simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( |
375 | 302 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
376 | 302 | return scalar::utf16_to_utf32::convert<endianness::LITTLE>(buf, len, |
377 | 302 | utf32_output); |
378 | 302 | } |
379 | | |
380 | | simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( |
381 | 278 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
382 | 278 | return scalar::utf16_to_utf32::convert<endianness::BIG>(buf, len, |
383 | 278 | utf32_output); |
384 | 278 | } |
385 | | |
386 | | simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( |
387 | 442 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
388 | 442 | return scalar::utf16_to_utf32::convert_with_errors<endianness::LITTLE>( |
389 | 442 | buf, len, utf32_output); |
390 | 442 | } |
391 | | |
392 | | simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( |
393 | 360 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
394 | 360 | return scalar::utf16_to_utf32::convert_with_errors<endianness::BIG>( |
395 | 360 | buf, len, utf32_output); |
396 | 360 | } |
397 | | |
398 | | simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( |
399 | 128 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
400 | 128 | return scalar::utf16_to_utf32::convert_valid<endianness::LITTLE>( |
401 | 128 | buf, len, utf32_output); |
402 | 128 | } |
403 | | |
404 | | simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( |
405 | 180 | const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { |
406 | 180 | return scalar::utf16_to_utf32::convert_valid<endianness::BIG>(buf, len, |
407 | 180 | utf32_output); |
408 | 180 | } |
409 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
410 | | |
411 | | #if SIMDUTF_FEATURE_UTF16 |
412 | | void implementation::change_endianness_utf16(const char16_t *input, |
413 | | size_t length, |
414 | 115 | char16_t *output) const noexcept { |
415 | 115 | scalar::utf16::change_endianness_utf16(input, length, output); |
416 | 115 | } |
417 | | |
418 | | simdutf_warn_unused size_t implementation::count_utf16le( |
419 | 1.43k | const char16_t *input, size_t length) const noexcept { |
420 | 1.43k | return scalar::utf16::count_code_points<endianness::LITTLE>(input, length); |
421 | 1.43k | } |
422 | | |
423 | | simdutf_warn_unused size_t implementation::count_utf16be( |
424 | 1.32k | const char16_t *input, size_t length) const noexcept { |
425 | 1.32k | return scalar::utf16::count_code_points<endianness::BIG>(input, length); |
426 | 1.32k | } |
427 | | #endif // SIMDUTF_FEATURE_UTF16 |
428 | | |
429 | | #if SIMDUTF_FEATURE_UTF8 |
430 | | simdutf_warn_unused size_t |
431 | 4.20k | implementation::count_utf8(const char *input, size_t length) const noexcept { |
432 | 4.20k | return scalar::utf8::count_code_points(input, length); |
433 | 4.20k | } |
434 | | simdutf_warn_unused utf8_result implementation::validate_utf8_with_counts( |
435 | 0 | const char *buf, size_t len) const noexcept { |
436 | 0 | return scalar::utf8::validate_with_counts(buf, len); |
437 | 0 | } |
438 | | |
439 | | #endif // SIMDUTF_FEATURE_UTF8 |
440 | | |
441 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
442 | | simdutf_warn_unused size_t implementation::latin1_length_from_utf8( |
443 | 14.4k | const char *buf, size_t len) const noexcept { |
444 | 14.4k | return scalar::utf8::count_code_points(buf, len); |
445 | 14.4k | } |
446 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
447 | | |
448 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
449 | | simdutf_warn_unused size_t implementation::utf8_length_from_latin1( |
450 | 7.45k | const char *input, size_t length) const noexcept { |
451 | 7.45k | return scalar::latin1_to_utf8::utf8_length_from_latin1(input, length); |
452 | 7.45k | } |
453 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1 |
454 | | |
455 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
456 | | simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( |
457 | 14.9k | const char16_t *input, size_t length) const noexcept { |
458 | 14.9k | return scalar::utf16::utf8_length_from_utf16<endianness::LITTLE>(input, |
459 | 14.9k | length); |
460 | 14.9k | } |
461 | | |
462 | | simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( |
463 | 14.6k | const char16_t *input, size_t length) const noexcept { |
464 | 14.6k | return scalar::utf16::utf8_length_from_utf16<endianness::BIG>(input, length); |
465 | 14.6k | } |
466 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
467 | | |
468 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
469 | | simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( |
470 | 442 | const char16_t *input, size_t length) const noexcept { |
471 | 442 | return scalar::utf16::utf32_length_from_utf16<endianness::LITTLE>(input, |
472 | 442 | length); |
473 | 442 | } |
474 | | |
475 | | simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( |
476 | 426 | const char16_t *input, size_t length) const noexcept { |
477 | 426 | return scalar::utf16::utf32_length_from_utf16<endianness::BIG>(input, length); |
478 | 426 | } |
479 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
480 | | |
481 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
482 | | simdutf_warn_unused size_t implementation::utf16_length_from_utf8( |
483 | 29.6k | const char *input, size_t length) const noexcept { |
484 | 29.6k | return scalar::utf8::utf16_length_from_utf8(input, length); |
485 | 29.6k | } |
486 | | simdutf_warn_unused result |
487 | | implementation::utf8_length_from_utf16le_with_replacement( |
488 | 1.27k | const char16_t *input, size_t length) const noexcept { |
489 | 1.27k | return scalar::utf16::utf8_length_from_utf16_with_replacement< |
490 | 1.27k | endianness::LITTLE>(input, length); |
491 | 1.27k | } |
492 | | |
493 | | simdutf_warn_unused result |
494 | | implementation::utf8_length_from_utf16be_with_replacement( |
495 | 1.20k | const char16_t *input, size_t length) const noexcept { |
496 | 1.20k | return scalar::utf16::utf8_length_from_utf16_with_replacement< |
497 | 1.20k | endianness::BIG>(input, length); |
498 | 1.20k | } |
499 | | |
500 | | simdutf_warn_unused size_t |
501 | | implementation::convert_utf16le_to_utf8_with_replacement( |
502 | 1.27k | const char16_t *input, size_t length, char *utf8_buffer) const noexcept { |
503 | 1.27k | return scalar::utf16_to_utf8::convert_with_replacement<endianness::LITTLE>( |
504 | 1.27k | input, length, utf8_buffer); |
505 | 1.27k | } |
506 | | |
507 | | simdutf_warn_unused size_t |
508 | | implementation::convert_utf16be_to_utf8_with_replacement( |
509 | 1.20k | const char16_t *input, size_t length, char *utf8_buffer) const noexcept { |
510 | 1.20k | return scalar::utf16_to_utf8::convert_with_replacement<endianness::BIG>( |
511 | 1.20k | input, length, utf8_buffer); |
512 | 1.20k | } |
513 | | |
514 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16 |
515 | | |
516 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
517 | | simdutf_warn_unused size_t implementation::utf8_length_from_utf32( |
518 | 7.56k | const char32_t *input, size_t length) const noexcept { |
519 | 7.56k | return scalar::utf32::utf8_length_from_utf32(input, length); |
520 | 7.56k | } |
521 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
522 | | |
523 | | #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
524 | | simdutf_warn_unused size_t implementation::utf16_length_from_utf32( |
525 | 1.43k | const char32_t *input, size_t length) const noexcept { |
526 | 1.43k | return scalar::utf32::utf16_length_from_utf32(input, length); |
527 | 1.43k | } |
528 | | #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32 |
529 | | |
530 | | #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
531 | | simdutf_warn_unused size_t implementation::utf32_length_from_utf8( |
532 | 8.05k | const char *input, size_t length) const noexcept { |
533 | 8.05k | return scalar::utf8::count_code_points(input, length); |
534 | 8.05k | } |
535 | | #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32 |
536 | | |
537 | | #if SIMDUTF_FEATURE_BASE64 |
538 | | |
539 | | simdutf_warn_unused result implementation::base64_to_binary( |
540 | | const char *input, size_t length, char *output, base64_options options, |
541 | 25.0k | last_chunk_handling_options last_chunk_options) const noexcept { |
542 | 25.0k | return simdutf::scalar::base64::base64_to_binary_details_impl( |
543 | 25.0k | input, length, output, options, last_chunk_options); |
544 | 25.0k | } |
545 | | |
546 | | simdutf_warn_unused result implementation::base64_to_binary( |
547 | | const char16_t *input, size_t length, char *output, base64_options options, |
548 | 3.74k | last_chunk_handling_options last_chunk_options) const noexcept { |
549 | 3.74k | return simdutf::scalar::base64::base64_to_binary_details_impl( |
550 | 3.74k | input, length, output, options, last_chunk_options); |
551 | 3.74k | } |
552 | | |
553 | | simdutf_warn_unused full_result implementation::base64_to_binary_details( |
554 | | const char *input, size_t length, char *output, base64_options options, |
555 | 2.03k | last_chunk_handling_options last_chunk_options) const noexcept { |
556 | 2.03k | return simdutf::scalar::base64::base64_to_binary_details_impl( |
557 | 2.03k | input, length, output, options, last_chunk_options); |
558 | 2.03k | } |
559 | | |
560 | | simdutf_warn_unused full_result implementation::base64_to_binary_details( |
561 | | const char16_t *input, size_t length, char *output, base64_options options, |
562 | 2.00k | last_chunk_handling_options last_chunk_options) const noexcept { |
563 | 2.00k | return simdutf::scalar::base64::base64_to_binary_details_impl( |
564 | 2.00k | input, length, output, options, last_chunk_options); |
565 | 2.00k | } |
566 | | |
567 | | size_t implementation::binary_to_base64(const char *input, size_t length, |
568 | | char *output, |
569 | 21.2k | base64_options options) const noexcept { |
570 | 21.2k | return scalar::base64::tail_encode_base64(output, input, length, options); |
571 | 21.2k | } |
572 | | |
573 | | size_t implementation::binary_to_base64_with_lines( |
574 | | const char *input, size_t length, char *output, size_t line_length, |
575 | 1.04k | base64_options options) const noexcept { |
576 | 1.04k | return scalar::base64::tail_encode_base64_impl<true>(output, input, length, |
577 | 1.04k | options, line_length); |
578 | 1.04k | } |
579 | | |
580 | | const char *implementation::find(const char *start, const char *end, |
581 | 249 | char character) const noexcept { |
582 | 10.0M | for (; start < end; ++start) { |
583 | 10.0M | if (*start == character) { |
584 | 157 | return start; |
585 | 157 | } |
586 | 10.0M | } |
587 | 92 | return end; |
588 | 249 | } |
589 | | |
590 | | const char16_t *implementation::find(const char16_t *start, const char16_t *end, |
591 | 244 | char16_t character) const noexcept { |
592 | 4.20M | for (; start < end; ++start) { |
593 | 4.20M | if (*start == character) { |
594 | 129 | return start; |
595 | 129 | } |
596 | 4.20M | } |
597 | 115 | return end; |
598 | 244 | } |
599 | | #endif // SIMDUTF_FEATURE_BASE64 |
600 | | |
601 | | } // namespace SIMDUTF_IMPLEMENTATION |
602 | | } // namespace simdutf |
603 | | |
604 | | #include "simdutf/fallback/end.h" |