react-native-quick-crypto 1.0.19 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/QuickCrypto.podspec +12 -38
  2. package/README.md +2 -0
  3. package/android/CMakeLists.txt +3 -0
  4. package/cpp/utils/HybridUtils.cpp +39 -77
  5. package/deps/simdutf/.clang-format +4 -0
  6. package/deps/simdutf/.github/ISSUE_TEMPLATE/bug_report.md +62 -0
  7. package/deps/simdutf/.github/ISSUE_TEMPLATE/config.yml +1 -0
  8. package/deps/simdutf/.github/ISSUE_TEMPLATE/feature_request.md +35 -0
  9. package/deps/simdutf/.github/ISSUE_TEMPLATE/standard-issue-template.md +29 -0
  10. package/deps/simdutf/.github/pull_request_template.md +51 -0
  11. package/deps/simdutf/.github/workflows/aarch64.yml +39 -0
  12. package/deps/simdutf/.github/workflows/alpine.yml +27 -0
  13. package/deps/simdutf/.github/workflows/amalgamation_demos.yml +34 -0
  14. package/deps/simdutf/.github/workflows/armv7.yml +32 -0
  15. package/deps/simdutf/.github/workflows/atomic_fuzz.yml +25 -0
  16. package/deps/simdutf/.github/workflows/cifuzz.yml +37 -0
  17. package/deps/simdutf/.github/workflows/clangformat.yml +36 -0
  18. package/deps/simdutf/.github/workflows/debian-latestcxxstandards.yml +40 -0
  19. package/deps/simdutf/.github/workflows/debian.yml +33 -0
  20. package/deps/simdutf/.github/workflows/documentation.yml +36 -0
  21. package/deps/simdutf/.github/workflows/emscripten.yml +19 -0
  22. package/deps/simdutf/.github/workflows/loongarch64-gcc-14.2.yml +39 -0
  23. package/deps/simdutf/.github/workflows/macos-latest.yml +29 -0
  24. package/deps/simdutf/.github/workflows/msys2-clang.yml +48 -0
  25. package/deps/simdutf/.github/workflows/msys2.yml +50 -0
  26. package/deps/simdutf/.github/workflows/ppc64le.yml +29 -0
  27. package/deps/simdutf/.github/workflows/rvv-1024-clang-18.yml +35 -0
  28. package/deps/simdutf/.github/workflows/rvv-128-clang-17.yml +35 -0
  29. package/deps/simdutf/.github/workflows/rvv-256-gcc-14.yml +31 -0
  30. package/deps/simdutf/.github/workflows/s390x.yml +29 -0
  31. package/deps/simdutf/.github/workflows/selective-amalgamation.yml +29 -0
  32. package/deps/simdutf/.github/workflows/typos.yml +19 -0
  33. package/deps/simdutf/.github/workflows/ubuntu22-cxx20.yml +30 -0
  34. package/deps/simdutf/.github/workflows/ubuntu22.yml +32 -0
  35. package/deps/simdutf/.github/workflows/ubuntu22_gcc12.yml +27 -0
  36. package/deps/simdutf/.github/workflows/ubuntu22sani.yml +29 -0
  37. package/deps/simdutf/.github/workflows/ubuntu24-cxxstandards.yml +34 -0
  38. package/deps/simdutf/.github/workflows/ubuntu24-unsignedchar.yml +34 -0
  39. package/deps/simdutf/.github/workflows/ubuntu24.yml +32 -0
  40. package/deps/simdutf/.github/workflows/ubuntu24sani.yml +36 -0
  41. package/deps/simdutf/.github/workflows/ubuntu24sani_clang.yml +29 -0
  42. package/deps/simdutf/.github/workflows/vs17-arm-ci.yml +21 -0
  43. package/deps/simdutf/.github/workflows/vs17-ci-cxx20.yml +41 -0
  44. package/deps/simdutf/.github/workflows/vs17-ci.yml +41 -0
  45. package/deps/simdutf/.github/workflows/vs17-clang-ci.yml +41 -0
  46. package/deps/simdutf/.github/workflows/vs17-cxxstandards.yml +36 -0
  47. package/deps/simdutf/AI_USAGE_POLICY.md +56 -0
  48. package/deps/simdutf/AUTHORS +6 -0
  49. package/deps/simdutf/CMakeLists.txt +231 -0
  50. package/deps/simdutf/CONTRIBUTING.md +214 -0
  51. package/deps/simdutf/CONTRIBUTORS +1 -0
  52. package/deps/simdutf/Doxyfile +2584 -0
  53. package/deps/simdutf/LICENSE-APACHE +201 -0
  54. package/deps/simdutf/LICENSE-MIT +18 -0
  55. package/deps/simdutf/Makefile.crosscompile +54 -0
  56. package/deps/simdutf/README-RVV.md +16 -0
  57. package/deps/simdutf/README.md +2782 -0
  58. package/deps/simdutf/SECURITY.md +8 -0
  59. package/deps/simdutf/benchmarks/CMakeLists.txt +101 -0
  60. package/deps/simdutf/benchmarks/alignment.cpp +150 -0
  61. package/deps/simdutf/benchmarks/base64/CMakeLists.txt +30 -0
  62. package/deps/simdutf/benchmarks/base64/benchmark_base64.cpp +875 -0
  63. package/deps/simdutf/benchmarks/base64/libbase64_spaces.h +49 -0
  64. package/deps/simdutf/benchmarks/base64/node_base64.h +227 -0
  65. package/deps/simdutf/benchmarks/base64/openssl3_base64.h +334 -0
  66. package/deps/simdutf/benchmarks/benchmark.cpp +65 -0
  67. package/deps/simdutf/benchmarks/benchmark_to_well_formed_utf16.cpp +347 -0
  68. package/deps/simdutf/benchmarks/competition/.clang-format-ignore +5 -0
  69. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.cpp +1276 -0
  70. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.h +595 -0
  71. package/deps/simdutf/benchmarks/competition/README.md +7 -0
  72. package/deps/simdutf/benchmarks/competition/hoehrmann/hoehrmann.h +91 -0
  73. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16.h +444 -0
  74. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16_tables.h +13183 -0
  75. package/deps/simdutf/benchmarks/competition/inoue2008/script.py +73 -0
  76. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.cpp +738 -0
  77. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.h +293 -0
  78. package/deps/simdutf/benchmarks/competition/u8u16/COPYRIGHT +8 -0
  79. package/deps/simdutf/benchmarks/competition/u8u16/Makefile +44 -0
  80. package/deps/simdutf/benchmarks/competition/u8u16/OSL3.0.txt +169 -0
  81. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/BOM_Profiler.h +148 -0
  82. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/i386_timer.h +45 -0
  83. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/ppc_timer.c +34 -0
  84. package/deps/simdutf/benchmarks/competition/u8u16/README +56 -0
  85. package/deps/simdutf/benchmarks/competition/u8u16/config/config_defs.h +43 -0
  86. package/deps/simdutf/benchmarks/competition/u8u16/config/g4_config.h +27 -0
  87. package/deps/simdutf/benchmarks/competition/u8u16/config/mmx_config.h +16 -0
  88. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_config.h +18 -0
  89. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_ideal_config.h +16 -0
  90. package/deps/simdutf/benchmarks/competition/u8u16/config/spu_config.h +28 -0
  91. package/deps/simdutf/benchmarks/competition/u8u16/config/ssse3_config.h +20 -0
  92. package/deps/simdutf/benchmarks/competition/u8u16/iconv_u8u16.c +2 -0
  93. package/deps/simdutf/benchmarks/competition/u8u16/lib/altivec_simd.h +440 -0
  94. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_basic_ops.py +121 -0
  95. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_half_operand_versions.py +158 -0
  96. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_test.py +270 -0
  97. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd.h +141 -0
  98. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_basic.h +216 -0
  99. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_built_in.h +119 -0
  100. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_modified.h +2430 -0
  101. package/deps/simdutf/benchmarks/competition/u8u16/lib/outline.txt +39 -0
  102. package/deps/simdutf/benchmarks/competition/u8u16/lib/spu_simd.h +421 -0
  103. package/deps/simdutf/benchmarks/competition/u8u16/lib/sse_simd.h +836 -0
  104. package/deps/simdutf/benchmarks/competition/u8u16/lib/stdint.h +222 -0
  105. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_BE.c +4 -0
  106. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_LE.c +5 -0
  107. package/deps/simdutf/benchmarks/competition/u8u16/proto/u8u16.py +390 -0
  108. package/deps/simdutf/benchmarks/competition/u8u16/src/Makefile +18 -0
  109. package/deps/simdutf/benchmarks/competition/u8u16/src/bytelex.h +448 -0
  110. package/deps/simdutf/benchmarks/competition/u8u16/src/charsets/ASCII_EBCDIC.h +284 -0
  111. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.c +1975 -0
  112. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.pdf +0 -0
  113. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.w +2263 -0
  114. package/deps/simdutf/benchmarks/competition/u8u16/src/multiliteral.h +239 -0
  115. package/deps/simdutf/benchmarks/competition/u8u16/src/u8u16.c +232 -0
  116. package/deps/simdutf/benchmarks/competition/u8u16/src/x8x16.c +194 -0
  117. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.c +193 -0
  118. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.h +167 -0
  119. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.c +288 -0
  120. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.h +117 -0
  121. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_g4.c +2 -0
  122. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_mmx.c +2 -0
  123. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4.c +3 -0
  124. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4_ideal.c +2 -0
  125. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_spu.c +2 -0
  126. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_ssse3.c +3 -0
  127. package/deps/simdutf/benchmarks/competition/u8u16/x8x16_p4.c +2 -0
  128. package/deps/simdutf/benchmarks/competition/utf8lut/LICENSE +23 -0
  129. package/deps/simdutf/benchmarks/competition/utf8lut/data/test_minimal.txt +44 -0
  130. package/deps/simdutf/benchmarks/competition/utf8lut/readme.md +106 -0
  131. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.cmd +11 -0
  132. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.sh +13 -0
  133. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_corr_tests.sh +13 -0
  134. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_example.sh +13 -0
  135. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_file_conv.sh +14 -0
  136. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_lib.sh +11 -0
  137. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_sample.sh +8 -0
  138. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_corr_tests.cmd +12 -0
  139. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_example.cmd +13 -0
  140. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_file_conv.cmd +14 -0
  141. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_lib.cmd +11 -0
  142. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_sample.cmd +8 -0
  143. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_corr_tests.cmd +11 -0
  144. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_example.cmd +12 -0
  145. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_file_conv.cmd +13 -0
  146. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_lib.cmd +10 -0
  147. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_sample.cmd +9 -0
  148. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/html_table.py +25 -0
  149. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/measure.py +94 -0
  150. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/resize.py +20 -0
  151. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_all.cmd +2 -0
  152. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_interm.cmd +1 -0
  153. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/CustomMemcpy.h +75 -0
  154. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/PerfDefs.h +47 -0
  155. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.cpp +17 -0
  156. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.h +76 -0
  157. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/AllProcessors.cpp +35 -0
  158. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.cpp +117 -0
  159. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.h +210 -0
  160. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferDecoder.h +158 -0
  161. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferEncoder.h +104 -0
  162. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorPlugins.h +334 -0
  163. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorSelector.h +186 -0
  164. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.cpp +140 -0
  165. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.h +42 -0
  166. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderProcess.h +100 -0
  167. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/Dfa.h +57 -0
  168. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.cpp +85 -0
  169. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.h +27 -0
  170. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderProcess.h +126 -0
  171. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/ProcessTrivial.h +108 -0
  172. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.cpp +139 -0
  173. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.h +74 -0
  174. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.cpp +65 -0
  175. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.h +91 -0
  176. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/CorrectnessTests.cpp +772 -0
  177. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/Example.cpp +12 -0
  178. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/FileConverter.cpp +486 -0
  179. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/iconv_sample.c +162 -0
  180. package/deps/simdutf/benchmarks/competition/utf8lut/src/utf8lut.h +15 -0
  181. package/deps/simdutf/benchmarks/competition/utf8sse4/fromutf8-sse.cpp +292 -0
  182. package/deps/simdutf/benchmarks/competition/utfcpp/LICENSE +23 -0
  183. package/deps/simdutf/benchmarks/competition/utfcpp/README.md +1503 -0
  184. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/checked.h +335 -0
  185. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/core.h +338 -0
  186. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp11.h +103 -0
  187. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp17.h +103 -0
  188. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/unchecked.h +274 -0
  189. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8.h +34 -0
  190. package/deps/simdutf/benchmarks/dataset/README.md +155 -0
  191. package/deps/simdutf/benchmarks/dataset/emoji.txt +204 -0
  192. package/deps/simdutf/benchmarks/dataset/scripts/utf8type.py +40 -0
  193. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/Makefile +80 -0
  194. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/convert_to_utf6.py +20 -0
  195. package/deps/simdutf/benchmarks/find/CMakeLists.txt +6 -0
  196. package/deps/simdutf/benchmarks/find/findbenchmark.cpp +63 -0
  197. package/deps/simdutf/benchmarks/find/findbenchmarker.h +46 -0
  198. package/deps/simdutf/benchmarks/shortbench.cpp +555 -0
  199. package/deps/simdutf/benchmarks/src/CMakeLists.txt +52 -0
  200. package/deps/simdutf/benchmarks/src/apple_arm_events.h +1104 -0
  201. package/deps/simdutf/benchmarks/src/benchmark.cpp +3899 -0
  202. package/deps/simdutf/benchmarks/src/benchmark.h +317 -0
  203. package/deps/simdutf/benchmarks/src/benchmark_base.cpp +144 -0
  204. package/deps/simdutf/benchmarks/src/benchmark_base.h +98 -0
  205. package/deps/simdutf/benchmarks/src/cmdline.cpp +176 -0
  206. package/deps/simdutf/benchmarks/src/cmdline.h +35 -0
  207. package/deps/simdutf/benchmarks/src/event_counter.h +162 -0
  208. package/deps/simdutf/benchmarks/src/linux-perf-events.h +104 -0
  209. package/deps/simdutf/benchmarks/stream.cpp +209 -0
  210. package/deps/simdutf/benchmarks/threaded.cpp +123 -0
  211. package/deps/simdutf/cmake/CPM.cmake +1363 -0
  212. package/deps/simdutf/cmake/JoinPaths.cmake +23 -0
  213. package/deps/simdutf/cmake/add_cpp_test.cmake +68 -0
  214. package/deps/simdutf/cmake/simdutf-config.cmake.in +2 -0
  215. package/deps/simdutf/cmake/simdutf-flags.cmake +26 -0
  216. package/deps/simdutf/cmake/toolchains-ci/riscv64-linux-gnu.cmake +4 -0
  217. package/deps/simdutf/cmake/toolchains-dev/README.md +32 -0
  218. package/deps/simdutf/cmake/toolchains-dev/aarch64.cmake +14 -0
  219. package/deps/simdutf/cmake/toolchains-dev/loongarch64.cmake +22 -0
  220. package/deps/simdutf/cmake/toolchains-dev/powerpc64.cmake +16 -0
  221. package/deps/simdutf/cmake/toolchains-dev/powerpc64le.cmake +16 -0
  222. package/deps/simdutf/cmake/toolchains-dev/riscv64.cmake +16 -0
  223. package/deps/simdutf/cmake/toolchains-dev/rvv-spike.cmake +38 -0
  224. package/deps/simdutf/doc/avx512.png +0 -0
  225. package/deps/simdutf/doc/logo.png +0 -0
  226. package/deps/simdutf/doc/logo.svg +165 -0
  227. package/deps/simdutf/doc/node2023.png +0 -0
  228. package/deps/simdutf/doc/shortinput.md +78 -0
  229. package/deps/simdutf/doc/utf16utf8.png +0 -0
  230. package/deps/simdutf/doc/utf8utf16.png +0 -0
  231. package/deps/simdutf/doc/widelogo.png +0 -0
  232. package/deps/simdutf/doxygen.py +50 -0
  233. package/deps/simdutf/fuzz/.clang-format +9 -0
  234. package/deps/simdutf/fuzz/CMakeLists.txt +45 -0
  235. package/deps/simdutf/fuzz/README.md +168 -0
  236. package/deps/simdutf/fuzz/atomic_base64.cpp +448 -0
  237. package/deps/simdutf/fuzz/base64.cpp +278 -0
  238. package/deps/simdutf/fuzz/build.sh +83 -0
  239. package/deps/simdutf/fuzz/conversion.cpp +669 -0
  240. package/deps/simdutf/fuzz/helpers/.clang-format-ignore +1 -0
  241. package/deps/simdutf/fuzz/helpers/common.h +135 -0
  242. package/deps/simdutf/fuzz/helpers/nameof.hpp +1258 -0
  243. package/deps/simdutf/fuzz/main.cpp +72 -0
  244. package/deps/simdutf/fuzz/minimize_and_cleanse.sh +87 -0
  245. package/deps/simdutf/fuzz/misc.cpp +216 -0
  246. package/deps/simdutf/fuzz/random_fuzz.sh +154 -0
  247. package/deps/simdutf/fuzz/roundtrip.cpp +588 -0
  248. package/deps/simdutf/fuzz/safe_conversion.cpp +104 -0
  249. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  250. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  251. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  252. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  253. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  254. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  255. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  256. package/deps/simdutf/include/simdutf/error.h +126 -0
  257. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  258. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  259. package/deps/simdutf/include/simdutf/portability.h +285 -0
  260. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  261. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  262. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  263. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  264. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  265. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  266. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  267. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  268. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  269. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  270. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  271. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  272. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  273. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  274. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  275. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  276. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  277. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  278. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  279. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  280. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  281. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  282. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  283. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  284. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  285. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  286. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  287. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  288. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  289. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  290. package/deps/simdutf/include/simdutf.h +26 -0
  291. package/deps/simdutf/include/simdutf_c.h +342 -0
  292. package/deps/simdutf/riscv/Dockerfile +16 -0
  293. package/deps/simdutf/riscv/README.md +24 -0
  294. package/deps/simdutf/riscv/remove-docker-station +8 -0
  295. package/deps/simdutf/riscv/run-docker-station +31 -0
  296. package/deps/simdutf/scripts/.flake8 +2 -0
  297. package/deps/simdutf/scripts/Makefile +2 -0
  298. package/deps/simdutf/scripts/README_ADD_FUNCTION.md +49 -0
  299. package/deps/simdutf/scripts/add_function.py +330 -0
  300. package/deps/simdutf/scripts/amalgamation_tests.py +156 -0
  301. package/deps/simdutf/scripts/base64/Makefile +2 -0
  302. package/deps/simdutf/scripts/base64/README.md +2 -0
  303. package/deps/simdutf/scripts/base64/avx512.py +76 -0
  304. package/deps/simdutf/scripts/base64/neon_decode.py +143 -0
  305. package/deps/simdutf/scripts/base64/neon_generate_lut.py +101 -0
  306. package/deps/simdutf/scripts/base64/sse.py +252 -0
  307. package/deps/simdutf/scripts/base64/sseregular.py +160 -0
  308. package/deps/simdutf/scripts/base64/sseurl.py +283 -0
  309. package/deps/simdutf/scripts/base64/table.py +59 -0
  310. package/deps/simdutf/scripts/base64bench_print.py +145 -0
  311. package/deps/simdutf/scripts/benchmark-all.py +119 -0
  312. package/deps/simdutf/scripts/benchmark_print.py +324 -0
  313. package/deps/simdutf/scripts/check_feature_macros.py +156 -0
  314. package/deps/simdutf/scripts/check_typos.sh +13 -0
  315. package/deps/simdutf/scripts/clang_format.sh +35 -0
  316. package/deps/simdutf/scripts/clang_format_docker.sh +38 -0
  317. package/deps/simdutf/scripts/common.py +24 -0
  318. package/deps/simdutf/scripts/compilation_benchmark.py +55 -0
  319. package/deps/simdutf/scripts/compile_many_variations.sh +64 -0
  320. package/deps/simdutf/scripts/create_latex_table.py +62 -0
  321. package/deps/simdutf/scripts/docker/Dockerfile +14 -0
  322. package/deps/simdutf/scripts/docker/Makefile +9 -0
  323. package/deps/simdutf/scripts/docker/README.md +30 -0
  324. package/deps/simdutf/scripts/docker/llvm.gpg +0 -0
  325. package/deps/simdutf/scripts/ppc64_convert_utf16_to_utf8.py +155 -0
  326. package/deps/simdutf/scripts/prepare_doxygen.sh +21 -0
  327. package/deps/simdutf/scripts/release.py +197 -0
  328. package/deps/simdutf/scripts/shortinputplots.py +97 -0
  329. package/deps/simdutf/scripts/sse_convert_utf16_to_utf8.py +422 -0
  330. package/deps/simdutf/scripts/sse_convert_utf32_to_utf16.py +105 -0
  331. package/deps/simdutf/scripts/sse_utf8_utf16_decode.py +186 -0
  332. package/deps/simdutf/scripts/sse_validate_utf16le_proof.py +137 -0
  333. package/deps/simdutf/scripts/sse_validate_utf16le_testcases.py +129 -0
  334. package/deps/simdutf/scripts/table.py +207 -0
  335. package/deps/simdutf/scripts/tests/new.txt +33 -0
  336. package/deps/simdutf/scripts/tests/old.txt +33 -0
  337. package/deps/simdutf/scripts/tests/results.txt +272 -0
  338. package/deps/simdutf/simdutf.pc.in +11 -0
  339. package/deps/simdutf/singleheader/.flake8 +2 -0
  340. package/deps/simdutf/singleheader/CMakeLists.txt +64 -0
  341. package/deps/simdutf/singleheader/README-dev.md +81 -0
  342. package/deps/simdutf/singleheader/README.md +19 -0
  343. package/deps/simdutf/singleheader/amalgamate.py +513 -0
  344. package/deps/simdutf/singleheader/amalgamation_demo.c +59 -0
  345. package/deps/simdutf/singleheader/amalgamation_demo.cpp +54 -0
  346. package/deps/simdutf/singleheader/test-features.py +262 -0
  347. package/deps/simdutf/src/CMakeLists.txt +78 -0
  348. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  349. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  350. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  351. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  352. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  353. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  354. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  355. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  356. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  357. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  358. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  359. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  360. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  361. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  362. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  363. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  364. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  365. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  366. package/deps/simdutf/src/encoding_types.cpp +67 -0
  367. package/deps/simdutf/src/error.cpp +3 -0
  368. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  369. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  370. package/deps/simdutf/src/generic/base64.h +233 -0
  371. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  372. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  373. package/deps/simdutf/src/generic/find.h +75 -0
  374. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  375. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  376. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  377. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  378. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  379. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  380. package/deps/simdutf/src/generic/utf16.h +73 -0
  381. package/deps/simdutf/src/generic/utf32.h +136 -0
  382. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  383. package/deps/simdutf/src/generic/utf8.h +92 -0
  384. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  385. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  386. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  387. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  388. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  389. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  390. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  391. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  392. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  393. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  394. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  395. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  396. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  397. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  398. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  399. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  400. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  401. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  402. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  403. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  404. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  405. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  406. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  407. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  408. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  409. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  410. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  411. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  412. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  413. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  414. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  415. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  416. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  417. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  418. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  419. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  420. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  421. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  422. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  423. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  424. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  425. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  426. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  427. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  428. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  429. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  430. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  431. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  432. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  433. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  434. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  435. package/deps/simdutf/src/implementation.cpp +2526 -0
  436. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  437. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  438. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  439. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  440. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  441. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  442. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  443. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  444. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  445. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  446. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  447. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  448. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  449. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  450. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  451. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  452. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  453. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  454. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  455. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  456. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  457. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  458. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  459. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  460. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  461. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  462. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  463. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  464. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  465. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  466. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  467. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  468. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  469. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  470. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  471. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  472. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  473. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  474. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  475. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  476. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  477. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  478. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  479. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  480. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  481. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  482. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  483. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  484. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  485. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  486. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  487. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  488. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  489. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  490. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  491. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  492. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  493. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  494. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  495. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  496. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  497. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  498. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  499. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  500. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  501. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  502. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  503. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  504. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  505. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  506. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  507. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  508. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  509. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  510. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  511. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  512. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  513. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  514. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  515. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  516. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  517. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  518. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  519. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  520. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  521. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  522. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  523. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  524. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  525. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  526. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  527. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  528. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  529. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  530. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  531. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  532. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  533. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  534. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  535. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  536. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  537. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  538. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  539. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  540. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  541. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  542. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  543. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  544. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  545. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  546. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  547. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  548. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  549. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  550. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  551. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  552. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  553. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  554. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  555. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  556. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  557. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  558. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  559. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  560. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  561. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  562. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  563. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  564. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  565. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  566. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  567. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  568. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  569. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  570. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  571. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  572. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  573. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  574. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  575. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  576. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  577. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  578. package/deps/simdutf/src/simdutf.cpp +152 -0
  579. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  580. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  581. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  582. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  583. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  584. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  585. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  586. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  587. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  588. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  589. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  590. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  591. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  592. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  593. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  594. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  595. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  596. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  597. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  598. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  599. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  600. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  601. package/deps/simdutf/tests/CMakeLists.txt +483 -0
  602. package/deps/simdutf/tests/atomic_base64_tests.cpp +2845 -0
  603. package/deps/simdutf/tests/base64_tests.cpp +3617 -0
  604. package/deps/simdutf/tests/basic_fuzzer.cpp +805 -0
  605. package/deps/simdutf/tests/bele_tests.cpp +182 -0
  606. package/deps/simdutf/tests/constexpr_base64_tests.cpp +387 -0
  607. package/deps/simdutf/tests/convert_latin1_to_utf16be_tests.cpp +52 -0
  608. package/deps/simdutf/tests/convert_latin1_to_utf16le_tests.cpp +80 -0
  609. package/deps/simdutf/tests/convert_latin1_to_utf32_tests.cpp +66 -0
  610. package/deps/simdutf/tests/convert_latin1_to_utf8_tests.cpp +120 -0
  611. package/deps/simdutf/tests/convert_utf16_to_utf8_safe_tests.cpp +203 -0
  612. package/deps/simdutf/tests/convert_utf16_to_utf8_with_replacement_tests.cpp +276 -0
  613. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests.cpp +109 -0
  614. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests_with_errors.cpp +136 -0
  615. package/deps/simdutf/tests/convert_utf16be_to_utf32_tests.cpp +193 -0
  616. package/deps/simdutf/tests/convert_utf16be_to_utf32_with_errors_tests.cpp +381 -0
  617. package/deps/simdutf/tests/convert_utf16be_to_utf8_tests.cpp +259 -0
  618. package/deps/simdutf/tests/convert_utf16be_to_utf8_with_errors_tests.cpp +266 -0
  619. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests.cpp +148 -0
  620. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests_with_errors.cpp +176 -0
  621. package/deps/simdutf/tests/convert_utf16le_to_utf32_tests.cpp +213 -0
  622. package/deps/simdutf/tests/convert_utf16le_to_utf32_with_errors_tests.cpp +318 -0
  623. package/deps/simdutf/tests/convert_utf16le_to_utf8_tests.cpp +343 -0
  624. package/deps/simdutf/tests/convert_utf16le_to_utf8_with_errors_tests.cpp +271 -0
  625. package/deps/simdutf/tests/convert_utf32_to_latin1_tests.cpp +111 -0
  626. package/deps/simdutf/tests/convert_utf32_to_latin1_with_errors_tests.cpp +96 -0
  627. package/deps/simdutf/tests/convert_utf32_to_utf16be_tests.cpp +148 -0
  628. package/deps/simdutf/tests/convert_utf32_to_utf16be_with_errors_tests.cpp +192 -0
  629. package/deps/simdutf/tests/convert_utf32_to_utf16le_tests.cpp +166 -0
  630. package/deps/simdutf/tests/convert_utf32_to_utf16le_with_errors_tests.cpp +215 -0
  631. package/deps/simdutf/tests/convert_utf32_to_utf8_tests.cpp +181 -0
  632. package/deps/simdutf/tests/convert_utf32_to_utf8_with_errors_tests.cpp +261 -0
  633. package/deps/simdutf/tests/convert_utf8_to_latin1_tests.cpp +516 -0
  634. package/deps/simdutf/tests/convert_utf8_to_latin1_with_errors_tests.cpp +579 -0
  635. package/deps/simdutf/tests/convert_utf8_to_utf16be_tests.cpp +412 -0
  636. package/deps/simdutf/tests/convert_utf8_to_utf16be_with_errors_tests.cpp +480 -0
  637. package/deps/simdutf/tests/convert_utf8_to_utf16le_tests.cpp +671 -0
  638. package/deps/simdutf/tests/convert_utf8_to_utf16le_with_errors_tests.cpp +455 -0
  639. package/deps/simdutf/tests/convert_utf8_to_utf32_tests.cpp +1204 -0
  640. package/deps/simdutf/tests/convert_utf8_to_utf32_with_errors_tests.cpp +337 -0
  641. package/deps/simdutf/tests/convert_valid_utf16be_to_latin1_tests.cpp +37 -0
  642. package/deps/simdutf/tests/convert_valid_utf16be_to_utf32_tests.cpp +97 -0
  643. package/deps/simdutf/tests/convert_valid_utf16be_to_utf8_tests.cpp +126 -0
  644. package/deps/simdutf/tests/convert_valid_utf16le_to_latin1_tests.cpp +71 -0
  645. package/deps/simdutf/tests/convert_valid_utf16le_to_utf32_tests.cpp +122 -0
  646. package/deps/simdutf/tests/convert_valid_utf16le_to_utf8_tests.cpp +244 -0
  647. package/deps/simdutf/tests/convert_valid_utf32_to_latin1_tests.cpp +49 -0
  648. package/deps/simdutf/tests/convert_valid_utf32_to_utf16be_tests.cpp +92 -0
  649. package/deps/simdutf/tests/convert_valid_utf32_to_utf16le_tests.cpp +114 -0
  650. package/deps/simdutf/tests/convert_valid_utf32_to_utf8_tests.cpp +109 -0
  651. package/deps/simdutf/tests/convert_valid_utf8_to_latin1_tests.cpp +84 -0
  652. package/deps/simdutf/tests/convert_valid_utf8_to_utf16be_tests.cpp +124 -0
  653. package/deps/simdutf/tests/convert_valid_utf8_to_utf16le_tests.cpp +221 -0
  654. package/deps/simdutf/tests/convert_valid_utf8_to_utf32_tests.cpp +155 -0
  655. package/deps/simdutf/tests/count_utf16be.cpp +64 -0
  656. package/deps/simdutf/tests/count_utf16le.cpp +61 -0
  657. package/deps/simdutf/tests/count_utf8.cpp +87 -0
  658. package/deps/simdutf/tests/detect_encodings_tests.cpp +312 -0
  659. package/deps/simdutf/tests/embed/valid_utf8.txt +1 -0
  660. package/deps/simdutf/tests/embed_tests.cpp +22 -0
  661. package/deps/simdutf/tests/find_tests.cpp +77 -0
  662. package/deps/simdutf/tests/fixed_string_tests.cpp +153 -0
  663. package/deps/simdutf/tests/helpers/CMakeLists.txt +25 -0
  664. package/deps/simdutf/tests/helpers/compiletime_conversions.h +222 -0
  665. package/deps/simdutf/tests/helpers/fixed_string.h +267 -0
  666. package/deps/simdutf/tests/helpers/random_int.cpp +30 -0
  667. package/deps/simdutf/tests/helpers/random_int.h +39 -0
  668. package/deps/simdutf/tests/helpers/random_utf16.cpp +123 -0
  669. package/deps/simdutf/tests/helpers/random_utf16.h +52 -0
  670. package/deps/simdutf/tests/helpers/random_utf32.cpp +41 -0
  671. package/deps/simdutf/tests/helpers/random_utf32.h +40 -0
  672. package/deps/simdutf/tests/helpers/random_utf8.cpp +93 -0
  673. package/deps/simdutf/tests/helpers/random_utf8.h +36 -0
  674. package/deps/simdutf/tests/helpers/test.cpp +231 -0
  675. package/deps/simdutf/tests/helpers/test.h +193 -0
  676. package/deps/simdutf/tests/helpers/transcode_test_base.cpp +1257 -0
  677. package/deps/simdutf/tests/helpers/transcode_test_base.h +683 -0
  678. package/deps/simdutf/tests/helpers/utf16.h +27 -0
  679. package/deps/simdutf/tests/installation_tests/find/CMakeLists.txt +43 -0
  680. package/deps/simdutf/tests/installation_tests/from_fetch/CMakeLists.txt +47 -0
  681. package/deps/simdutf/tests/internal_tests.cpp +27 -0
  682. package/deps/simdutf/tests/null_safety_tests.cpp +94 -0
  683. package/deps/simdutf/tests/random_fuzzer.cpp +779 -0
  684. package/deps/simdutf/tests/readme_tests.cpp +274 -0
  685. package/deps/simdutf/tests/reference/CMakeLists.txt +23 -0
  686. package/deps/simdutf/tests/reference/decode_utf16.h +81 -0
  687. package/deps/simdutf/tests/reference/decode_utf32.h +47 -0
  688. package/deps/simdutf/tests/reference/encode_latin1.cpp +1 -0
  689. package/deps/simdutf/tests/reference/encode_latin1.h +32 -0
  690. package/deps/simdutf/tests/reference/encode_utf16.cpp +49 -0
  691. package/deps/simdutf/tests/reference/encode_utf16.h +20 -0
  692. package/deps/simdutf/tests/reference/encode_utf32.cpp +1 -0
  693. package/deps/simdutf/tests/reference/encode_utf32.h +36 -0
  694. package/deps/simdutf/tests/reference/encode_utf8.cpp +1 -0
  695. package/deps/simdutf/tests/reference/encode_utf8.h +40 -0
  696. package/deps/simdutf/tests/reference/validate_utf16.cpp +60 -0
  697. package/deps/simdutf/tests/reference/validate_utf16.h +14 -0
  698. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.cpp +35 -0
  699. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.h +13 -0
  700. package/deps/simdutf/tests/reference/validate_utf32.cpp +27 -0
  701. package/deps/simdutf/tests/reference/validate_utf32.h +12 -0
  702. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.cpp +27 -0
  703. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.h +12 -0
  704. package/deps/simdutf/tests/reference/validate_utf8.cpp +82 -0
  705. package/deps/simdutf/tests/reference/validate_utf8.h +11 -0
  706. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.cpp +43 -0
  707. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.h +12 -0
  708. package/deps/simdutf/tests/select_implementation.cpp +43 -0
  709. package/deps/simdutf/tests/simdutf_c_tests.cpp +244 -0
  710. package/deps/simdutf/tests/span_tests.cpp +401 -0
  711. package/deps/simdutf/tests/special_tests.cpp +559 -0
  712. package/deps/simdutf/tests/straight_c_test.c +187 -0
  713. package/deps/simdutf/tests/text_encoding_tests.cpp +77 -0
  714. package/deps/simdutf/tests/to_well_formed_utf16_tests.cpp +377 -0
  715. package/deps/simdutf/tests/utf8_length_from_utf16_tests.cpp +202 -0
  716. package/deps/simdutf/tests/validate_ascii_basic_tests.cpp +165 -0
  717. package/deps/simdutf/tests/validate_ascii_with_errors_tests.cpp +77 -0
  718. package/deps/simdutf/tests/validate_utf16be_basic_tests.cpp +175 -0
  719. package/deps/simdutf/tests/validate_utf16be_with_errors_tests.cpp +188 -0
  720. package/deps/simdutf/tests/validate_utf16le_basic_tests.cpp +268 -0
  721. package/deps/simdutf/tests/validate_utf16le_with_errors_tests.cpp +274 -0
  722. package/deps/simdutf/tests/validate_utf32_basic_tests.cpp +92 -0
  723. package/deps/simdutf/tests/validate_utf32_with_errors_tests.cpp +114 -0
  724. package/deps/simdutf/tests/validate_utf8_basic_tests.cpp +178 -0
  725. package/deps/simdutf/tests/validate_utf8_brute_force_tests.cpp +88 -0
  726. package/deps/simdutf/tests/validate_utf8_puzzler_tests.cpp +33 -0
  727. package/deps/simdutf/tests/validate_utf8_with_errors_tests.cpp +228 -0
  728. package/deps/simdutf/tools/CMakeLists.txt +85 -0
  729. package/deps/simdutf/tools/fastbase64.cpp +250 -0
  730. package/deps/simdutf/tools/sutf.cpp +556 -0
  731. package/deps/simdutf/tools/sutf.h +40 -0
  732. package/package.json +2 -2
