Coverage Report

Created: 2026-10-28 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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"