@@ -0,0 +1,791 @@
1
+ /**
2
+ * References and further reading:
3
+ *
4
+ * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the
5
+ * speed of a memory copy, Software: Practice and Experience 50 (2), 2020.
6
+ * https://arxiv.org/abs/1910.05109
7
+ *
8
+ * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2
9
+ * Instructions, ACM Transactions on the Web 12 (3), 2018.
10
+ * https://arxiv.org/abs/1704.00605
11
+ *
12
+ * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings.
13
+ * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force,
14
+ * Request for Comments: 4648.
15
+ *
16
+ * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization.
17
+ * http://www.alfredklomp.com/programming/sse-base64/. (2014).
18
+ *
19
+ * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD
20
+ * acceleration. https://github.com/aklomp/base64. (2014).
21
+ *
22
+ * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014).
23
+ * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/
24
+ *
25
+ * Nick Kopp. 2013. Base64 Encoding on a GPU.
26
+ * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013).
27
+ */
28
+
29
+ /**
30
+ * Insert a line feed character in the 16-byte input at index K in [0,16).
31
+ */
32
+ inline uint8x16_t insert_line_feed16(uint8x16_t input, size_t K) {
33
+ static const uint8_t shuffle_masks[16][16] = {
34
+ {0x80, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
35
+ {0, 0x80, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
36
+ {0, 1, 0x80, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
37
+ {0, 1, 2, 0x80, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
38
+ {0, 1, 2, 3, 0x80, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
39
+ {0, 1, 2, 3, 4, 0x80, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
40
+ {0, 1, 2, 3, 4, 5, 0x80, 6, 7, 8, 9, 10, 11, 12, 13, 14},
41
+ {0, 1, 2, 3, 4, 5, 6, 0x80, 7, 8, 9, 10, 11, 12, 13, 14},
42
+ {0, 1, 2, 3, 4, 5, 6, 7, 0x80, 8, 9, 10, 11, 12, 13, 14},
43
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 0x80, 9, 10, 11, 12, 13, 14},
44
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0x80, 10, 11, 12, 13, 14},
45
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0x80, 11, 12, 13, 14},
46
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x80, 12, 13, 14},
47
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0x80, 13, 14},
48
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0x80, 14},
49
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0x80}};
50
+ // Prepare a vector with '\n' (0x0A)
51
+ uint8x16_t line_feed_vector = vdupq_n_u8('\n');
52
+
53
+ // Load the precomputed shuffle mask for K
54
+ uint8x16_t mask = vld1q_u8(shuffle_masks[K]);
55
+
56
+ // Create a mask where 0x80 indicates the line feed position
57
+ uint8x16_t lf_pos = vceqq_u8(mask, vdupq_n_u8(0x80));
58
+
59
+ uint8x16_t result = vqtbl1q_u8(input, mask);
60
+
61
+ // Use vbsl to select '\n' where lf_pos is true, else keep input bytes
62
+ return vbslq_u8(lf_pos, line_feed_vector, result);
63
+ }
64
+
65
+ // offset is the number of characters in the current line.
66
+ // It can range from 0 to line_length (inclusive).
67
+ // If offset == line_length, we need to insert a line feed before writing
68
+ // anything.
69
+ size_t write_output_with_line_feeds(uint8_t *dst, uint8x16_t src,
70
+ size_t line_length, size_t &offset) {
71
+ // Fast path: no need to insert line feeds
72
+ // If we are at offset, we would write from [offset, offset + 16).
73
+ // We need that line_length >= offset + 16.
74
+ if (offset + 16 <= line_length) {
75
+ // No need to insert line feeds
76
+ vst1q_u8(dst, src);
77
+ offset += 16; // offset could be line_length here.
78
+ return 16;
79
+ }
80
+
81
+ // We have that offset + 16 >= line_length
82
+ // the common case is that line_length is greater than 16
83
+ if (simdutf_likely(line_length >= 16)) {
84
+ // offset <= line_length.
85
+ // offset + 16 > line_length
86
+ // So line_length - offset < 16
87
+ // and line_length - offset >= 0
88
+ uint8x16_t chunk = insert_line_feed16(src, line_length - offset);
89
+ vst1q_u8(dst, chunk);
90
+ // Not ideal to pull the last element and write it separately but
91
+ // it simplifies the code.
92
+ *(dst + 16) = vgetq_lane_u8(src, 15);
93
+ offset += 16 - line_length;
94
+ return 16 + 1; // we wrote 16 bytes plus one line feed
95
+ }
96
+ // Uncommon case where line_length < 16
97
+ // This is going to be SLOW.
98
+ else {
99
+ uint8_t buffer[16];
100
+ vst1q_u8(buffer, src);
101
+ size_t out_pos = 0;
102
+ size_t local_offset = offset;
103
+ for (size_t i = 0; i < 16;) {
104
+ if (local_offset == line_length) {
105
+ dst[out_pos++] = '\n';
106
+ local_offset = 0;
107
+ }
108
+ dst[out_pos++] = buffer[i++];
109
+ local_offset++;
110
+ }
111
+ offset = local_offset;
112
+ return out_pos;
113
+ }
114
+ }
115
+
116
+ template <bool insert_line_feeds>
117
+ size_t encode_base64_impl(char *dst, const char *src, size_t srclen,
118
+ base64_options options,
119
+ size_t line_length = simdutf::default_line_length) {
120
+ size_t offset = 0;
121
+ if (line_length < 4) {
122
+ line_length = 4; // We do not support line_length less than 4
123
+ }
124
+ // credit: Wojciech Muła
125
+ uint8_t *out = (uint8_t *)dst;
126
+ constexpr static uint8_t source_table[64] = {
127
+ 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D',
128
+ 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W',
129
+ 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p',
130
+ '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8',
131
+ 'N', 'd', 't', '9', 'O', 'e', 'u', '+', 'P', 'f', 'v', '/',
132
+ };
133
+ constexpr static uint8_t source_table_url[64] = {
134
+ 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D',
135
+ 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W',
136
+ 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p',
137
+ '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8',
138
+ 'N', 'd', 't', '9', 'O', 'e', 'u', '-', 'P', 'f', 'v', '_',
139
+ };
140
+ const uint8x16_t v3f = vdupq_n_u8(0x3f);
141
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
142
+ // When trying to load a uint8_t array, Visual Studio might
143
+ // error with: error C2664: '__n128x4 neon_ld4m_q8(const char *)':
144
+ // cannot convert argument 1 from 'const uint8_t [64]' to 'const char *
145
+ const uint8x16x4_t table = vld4q_u8(
146
+ (reinterpret_cast<const char *>(options & base64_url) ? source_table_url
147
+ : source_table));
148
+ #else
149
+ const uint8x16x4_t table =
150
+ vld4q_u8((options & base64_url) ? source_table_url : source_table);
151
+ #endif
152
+ size_t i = 0;
153
+ for (; i + 16 * 3 <= srclen; i += 16 * 3) {
154
+ const uint8x16x3_t in = vld3q_u8((const uint8_t *)src + i);
155
+ uint8x16x4_t result;
156
+ result.val[0] = vshrq_n_u8(in.val[0], 2);
157
+ result.val[1] =
158
+ vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[1], 4), in.val[0], 4), v3f);
159
+ result.val[2] =
160
+ vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[2], 6), in.val[1], 2), v3f);
161
+ result.val[3] = vandq_u8(in.val[2], v3f);
162
+ result.val[0] = vqtbl4q_u8(table, result.val[0]);
163
+ result.val[1] = vqtbl4q_u8(table, result.val[1]);
164
+ result.val[2] = vqtbl4q_u8(table, result.val[2]);
165
+ result.val[3] = vqtbl4q_u8(table, result.val[3]);
166
+ if (insert_line_feeds) {
167
+ if (line_length >= 64) { // fast path
168
+ vst4q_u8(out, result);
169
+ if (offset + 64 > line_length) {
170
+ size_t location_end = line_length - offset;
171
+ size_t to_move = 64 - location_end;
172
+ std::memmove(out + location_end + 1, out + location_end, to_move);
173
+ out[location_end] = '\n';
174
+ offset = to_move;
175
+ out += 64 + 1;
176
+ } else {
177
+ offset += 64;
178
+ out += 64;
179
+ }
180
+ } else { // slow path
181
+ uint8x16x2_t Z0 = vzipq_u8(result.val[0], result.val[1]);
182
+ uint8x16x2_t Z1 = vzipq_u8(result.val[2], result.val[3]);
183
+ uint16x8x2_t Z2 = vzipq_u16(vreinterpretq_u16_u8(Z0.val[0]),
184
+ vreinterpretq_u16_u8(Z1.val[0]));
185
+ uint16x8x2_t Z3 = vzipq_u16(vreinterpretq_u16_u8(Z0.val[1]),
186
+ vreinterpretq_u16_u8(Z1.val[1]));
187
+ uint8x16_t T0 = vreinterpretq_u8_u16(Z2.val[0]);
188
+ uint8x16_t T1 = vreinterpretq_u8_u16(Z2.val[1]);
189
+ uint8x16_t T2 = vreinterpretq_u8_u16(Z3.val[0]);
190
+ uint8x16_t T3 = vreinterpretq_u8_u16(Z3.val[1]);
191
+ out += write_output_with_line_feeds(out, T0, line_length, offset);
192
+ out += write_output_with_line_feeds(out, T1, line_length, offset);
193
+ out += write_output_with_line_feeds(out, T2, line_length, offset);
194
+ out += write_output_with_line_feeds(out, T3, line_length, offset);
195
+ }
196
+ } else {
197
+ vst4q_u8(out, result);
198
+ out += 64;
199
+ }
200
+ }
201
+
202
+ if (i + 24 <= srclen) {
203
+ const uint8x8_t v3f_d = vdup_n_u8(0x3f);
204
+ const uint8x8x3_t in = vld3_u8((const uint8_t *)src + i);
205
+ uint8x8x4_t result;
206
+ result.val[0] = vshr_n_u8(in.val[0], 2);
207
+ result.val[1] =
208
+ vand_u8(vsli_n_u8(vshr_n_u8(in.val[1], 4), in.val[0], 4), v3f_d);
209
+ result.val[2] =
210
+ vand_u8(vsli_n_u8(vshr_n_u8(in.val[2], 6), in.val[1], 2), v3f_d);
211
+ result.val[3] = vand_u8(in.val[2], v3f_d);
212
+ result.val[0] = vqtbl4_u8(table, result.val[0]);
213
+ result.val[1] = vqtbl4_u8(table, result.val[1]);
214
+ result.val[2] = vqtbl4_u8(table, result.val[2]);
215
+ result.val[3] = vqtbl4_u8(table, result.val[3]);
216
+ if (insert_line_feeds) {
217
+ if (line_length >= 32) { // fast path
218
+ vst4_u8(out, result);
219
+ if (offset + 32 > line_length) {
220
+ size_t location_end = line_length - offset;
221
+ size_t to_move = 32 - location_end;
222
+ std::memmove(out + location_end + 1, out + location_end, to_move);
223
+ out[location_end] = '\n';
224
+ offset = to_move;
225
+ out += 32 + 1;
226
+ } else {
227
+ offset += 32;
228
+ out += 32;
229
+ }
230
+ } else { // slow path
231
+ uint8x8x2_t Z0 = vzip_u8(result.val[0], result.val[1]);
232
+ uint8x8x2_t Z1 = vzip_u8(result.val[2], result.val[3]);
233
+ uint16x4x2_t Z2 = vzip_u16(vreinterpret_u16_u8(Z0.val[0]),
234
+ vreinterpret_u16_u8(Z1.val[0]));
235
+ uint16x4x2_t Z3 = vzip_u16(vreinterpret_u16_u8(Z0.val[1]),
236
+ vreinterpret_u16_u8(Z1.val[1]));
237
+ uint8x8_t T0 = vreinterpret_u8_u16(Z2.val[0]);
238
+ uint8x8_t T1 = vreinterpret_u8_u16(Z2.val[1]);
239
+ uint8x8_t T2 = vreinterpret_u8_u16(Z3.val[0]);
240
+ uint8x8_t T3 = vreinterpret_u8_u16(Z3.val[1]);
241
+ uint8x16_t TT0 = vcombine_u8(T0, T1);
242
+ uint8x16_t TT1 = vcombine_u8(T2, T3);
243
+ out += write_output_with_line_feeds(out, TT0, line_length, offset);
244
+ out += write_output_with_line_feeds(out, TT1, line_length, offset);
245
+ }
246
+ } else {
247
+ vst4_u8(out, result);
248
+ out += 32;
249
+ }
250
+ i += 24;
251
+ }
252
+ out += scalar::base64::tail_encode_base64_impl<insert_line_feeds>(
253
+ (char *)out, src + i, srclen - i, options, line_length, offset);
254
+ return size_t((char *)out - dst);
255
+ }
256
+
257
+ size_t encode_base64(char *dst, const char *src, size_t srclen,
258
+ base64_options options) {
259
+ return encode_base64_impl<false>(dst, src, srclen, options);
260
+ }
261
+
262
+ static inline void compress(uint8x16_t data, uint16_t mask, char *output) {
263
+ if (mask == 0) {
264
+ vst1q_u8((uint8_t *)output, data);
265
+ return;
266
+ }
267
+ uint8_t mask1 = uint8_t(mask); // least significant 8 bits
268
+ uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
269
+ uint64x2_t compactmasku64 = {tables::base64::thintable_epi8[mask1],
270
+ tables::base64::thintable_epi8[mask2]};
271
+ uint8x16_t compactmask = vreinterpretq_u8_u64(compactmasku64);
272
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
273
+ const uint8x16_t off =
274
+ simdutf_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8);
275
+ #else
276
+ const uint8x16_t off = {0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8};
277
+ #endif
278
+
279
+ compactmask = vaddq_u8(compactmask, off);
280
+ uint8x16_t pruned = vqtbl1q_u8(data, compactmask);
281
+
282
+ int pop1 = tables::base64::BitsSetTable256mul2[mask1];
283
+ // then load the corresponding mask, what it does is to write
284
+ // only the first pop1 bytes from the first 8 bytes, and then
285
+ // it fills in with the bytes from the second 8 bytes + some filling
286
+ // at the end.
287
+ compactmask = vld1q_u8(tables::base64::pshufb_combine_table + pop1 * 8);
288
+ uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
289
+ vst1q_u8((uint8_t *)output, answer);
290
+ }
291
+
292
+ struct block64 {
293
+ uint8x16_t chunks[4];
294
+ };
295
+
296
+ static_assert(sizeof(block64) == 64, "block64 is not 64 bytes");
297
+ template <bool base64_url, bool default_or_url>
298
+ uint64_t to_base64_mask(block64 *b, bool *error) {
299
+ uint8x16_t v0f = vdupq_n_u8(0xf);
300
+ uint8x16_t v01 = vdupq_n_u8(0x1);
301
+
302
+ uint8x16_t lo_nibbles0 = vandq_u8(b->chunks[0], v0f);
303
+ uint8x16_t lo_nibbles1 = vandq_u8(b->chunks[1], v0f);
304
+ uint8x16_t lo_nibbles2 = vandq_u8(b->chunks[2], v0f);
305
+ uint8x16_t lo_nibbles3 = vandq_u8(b->chunks[3], v0f);
306
+
307
+ // Needed by the decoding step.
308
+ uint8x16_t hi_bits0 = vshrq_n_u8(b->chunks[0], 3);
309
+ uint8x16_t hi_bits1 = vshrq_n_u8(b->chunks[1], 3);
310
+ uint8x16_t hi_bits2 = vshrq_n_u8(b->chunks[2], 3);
311
+ uint8x16_t hi_bits3 = vshrq_n_u8(b->chunks[3], 3);
312
+ uint8x16_t lut_lo;
313
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
314
+ if (default_or_url) {
315
+ lut_lo =
316
+ simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
317
+ 0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa5, 0xa0, 0xa6);
318
+ } else if (base64_url) {
319
+ lut_lo =
320
+ simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
321
+ 0xf8, 0xf9, 0xf1, 0xa0, 0xa1, 0xa5, 0xa0, 0xa2);
322
+ } else {
323
+ lut_lo =
324
+ simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
325
+ 0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa1, 0xa0, 0xa4);
326
+ }
327
+ #else
328
+ if (default_or_url) {
329
+ lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
330
+ 0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa5, 0xa0, 0xa6};
331
+ } else if (base64_url) {
332
+ lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
333
+ 0xf8, 0xf9, 0xf1, 0xa0, 0xa1, 0xa5, 0xa0, 0xa2};
334
+ } else {
335
+ lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
336
+ 0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa1, 0xa0, 0xa4};
337
+ }
338
+ #endif
339
+ uint8x16_t lo0 = vqtbl1q_u8(lut_lo, lo_nibbles0);
340
+ uint8x16_t lo1 = vqtbl1q_u8(lut_lo, lo_nibbles1);
341
+ uint8x16_t lo2 = vqtbl1q_u8(lut_lo, lo_nibbles2);
342
+ uint8x16_t lo3 = vqtbl1q_u8(lut_lo, lo_nibbles3);
343
+ uint8x16_t lut_hi;
344
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
345
+ if (default_or_url) {
346
+ lut_hi =
347
+ simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
348
+ 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40);
349
+ } else if (base64_url) {
350
+ lut_hi =
351
+ simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
352
+ 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40);
353
+ } else {
354
+ lut_hi =
355
+ simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
356
+ 0x20, 0x20, 0x10, 0x40, 0x80, 0x80, 0x40);
357
+ }
358
+ #else
359
+ if (default_or_url) {
360
+ lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8,
361
+ 0x10, 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40};
362
+ } else if (base64_url) {
363
+ lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x4, 0x8, 0x8,
364
+ 0x10, 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40};
365
+ } else {
366
+ lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8,
367
+ 0x10, 0x20, 0x20, 0x10, 0x40, 0x80, 0x80, 0x40};
368
+ }
369
+ #endif
370
+ uint8x16_t hi0 = vqtbl1q_u8(lut_hi, hi_bits0);
371
+ uint8x16_t hi1 = vqtbl1q_u8(lut_hi, hi_bits1);
372
+ uint8x16_t hi2 = vqtbl1q_u8(lut_hi, hi_bits2);
373
+ uint8x16_t hi3 = vqtbl1q_u8(lut_hi, hi_bits3);
374
+
375
+ // maps error byte to 0 and space byte to 1, valid bytes are >1
376
+ uint8x16_t res0 = vandq_u8(lo0, hi0);
377
+ uint8x16_t res1 = vandq_u8(lo1, hi1);
378
+ uint8x16_t res2 = vandq_u8(lo2, hi2);
379
+ uint8x16_t res3 = vandq_u8(lo3, hi3);
380
+
381
+ uint8_t checks =
382
+ vminvq_u8(vminq_u8(vminq_u8(res0, res1), vminq_u8(res2, res3)));
383
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
384
+ const uint8x16_t bit_mask =
385
+ simdutf_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
386
+ 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
387
+ #else
388
+ const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
389
+ 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
390
+ #endif
391
+ uint64_t badcharmask = 0;
392
+ *error = checks == 0;
393
+ if (checks <= 1) {
394
+ // Add each of the elements next to each other, successively, to stuff each
395
+ // 8 byte mask into one.
396
+ uint8x16_t test0 = vcleq_u8(res0, v01);
397
+ uint8x16_t test1 = vcleq_u8(res1, v01);
398
+ uint8x16_t test2 = vcleq_u8(res2, v01);
399
+ uint8x16_t test3 = vcleq_u8(res3, v01);
400
+ uint8x16_t sum0 =
401
+ vpaddq_u8(vandq_u8(test0, bit_mask), vandq_u8(test1, bit_mask));
402
+ uint8x16_t sum1 =
403
+ vpaddq_u8(vandq_u8(test2, bit_mask), vandq_u8(test3, bit_mask));
404
+ sum0 = vpaddq_u8(sum0, sum1);
405
+ sum0 = vpaddq_u8(sum0, sum0);
406
+ badcharmask = vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
407
+ }
408
+ // This is the transformation step that can be done while we are waiting for
409
+ // sum0
410
+ uint8x16_t roll_lut;
411
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
412
+ if (default_or_url) {
413
+ roll_lut =
414
+ simdutf_make_uint8x16_t(0xBF, 0xE0, 0xB9, 0x13, 0x04, 0xBF, 0xBF, 0xB9,
415
+ 0xB9, 0x00, 0xFF, 0x11, 0xFF, 0xBF, 0x10, 0xB9);
416
+ } else if (base64_url) {
417
+ roll_lut =
418
+ simdutf_make_uint8x16_t(0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x11, 0xE0, 0x00,
419
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
420
+ } else {
421
+ roll_lut =
422
+ simdutf_make_uint8x16_t(0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x10, 0x13, 0x00,
423
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
424
+ }
425
+ #else
426
+ if (default_or_url) {
427
+ roll_lut = uint8x16_t{0xBF, 0xE0, 0xB9, 0x13, 0x04, 0xBF, 0xBF, 0xB9,
428
+ 0xB9, 0x00, 0xFF, 0x11, 0xFF, 0xBF, 0x10, 0xB9};
429
+ } else if (base64_url) {
430
+ roll_lut = uint8x16_t{0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x11, 0xE0, 0x00,
431
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
432
+ } else {
433
+ roll_lut = uint8x16_t{0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x10, 0x13, 0x00,
434
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
435
+ }
436
+ #endif
437
+ uint8x16_t roll0, roll1, roll2, roll3;
438
+ if (default_or_url) {
439
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
440
+ const uint8x16_t delta_asso =
441
+ simdutf_make_uint8x16_t(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
442
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x16);
443
+ #else
444
+ const uint8x16_t delta_asso =
445
+ uint8x16_t{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
446
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x16};
447
+ #endif
448
+ // the logic of translating is based on westmere
449
+ uint8x16_t delta_hash0 =
450
+ vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles0), hi_bits0);
451
+ uint8x16_t delta_hash1 =
452
+ vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles1), hi_bits1);
453
+ uint8x16_t delta_hash2 =
454
+ vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles2), hi_bits2);
455
+ uint8x16_t delta_hash3 =
456
+ vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles3), hi_bits3);
457
+ const uint8x16x2_t roll_lut_2 = {roll_lut, roll_lut};
458
+ roll0 = vqtbl2q_u8(roll_lut_2, delta_hash0);
459
+ roll1 = vqtbl2q_u8(roll_lut_2, delta_hash1);
460
+ roll2 = vqtbl2q_u8(roll_lut_2, delta_hash2);
461
+ roll3 = vqtbl2q_u8(roll_lut_2, delta_hash3);
462
+ } else {
463
+ uint8x16_t delta_hash0 = vclzq_u8(res0);
464
+ uint8x16_t delta_hash1 = vclzq_u8(res1);
465
+ uint8x16_t delta_hash2 = vclzq_u8(res2);
466
+ uint8x16_t delta_hash3 = vclzq_u8(res3);
467
+ roll0 = vqtbl1q_u8(roll_lut, delta_hash0);
468
+ roll1 = vqtbl1q_u8(roll_lut, delta_hash1);
469
+ roll2 = vqtbl1q_u8(roll_lut, delta_hash2);
470
+ roll3 = vqtbl1q_u8(roll_lut, delta_hash3);
471
+ }
472
+
473
+ b->chunks[0] = vaddq_u8(b->chunks[0], roll0);
474
+ b->chunks[1] = vaddq_u8(b->chunks[1], roll1);
475
+ b->chunks[2] = vaddq_u8(b->chunks[2], roll2);
476
+ b->chunks[3] = vaddq_u8(b->chunks[3], roll3);
477
+ return badcharmask;
478
+ }
479
+
480
+ void copy_block(block64 *b, char *output) {
481
+ vst1q_u8((uint8_t *)output, b->chunks[0]);
482
+ vst1q_u8((uint8_t *)output + 16, b->chunks[1]);
483
+ vst1q_u8((uint8_t *)output + 32, b->chunks[2]);
484
+ vst1q_u8((uint8_t *)output + 48, b->chunks[3]);
485
+ }
486
+
487
+ uint64_t compress_block(block64 *b, uint64_t mask, char *output) {
488
+ uint64_t popcounts =
489
+ vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
490
+ uint64_t offsets = popcounts * 0x0101010101010101;
491
+ compress(b->chunks[0], uint16_t(mask), output);
492
+ compress(b->chunks[1], uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF]);
493
+ compress(b->chunks[2], uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF]);
494
+ compress(b->chunks[3], uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF]);
495
+ return offsets >> 56;
496
+ }
497
+
498
+ // The caller of this function is responsible to ensure that there are 64 bytes
499
+ // available from reading at src. The data is read into a block64 structure.
500
+ void load_block(block64 *b, const char *src) {
501
+ b->chunks[0] = vld1q_u8(reinterpret_cast<const uint8_t *>(src));
502
+ b->chunks[1] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 16);
503
+ b->chunks[2] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 32);
504
+ b->chunks[3] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 48);
505
+ }
506
+
507
+ // The caller of this function is responsible to ensure that there are 32 bytes
508
+ // available from reading at data. It returns a 16-byte value, narrowing with
509
+ // saturation the 16-bit words.
510
+ inline uint8x16_t load_satured(const uint16_t *data) {
511
+ uint16x8_t in1 = vld1q_u16(data);
512
+ uint16x8_t in2 = vld1q_u16(data + 8);
513
+ return vqmovn_high_u16(vqmovn_u16(in1), in2);
514
+ }
515
+
516
+ // The caller of this function is responsible to ensure that there are 128 bytes
517
+ // available from reading at src. The data is read into a block64 structure.
518
+ void load_block(block64 *b, const char16_t *src) {
519
+ b->chunks[0] = load_satured(reinterpret_cast<const uint16_t *>(src));
520
+ b->chunks[1] = load_satured(reinterpret_cast<const uint16_t *>(src) + 16);
521
+ b->chunks[2] = load_satured(reinterpret_cast<const uint16_t *>(src) + 32);
522
+ b->chunks[3] = load_satured(reinterpret_cast<const uint16_t *>(src) + 48);
523
+ }
524
+
525
+ // decode 64 bytes and output 48 bytes
526
+ void base64_decode_block(char *out, const char *src) {
527
+ uint8x16x4_t str = vld4q_u8((uint8_t *)src);
528
+ uint8x16x3_t outvec;
529
+ outvec.val[0] = vsliq_n_u8(vshrq_n_u8(str.val[1], 4), str.val[0], 2);
530
+ outvec.val[1] = vsliq_n_u8(vshrq_n_u8(str.val[2], 2), str.val[1], 4);
531
+ outvec.val[2] = vsliq_n_u8(str.val[3], str.val[2], 6);
532
+ vst3q_u8((uint8_t *)out, outvec);
533
+ }
534
+
535
+ static size_t compress_block_single(block64 *b, uint64_t mask, char *output) {
536
+ const size_t pos64 = trailing_zeroes(mask);
537
+ const int8_t pos = pos64 & 0xf;
538
+
539
+ // Predefine the index vector
540
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
541
+ const uint8x16_t v1 = simdutf_make_uint8x16_t(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
542
+ 10, 11, 12, 13, 14, 15);
543
+ #else // SIMDUTF_REGULAR_VISUAL_STUDIO
544
+ const uint8x16_t v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
545
+ #endif // SIMDUTF_REGULAR_VISUAL_STUDIO
546
+
547
+ switch (pos64 >> 4) {
548
+ case 0b00: {
549
+ const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
550
+ const uint8x16_t v2 =
551
+ vcgtq_s8(vreinterpretq_s8_u8(v1),
552
+ vreinterpretq_s8_u8(v0)); // Compare greater than
553
+ const uint8x16_t sh = vsubq_u8(v1, v2); // Subtract
554
+ const uint8x16_t compressed =
555
+ vqtbl1q_u8(b->chunks[0], sh); // Table lookup (shuffle)
556
+
557
+ vst1q_u8((uint8_t *)(output + 0 * 16), compressed);
558
+ vst1q_u8((uint8_t *)(output + 1 * 16 - 1), b->chunks[1]);
559
+ vst1q_u8((uint8_t *)(output + 2 * 16 - 1), b->chunks[2]);
560
+ vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
561
+ } break;
562
+
563
+ case 0b01: {
564
+ vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
565
+
566
+ const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
567
+ const uint8x16_t v2 =
568
+ vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
569
+ const uint8x16_t sh = vsubq_u8(v1, v2);
570
+ const uint8x16_t compressed = vqtbl1q_u8(b->chunks[1], sh);
571
+
572
+ vst1q_u8((uint8_t *)(output + 1 * 16), compressed);
573
+ vst1q_u8((uint8_t *)(output + 2 * 16 - 1), b->chunks[2]);
574
+ vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
575
+ } break;
576
+
577
+ case 0b10: {
578
+ vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
579
+ vst1q_u8((uint8_t *)(output + 1 * 16), b->chunks[1]);
580
+
581
+ const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
582
+ const uint8x16_t v2 =
583
+ vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
584
+ const uint8x16_t sh = vsubq_u8(v1, v2);
585
+ const uint8x16_t compressed = vqtbl1q_u8(b->chunks[2], sh);
586
+
587
+ vst1q_u8((uint8_t *)(output + 2 * 16), compressed);
588
+ vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
589
+ } break;
590
+
591
+ case 0b11: {
592
+ vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
593
+ vst1q_u8((uint8_t *)(output + 1 * 16), b->chunks[1]);
594
+ vst1q_u8((uint8_t *)(output + 2 * 16), b->chunks[2]);
595
+
596
+ const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
597
+ const uint8x16_t v2 =
598
+ vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
599
+ const uint8x16_t sh = vsubq_u8(v1, v2);
600
+ const uint8x16_t compressed = vqtbl1q_u8(b->chunks[3], sh);
601
+
602
+ vst1q_u8((uint8_t *)(output + 3 * 16), compressed);
603
+ } break;
604
+ }
605
+ return 63;
606
+ }
607
+
608
+ template <typename T> bool is_power_of_two(T x) { return (x & (x - 1)) == 0; }
609
+
610
+ template <bool base64_url, bool ignore_garbage, bool default_or_url,
611
+ typename char_type>
612
+ full_result
613
+ compress_decode_base64(char *dst, const char_type *src, size_t srclen,
614
+ base64_options options,
615
+ last_chunk_handling_options last_chunk_options) {
616
+ const uint8_t *to_base64 =
617
+ default_or_url ? tables::base64::to_base64_default_or_url_value
618
+ : (base64_url ? tables::base64::to_base64_url_value
619
+ : tables::base64::to_base64_value);
620
+ auto ri = simdutf::scalar::base64::find_end(src, srclen, options);
621
+ size_t equallocation = ri.equallocation;
622
+ size_t equalsigns = ri.equalsigns;
623
+ srclen = ri.srclen;
624
+ size_t full_input_length = ri.full_input_length;
625
+ if (srclen == 0) {
626
+ if (!ignore_garbage && equalsigns > 0) {
627
+ return {INVALID_BASE64_CHARACTER, equallocation, 0};
628
+ }
629
+ return {SUCCESS, full_input_length, 0};
630
+ }
631
+ const char_type *const srcinit = src;
632
+ const char *const dstinit = dst;
633
+ const char_type *const srcend = src + srclen;
634
+
635
+ constexpr size_t block_size = 10;
636
+ char buffer[block_size * 64];
637
+ char *bufferptr = buffer;
638
+ if (srclen >= 64) {
639
+ const char_type *const srcend64 = src + srclen - 64;
640
+ while (src <= srcend64) {
641
+ block64 b;
642
+ load_block(&b, src);
643
+ src += 64;
644
+ bool error = false;
645
+ uint64_t badcharmask =
646
+ to_base64_mask<base64_url, default_or_url>(&b, &error);
647
+ if (badcharmask) {
648
+ if (error && !ignore_garbage) {
649
+ src -= 64;
650
+ while (src < srcend && scalar::base64::is_eight_byte(*src) &&
651
+ to_base64[uint8_t(*src)] <= 64) {
652
+ src++;
653
+ }
654
+ if (src < srcend) {
655
+ // should never happen
656
+ }
657
+ return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
658
+ size_t(dst - dstinit)};
659
+ }
660
+ }
661
+
662
+ if (badcharmask != 0) {
663
+ // optimization opportunity: check for simple masks like those made of
664
+ // continuous 1s followed by continuous 0s. And masks containing a
665
+ // single bad character.
666
+ if (is_power_of_two(badcharmask)) {
667
+ bufferptr += compress_block_single(&b, badcharmask, bufferptr);
668
+ } else {
669
+ bufferptr += compress_block(&b, badcharmask, bufferptr);
670
+ }
671
+ } else {
672
+ // optimization opportunity: if bufferptr == buffer and mask == 0, we
673
+ // can avoid the call to compress_block and decode directly.
674
+ copy_block(&b, bufferptr);
675
+ bufferptr += 64;
676
+ }
677
+ if (bufferptr >= (block_size - 1) * 64 + buffer) {
678
+ for (size_t i = 0; i < (block_size - 1); i++) {
679
+ base64_decode_block(dst, buffer + i * 64);
680
+ dst += 48;
681
+ }
682
+ std::memcpy(buffer, buffer + (block_size - 1) * 64,
683
+ 64); // 64 might be too much
684
+ bufferptr -= (block_size - 1) * 64;
685
+ }
686
+ }
687
+ }
688
+ char *buffer_start = buffer;
689
+ // Optimization note: if this is almost full, then it is worth our
690
+ // time, otherwise, we should just decode directly.
691
+ int last_block = (int)((bufferptr - buffer_start) % 64);
692
+ if (last_block != 0 && srcend - src + last_block >= 64) {
693
+ while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) {
694
+ uint8_t val = to_base64[uint8_t(*src)];
695
+ *bufferptr = char(val);
696
+ if ((!scalar::base64::is_eight_byte(*src) || val > 64) &&
697
+ !ignore_garbage) {
698
+ return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
699
+ size_t(dst - dstinit)};
700
+ }
701
+ bufferptr += (val <= 63);
702
+ src++;
703
+ }
704
+ }
705
+
706
+ for (; buffer_start + 64 <= bufferptr; buffer_start += 64) {
707
+ base64_decode_block(dst, buffer_start);
708
+ dst += 48;
709
+ }
710
+ if ((bufferptr - buffer_start) % 64 != 0) {
711
+ while (buffer_start + 4 < bufferptr) {
712
+ uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
713
+ (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
714
+ (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
715
+ (uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
716
+ << 8;
717
+ #if !SIMDUTF_IS_BIG_ENDIAN
718
+ triple = scalar::u32_swap_bytes(triple);
719
+ #endif
720
+ std::memcpy(dst, &triple, 4);
721
+
722
+ dst += 3;
723
+ buffer_start += 4;
724
+ }
725
+ if (buffer_start + 4 <= bufferptr) {
726
+ uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
727
+ (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
728
+ (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
729
+ (uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
730
+ << 8;
731
+ #if !SIMDUTF_IS_BIG_ENDIAN
732
+ triple = scalar::u32_swap_bytes(triple);
733
+ #endif
734
+ std::memcpy(dst, &triple, 3);
735
+
736
+ dst += 3;
737
+ buffer_start += 4;
738
+ }
739
+ // we may have 1, 2 or 3 bytes left and we need to decode them so let us
740
+ // backtrack
741
+ int leftover = int(bufferptr - buffer_start);
742
+ while (leftover > 0) {
743
+ if (!ignore_garbage) {
744
+ while (to_base64[uint8_t(*(src - 1))] == 64) {
745
+ src--;
746
+ }
747
+ } else {
748
+ while (to_base64[uint8_t(*(src - 1))] >= 64) {
749
+ src--;
750
+ }
751
+ }
752
+ src--;
753
+ leftover--;
754
+ }
755
+ }
756
+ if (src < srcend + equalsigns) {
757
+ full_result r = scalar::base64::base64_tail_decode(
758
+ dst, src, srcend - src, equalsigns, options, last_chunk_options);
759
+ r = scalar::base64::patch_tail_result(
760
+ r, size_t(src - srcinit), size_t(dst - dstinit), equallocation,
761
+ full_input_length, last_chunk_options);
762
+ // When is_partial(last_chunk_options) is true, we must either end with
763
+ // the end of the stream (beyond whitespace) or right after a non-ignorable
764
+ // character or at the very beginning of the stream.
765
+ // See https://tc39.es/proposal-arraybuffer-base64/spec/#sec-frombase64
766
+ if (is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
767
+ r.input_count < full_input_length) {
768
+ // First check if we can extend the input to the end of the stream
769
+ while (r.input_count < full_input_length &&
770
+ base64_ignorable(*(srcinit + r.input_count), options)) {
771
+ r.input_count++;
772
+ }
773
+ // If we are still not at the end of the stream, then we must backtrack
774
+ // to the last non-ignorable character.
775
+ if (r.input_count < full_input_length) {
776
+ while (r.input_count > 0 &&
777
+ base64_ignorable(*(srcinit + r.input_count - 1), options)) {
778
+ r.input_count--;
779
+ }
780
+ }
781
+ }
782
+ return r;
783
+ }
784
+ if (equalsigns > 0 && !ignore_garbage) {
785
+ if ((size_t(dst - dstinit) % 3 == 0) ||
786
+ ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) {
787
+ return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)};
788
+ }
789
+ }
790
+ return {SUCCESS, srclen, size_t(dst - dstinit)};
791
+ }