react-native-quick-crypto 1.0.19 → 1.1.1

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 (561) hide show
  1. package/QuickCrypto.podspec +12 -38
  2. package/README.md +2 -0
  3. package/android/CMakeLists.txt +3 -0
  4. package/android/build.gradle +5 -1
  5. package/cpp/argon2/HybridArgon2.cpp +10 -3
  6. package/cpp/blake3/HybridBlake3.cpp +5 -3
  7. package/cpp/cipher/CCMCipher.cpp +29 -16
  8. package/cpp/cipher/CCMCipher.hpp +2 -4
  9. package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
  10. package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
  11. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
  12. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
  13. package/cpp/cipher/GCMCipher.cpp +14 -15
  14. package/cpp/cipher/HybridCipher.cpp +39 -36
  15. package/cpp/cipher/HybridCipher.hpp +17 -1
  16. package/cpp/cipher/HybridRsaCipher.cpp +74 -29
  17. package/cpp/cipher/OCBCipher.cpp +4 -3
  18. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
  19. package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
  20. package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
  21. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
  22. package/cpp/dh/HybridDiffieHellman.cpp +29 -0
  23. package/cpp/ec/HybridEcKeyPair.cpp +35 -33
  24. package/cpp/ec/HybridEcKeyPair.hpp +3 -7
  25. package/cpp/ecdh/HybridECDH.cpp +23 -0
  26. package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
  27. package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
  28. package/cpp/hash/HybridHash.cpp +5 -7
  29. package/cpp/hkdf/HybridHkdf.cpp +6 -4
  30. package/cpp/hmac/HybridHmac.cpp +4 -6
  31. package/cpp/kmac/HybridKmac.cpp +4 -4
  32. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
  33. package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
  34. package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
  35. package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
  36. package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
  37. package/cpp/scrypt/HybridScrypt.cpp +6 -4
  38. package/cpp/sign/HybridSignHandle.cpp +25 -68
  39. package/cpp/sign/HybridVerifyHandle.cpp +23 -60
  40. package/cpp/utils/HybridUtils.cpp +213 -111
  41. package/cpp/utils/HybridUtils.hpp +9 -2
  42. package/cpp/utils/QuickCryptoUtils.hpp +72 -0
  43. package/deps/simdutf/LICENSE-APACHE +201 -0
  44. package/deps/simdutf/LICENSE-MIT +18 -0
  45. package/deps/simdutf/README.md +2782 -0
  46. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  47. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  48. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  49. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  50. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  51. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  52. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  53. package/deps/simdutf/include/simdutf/error.h +126 -0
  54. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  55. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  56. package/deps/simdutf/include/simdutf/portability.h +285 -0
  57. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  58. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  59. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  60. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  61. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  62. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  63. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  64. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  65. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  66. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  67. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  68. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  69. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  70. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  71. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  72. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  73. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  74. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  75. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  76. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  77. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  78. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  79. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  80. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  81. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  82. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  83. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  84. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  85. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  86. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  87. package/deps/simdutf/include/simdutf.h +26 -0
  88. package/deps/simdutf/include/simdutf_c.h +342 -0
  89. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  90. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  91. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  92. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  93. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  94. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  95. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  96. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  97. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  98. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  99. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  100. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  101. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  102. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  103. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  104. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  105. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  106. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  107. package/deps/simdutf/src/encoding_types.cpp +67 -0
  108. package/deps/simdutf/src/error.cpp +3 -0
  109. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  110. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  111. package/deps/simdutf/src/generic/base64.h +233 -0
  112. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  113. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  114. package/deps/simdutf/src/generic/find.h +75 -0
  115. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  116. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  117. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  118. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  119. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  120. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  121. package/deps/simdutf/src/generic/utf16.h +73 -0
  122. package/deps/simdutf/src/generic/utf32.h +136 -0
  123. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  124. package/deps/simdutf/src/generic/utf8.h +92 -0
  125. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  126. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  127. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  128. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  129. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  130. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  131. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  132. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  133. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  134. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  135. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  136. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  137. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  138. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  139. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  140. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  141. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  142. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  143. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  144. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  145. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  146. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  147. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  148. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  149. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  150. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  151. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  152. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  153. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  154. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  155. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  156. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  157. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  158. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  159. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  160. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  161. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  162. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  163. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  164. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  165. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  166. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  167. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  168. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  169. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  170. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  171. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  172. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  173. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  174. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  175. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  176. package/deps/simdutf/src/implementation.cpp +2526 -0
  177. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  178. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  179. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  180. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  181. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  182. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  183. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  184. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  185. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  186. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  187. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  188. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  189. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  190. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  191. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  192. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  193. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  194. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  195. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  196. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  197. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  198. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  199. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  200. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  201. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  202. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  203. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  204. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  205. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  206. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  207. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  208. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  209. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  210. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  211. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  212. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  213. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  214. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  215. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  216. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  217. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  218. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  219. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  220. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  221. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  222. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  223. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  224. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  225. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  226. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  227. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  228. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  229. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  230. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  231. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  232. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  233. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  234. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  235. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  236. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  237. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  238. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  239. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  240. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  241. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  242. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  243. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  244. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  245. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  246. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  247. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  248. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  249. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  250. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  251. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  252. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  253. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  254. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  255. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  256. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  257. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  258. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  259. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  260. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  261. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  262. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  263. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  264. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  265. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  266. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  267. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  268. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  269. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  270. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  271. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  272. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  273. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  274. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  275. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  276. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  277. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  278. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  279. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  280. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  281. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  282. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  283. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  284. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  285. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  286. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  287. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  288. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  289. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  290. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  291. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  292. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  293. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  294. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  295. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  296. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  297. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  298. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  299. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  300. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  301. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  302. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  303. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  304. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  305. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  306. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  307. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  308. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  309. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  310. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  311. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  312. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  313. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  314. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  315. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  316. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  317. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  318. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  319. package/deps/simdutf/src/simdutf.cpp +152 -0
  320. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  321. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  322. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  323. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  324. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  325. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  326. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  327. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  328. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  329. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  330. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  331. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  332. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  333. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  334. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  335. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  336. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  337. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  338. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  339. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  340. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  341. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  342. package/lib/commonjs/argon2.js +51 -2
  343. package/lib/commonjs/argon2.js.map +1 -1
  344. package/lib/commonjs/cipher.js +109 -11
  345. package/lib/commonjs/cipher.js.map +1 -1
  346. package/lib/commonjs/dsa.js +8 -2
  347. package/lib/commonjs/dsa.js.map +1 -1
  348. package/lib/commonjs/hash.js +15 -5
  349. package/lib/commonjs/hash.js.map +1 -1
  350. package/lib/commonjs/hkdf.js +33 -6
  351. package/lib/commonjs/hkdf.js.map +1 -1
  352. package/lib/commonjs/hmac.js +15 -5
  353. package/lib/commonjs/hmac.js.map +1 -1
  354. package/lib/commonjs/keys/publicCipher.js +10 -4
  355. package/lib/commonjs/keys/publicCipher.js.map +1 -1
  356. package/lib/commonjs/random.js +11 -2
  357. package/lib/commonjs/random.js.map +1 -1
  358. package/lib/commonjs/rsa.js +12 -5
  359. package/lib/commonjs/rsa.js.map +1 -1
  360. package/lib/commonjs/scrypt.js +47 -6
  361. package/lib/commonjs/scrypt.js.map +1 -1
  362. package/lib/commonjs/subtle.js +76 -5
  363. package/lib/commonjs/subtle.js.map +1 -1
  364. package/lib/commonjs/utils/cipher.js +18 -7
  365. package/lib/commonjs/utils/cipher.js.map +1 -1
  366. package/lib/commonjs/utils/conversion.js +33 -9
  367. package/lib/commonjs/utils/conversion.js.map +1 -1
  368. package/lib/commonjs/utils/timingSafeEqual.js +7 -2
  369. package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
  370. package/lib/commonjs/x509certificate.js +6 -6
  371. package/lib/commonjs/x509certificate.js.map +1 -1
  372. package/lib/module/argon2.js +51 -2
  373. package/lib/module/argon2.js.map +1 -1
  374. package/lib/module/cipher.js +109 -11
  375. package/lib/module/cipher.js.map +1 -1
  376. package/lib/module/dsa.js +8 -2
  377. package/lib/module/dsa.js.map +1 -1
  378. package/lib/module/hash.js +15 -5
  379. package/lib/module/hash.js.map +1 -1
  380. package/lib/module/hkdf.js +33 -6
  381. package/lib/module/hkdf.js.map +1 -1
  382. package/lib/module/hmac.js +15 -5
  383. package/lib/module/hmac.js.map +1 -1
  384. package/lib/module/keys/publicCipher.js +10 -4
  385. package/lib/module/keys/publicCipher.js.map +1 -1
  386. package/lib/module/random.js +11 -2
  387. package/lib/module/random.js.map +1 -1
  388. package/lib/module/rsa.js +11 -4
  389. package/lib/module/rsa.js.map +1 -1
  390. package/lib/module/scrypt.js +47 -6
  391. package/lib/module/scrypt.js.map +1 -1
  392. package/lib/module/subtle.js +76 -5
  393. package/lib/module/subtle.js.map +1 -1
  394. package/lib/module/utils/cipher.js +18 -7
  395. package/lib/module/utils/cipher.js.map +1 -1
  396. package/lib/module/utils/conversion.js +33 -9
  397. package/lib/module/utils/conversion.js.map +1 -1
  398. package/lib/module/utils/timingSafeEqual.js +8 -3
  399. package/lib/module/utils/timingSafeEqual.js.map +1 -1
  400. package/lib/module/x509certificate.js +6 -6
  401. package/lib/module/x509certificate.js.map +1 -1
  402. package/lib/typescript/argon2.d.ts.map +1 -1
  403. package/lib/typescript/cipher.d.ts +2 -2
  404. package/lib/typescript/cipher.d.ts.map +1 -1
  405. package/lib/typescript/dsa.d.ts.map +1 -1
  406. package/lib/typescript/hash.d.ts +2 -2
  407. package/lib/typescript/hash.d.ts.map +1 -1
  408. package/lib/typescript/hkdf.d.ts.map +1 -1
  409. package/lib/typescript/hmac.d.ts +2 -2
  410. package/lib/typescript/hmac.d.ts.map +1 -1
  411. package/lib/typescript/index.d.ts +1 -1
  412. package/lib/typescript/index.d.ts.map +1 -1
  413. package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
  414. package/lib/typescript/random.d.ts.map +1 -1
  415. package/lib/typescript/rsa.d.ts.map +1 -1
  416. package/lib/typescript/scrypt.d.ts.map +1 -1
  417. package/lib/typescript/specs/utils.nitro.d.ts +0 -2
  418. package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
  419. package/lib/typescript/subtle.d.ts.map +1 -1
  420. package/lib/typescript/utils/cipher.d.ts +13 -1
  421. package/lib/typescript/utils/cipher.d.ts.map +1 -1
  422. package/lib/typescript/utils/conversion.d.ts +9 -6
  423. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  424. package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
  425. package/lib/typescript/x509certificate.d.ts.map +1 -1
  426. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
  427. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
  428. package/package.json +38 -6
  429. package/src/argon2.ts +80 -2
  430. package/src/cipher.ts +139 -15
  431. package/src/dsa.ts +11 -2
  432. package/src/hash.ts +17 -7
  433. package/src/hkdf.ts +44 -6
  434. package/src/hmac.ts +17 -7
  435. package/src/keys/publicCipher.ts +10 -4
  436. package/src/random.ts +11 -2
  437. package/src/rsa.ts +18 -4
  438. package/src/scrypt.ts +73 -6
  439. package/src/specs/utils.nitro.ts +0 -2
  440. package/src/subtle.ts +90 -8
  441. package/src/utils/cipher.ts +30 -8
  442. package/src/utils/conversion.ts +58 -20
  443. package/src/utils/timingSafeEqual.ts +8 -3
  444. package/src/x509certificate.ts +5 -6
  445. package/deps/blake3/.cargo/config.toml +0 -2
  446. package/deps/blake3/.git-blame-ignore-revs +0 -2
  447. package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
  448. package/deps/blake3/.github/workflows/ci.yml +0 -491
  449. package/deps/blake3/.github/workflows/tag.yml +0 -43
  450. package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
  451. package/deps/blake3/CONTRIBUTING.md +0 -31
  452. package/deps/blake3/Cargo.toml +0 -135
  453. package/deps/blake3/b3sum/Cargo.lock +0 -513
  454. package/deps/blake3/b3sum/Cargo.toml +0 -26
  455. package/deps/blake3/b3sum/README.md +0 -72
  456. package/deps/blake3/b3sum/src/main.rs +0 -564
  457. package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
  458. package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
  459. package/deps/blake3/b3sum/what_does_check_do.md +0 -176
  460. package/deps/blake3/benches/bench.rs +0 -623
  461. package/deps/blake3/build.rs +0 -389
  462. package/deps/blake3/c/CMakeLists.txt +0 -383
  463. package/deps/blake3/c/CMakePresets.json +0 -73
  464. package/deps/blake3/c/Makefile.testing +0 -82
  465. package/deps/blake3/c/blake3-config.cmake.in +0 -14
  466. package/deps/blake3/c/blake3_avx2.c +0 -326
  467. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
  468. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
  469. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
  470. package/deps/blake3/c/blake3_avx512.c +0 -1388
  471. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
  472. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
  473. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
  474. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
  475. package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
  476. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
  477. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
  478. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
  479. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
  480. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
  481. package/deps/blake3/c/blake3_sse2.c +0 -566
  482. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
  483. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
  484. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
  485. package/deps/blake3/c/blake3_sse41.c +0 -560
  486. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
  487. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
  488. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
  489. package/deps/blake3/c/blake3_tbb.cpp +0 -37
  490. package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
  491. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
  492. package/deps/blake3/c/example.c +0 -36
  493. package/deps/blake3/c/example_tbb.c +0 -57
  494. package/deps/blake3/c/libblake3.pc.in +0 -12
  495. package/deps/blake3/c/main.c +0 -166
  496. package/deps/blake3/c/test.py +0 -97
  497. package/deps/blake3/media/B3.svg +0 -70
  498. package/deps/blake3/media/BLAKE3.svg +0 -85
  499. package/deps/blake3/media/speed.svg +0 -1474
  500. package/deps/blake3/reference_impl/Cargo.toml +0 -8
  501. package/deps/blake3/reference_impl/README.md +0 -14
  502. package/deps/blake3/reference_impl/reference_impl.rs +0 -374
  503. package/deps/blake3/src/ffi_avx2.rs +0 -65
  504. package/deps/blake3/src/ffi_avx512.rs +0 -169
  505. package/deps/blake3/src/ffi_neon.rs +0 -82
  506. package/deps/blake3/src/ffi_sse2.rs +0 -126
  507. package/deps/blake3/src/ffi_sse41.rs +0 -126
  508. package/deps/blake3/src/guts.rs +0 -60
  509. package/deps/blake3/src/hazmat.rs +0 -704
  510. package/deps/blake3/src/io.rs +0 -64
  511. package/deps/blake3/src/join.rs +0 -92
  512. package/deps/blake3/src/lib.rs +0 -1835
  513. package/deps/blake3/src/platform.rs +0 -587
  514. package/deps/blake3/src/portable.rs +0 -198
  515. package/deps/blake3/src/rust_avx2.rs +0 -474
  516. package/deps/blake3/src/rust_sse2.rs +0 -775
  517. package/deps/blake3/src/rust_sse41.rs +0 -766
  518. package/deps/blake3/src/test.rs +0 -1049
  519. package/deps/blake3/src/traits.rs +0 -227
  520. package/deps/blake3/src/wasm32_simd.rs +0 -794
  521. package/deps/blake3/test_vectors/Cargo.toml +0 -19
  522. package/deps/blake3/test_vectors/cross_test.sh +0 -25
  523. package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
  524. package/deps/blake3/test_vectors/src/lib.rs +0 -350
  525. package/deps/blake3/test_vectors/test_vectors.json +0 -217
  526. package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
  527. package/deps/blake3/tools/compiler_version/build.rs +0 -6
  528. package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
  529. package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
  530. package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
  531. package/deps/blake3/tools/release.md +0 -16
  532. package/deps/ncrypto/.bazelignore +0 -4
  533. package/deps/ncrypto/.bazelrc +0 -1
  534. package/deps/ncrypto/.bazelversion +0 -1
  535. package/deps/ncrypto/.clang-format +0 -111
  536. package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
  537. package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
  538. package/deps/ncrypto/.github/workflows/linter.yml +0 -38
  539. package/deps/ncrypto/.github/workflows/macos.yml +0 -43
  540. package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
  541. package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
  542. package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
  543. package/deps/ncrypto/.python-version +0 -1
  544. package/deps/ncrypto/.release-please-manifest.json +0 -3
  545. package/deps/ncrypto/BUILD.bazel +0 -44
  546. package/deps/ncrypto/CHANGELOG.md +0 -37
  547. package/deps/ncrypto/CMakeLists.txt +0 -79
  548. package/deps/ncrypto/MODULE.bazel +0 -16
  549. package/deps/ncrypto/MODULE.bazel.lock +0 -461
  550. package/deps/ncrypto/cmake/CPM.cmake +0 -1225
  551. package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
  552. package/deps/ncrypto/ncrypto.pc.in +0 -10
  553. package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
  554. package/deps/ncrypto/pyproject.toml +0 -38
  555. package/deps/ncrypto/release-please-config.json +0 -11
  556. package/deps/ncrypto/src/CMakeLists.txt +0 -40
  557. package/deps/ncrypto/tests/BUILD.bazel +0 -11
  558. package/deps/ncrypto/tests/CMakeLists.txt +0 -7
  559. package/deps/ncrypto/tests/basic.cpp +0 -856
  560. package/deps/ncrypto/tools/run-clang-format.sh +0 -42
  561. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,1442 @@
1
+ #include "simdutf/arm64/begin.h"
2
+ #include "simdutf/implementation.h"
3
+ namespace simdutf {
4
+ namespace SIMDUTF_IMPLEMENTATION {
5
+ namespace {
6
+ #ifndef SIMDUTF_ARM64_H
7
+ #error "arm64.h must be included"
8
+ #endif
9
+ using namespace simd;
10
+
11
+ #if SIMDUTF_FEATURE_ASCII || SIMDUTF_FEATURE_DETECT_ENCODING || \
12
+ SIMDUTF_FEATURE_UTF8
13
+ simdutf_really_inline bool is_ascii(const simd8x64<uint8_t> &input) {
14
+ simd8<uint8_t> bits = input.reduce_or();
15
+ return bits.max_val() < 0b10000000u;
16
+ }
17
+ #endif // SIMDUTF_FEATURE_ASCII || SIMDUTF_FEATURE_DETECT_ENCODING ||
18
+ // SIMDUTF_FEATURE_UTF8
19
+
20
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
21
+ simdutf_really_inline simd8<bool>
22
+ must_be_2_3_continuation(const simd8<uint8_t> prev2,
23
+ const simd8<uint8_t> prev3) {
24
+ simd8<bool> is_third_byte = prev2 >= uint8_t(0b11100000u);
25
+ simd8<bool> is_fourth_byte = prev3 >= uint8_t(0b11110000u);
26
+ return is_third_byte ^ is_fourth_byte;
27
+ }
28
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
29
+
30
+ #if SIMDUTF_FEATURE_UTF8 && (SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_UTF32)
31
+ // common functions for utf8 conversions
32
+ simdutf_really_inline uint16x4_t convert_utf8_3_byte_to_utf16(uint8x16_t in) {
33
+ // Low half contains 10cccccc|1110aaaa
34
+ // High half contains 10bbbbbb|10bbbbbb
35
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
36
+ const uint8x16_t sh = simdutf_make_uint8x16_t(0, 2, 3, 5, 6, 8, 9, 11, 1, 1,
37
+ 4, 4, 7, 7, 10, 10);
38
+ #else
39
+ const uint8x16_t sh = {0, 2, 3, 5, 6, 8, 9, 11, 1, 1, 4, 4, 7, 7, 10, 10};
40
+ #endif
41
+ uint8x16_t perm = vqtbl1q_u8(in, sh);
42
+ // Split into half vectors.
43
+ // 10cccccc|1110aaaa
44
+ uint8x8_t perm_low = vget_low_u8(perm); // no-op
45
+ // 10bbbbbb|10bbbbbb
46
+ uint8x8_t perm_high = vget_high_u8(perm);
47
+ // xxxxxxxx 10bbbbbb
48
+ uint16x4_t mid = vreinterpret_u16_u8(perm_high); // no-op
49
+ // xxxxxxxx 1110aaaa
50
+ uint16x4_t high = vreinterpret_u16_u8(perm_low); // no-op
51
+ // Assemble with shift left insert.
52
+ // xxxxxxaa aabbbbbb
53
+ uint16x4_t mid_high = vsli_n_u16(mid, high, 6);
54
+ // (perm_low << 8) | (perm_low >> 8)
55
+ // xxxxxxxx 10cccccc
56
+ uint16x4_t low = vreinterpret_u16_u8(vrev16_u8(perm_low));
57
+ // Shift left insert into the low bits
58
+ // aaaabbbb bbcccccc
59
+ uint16x4_t composed = vsli_n_u16(low, mid_high, 6);
60
+ return composed;
61
+ }
62
+
63
+ simdutf_really_inline uint16x8_t convert_utf8_2_byte_to_utf16(uint8x16_t in) {
64
+ // Converts 6 2 byte UTF-8 characters to 6 UTF-16 characters.
65
+ // Technically this calculates 8, but 6 does better and happens more often
66
+ // (The languages which use these codepoints use ASCII spaces so 8 would need
67
+ // to be in the middle of a very long word).
68
+
69
+ // 10bbbbbb 110aaaaa
70
+ uint16x8_t upper = vreinterpretq_u16_u8(in);
71
+ // (in << 8) | (in >> 8)
72
+ // 110aaaaa 10bbbbbb
73
+ uint16x8_t lower = vreinterpretq_u16_u8(vrev16q_u8(in));
74
+ // 00000000 000aaaaa
75
+ uint16x8_t upper_masked = vandq_u16(upper, vmovq_n_u16(0x1F));
76
+ // Assemble with shift left insert.
77
+ // 00000aaa aabbbbbb
78
+ uint16x8_t composed = vsliq_n_u16(lower, upper_masked, 6);
79
+ return composed;
80
+ }
81
+
82
+ simdutf_really_inline uint16x8_t
83
+ convert_utf8_1_to_2_byte_to_utf16(uint8x16_t in, size_t shufutf8_idx) {
84
+ // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters.
85
+ // This is a relatively easy scenario
86
+ // we process SIX (6) input code-code units. The max length in bytes of six
87
+ // code code units spanning between 1 and 2 bytes each is 12 bytes.
88
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
89
+ simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx]));
90
+ // Shuffle
91
+ // 1 byte: 00000000 0bbbbbbb
92
+ // 2 byte: 110aaaaa 10bbbbbb
93
+ uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh));
94
+ // Mask
95
+ // 1 byte: 00000000 0bbbbbbb
96
+ // 2 byte: 00000000 00bbbbbb
97
+ uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits
98
+ // 1 byte: 00000000 00000000
99
+ // 2 byte: 000aaaaa 00000000
100
+ uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits
101
+ // Combine with a shift right accumulate
102
+ // 1 byte: 00000000 0bbbbbbb
103
+ // 2 byte: 00000aaa aabbbbbb
104
+ uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2);
105
+ return composed;
106
+ }
107
+ #endif // SIMDUTF_FEATURE_UTF8 && (SIMDUTF_FEATURE_UTF16 ||
108
+ // SIMDUTF_FEATURE_UTF32)
109
+
110
+ #if SIMDUTF_FEATURE_UTF16
111
+ #include "arm64/arm_utf16fix.cpp"
112
+ #endif // SIMDUTF_FEATURE_UTF16
113
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
114
+ #include "arm64/arm_validate_utf16.cpp"
115
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
116
+ #if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
117
+ #include "arm64/arm_validate_utf32le.cpp"
118
+ #endif // SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
119
+
120
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
121
+ #include "arm64/arm_convert_latin1_to_utf16.cpp"
122
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
123
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
124
+ #include "arm64/arm_convert_latin1_to_utf32.cpp"
125
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
126
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
127
+ #include "arm64/arm_convert_latin1_to_utf8.cpp"
128
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
129
+
130
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
131
+ #include "arm64/arm_convert_utf8_to_latin1.cpp"
132
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
133
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
134
+ #include "arm64/arm_convert_utf8_to_utf16.cpp"
135
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
136
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
137
+ #include "arm64/arm_convert_utf8_to_utf32.cpp"
138
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
139
+
140
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
141
+ #include "arm64/arm_convert_utf16_to_latin1.cpp"
142
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
143
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
144
+ #include "arm64/arm_convert_utf16_to_utf32.cpp"
145
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
146
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF8
147
+ #include "arm64/arm_convert_utf16_to_utf8.cpp"
148
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF8
149
+
150
+ #if SIMDUTF_FEATURE_BASE64
151
+ #include "arm64/arm_base64.cpp"
152
+ #include "arm64/arm_find.cpp"
153
+ #endif // SIMDUTF_FEATURE_BASE64
154
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
155
+ #include "arm64/arm_convert_utf32_to_latin1.cpp"
156
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
157
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_UTF16
158
+ #include "arm64/arm_convert_utf32_to_utf16.cpp"
159
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_UTF16
160
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_UTF8
161
+ #include "arm64/arm_convert_utf32_to_utf8.cpp"
162
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_UTF8
163
+
164
+ } // unnamed namespace
165
+ } // namespace SIMDUTF_IMPLEMENTATION
166
+ } // namespace simdutf
167
+
168
+ #include "generic/buf_block_reader.h"
169
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
170
+ #include "generic/utf8_validation/utf8_lookup4_algorithm.h"
171
+ #include "generic/utf8_validation/utf8_validator.h"
172
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
173
+
174
+ #if SIMDUTF_FEATURE_ASCII
175
+ #include "generic/ascii_validation.h"
176
+ #endif // SIMDUTF_FEATURE_ASCII
177
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
178
+ // transcoding from UTF-8 to UTF-16
179
+ #include "generic/utf8_to_utf16/utf8_to_utf16.h"
180
+ #include "generic/utf8_to_utf16/valid_utf8_to_utf16.h"
181
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
182
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
183
+ // transcoding from UTF-8 to UTF-32
184
+ #include "generic/utf8_to_utf32/utf8_to_utf32.h"
185
+ #include "generic/utf8_to_utf32/valid_utf8_to_utf32.h"
186
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
187
+ // other functions
188
+ #if SIMDUTF_FEATURE_UTF16
189
+ #include "generic/utf16.h"
190
+ #endif // SIMDUTF_FEATURE_UTF16
191
+ #if SIMDUTF_FEATURE_UTF8
192
+ #include "generic/utf8.h"
193
+ #endif // SIMDUTF_FEATURE_UTF8
194
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
195
+ // transcoding from UTF-8 to Latin 1
196
+ #include "generic/utf8_to_latin1/utf8_to_latin1.h"
197
+ #include "generic/utf8_to_latin1/valid_utf8_to_latin1.h"
198
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
199
+ #if SIMDUTF_FEATURE_BASE64
200
+ #include "generic/base64lengths.h"
201
+ #endif // SIMDUTF_FEATURE_BASE64
202
+
203
+ //
204
+ // Implementation-specific overrides
205
+ //
206
+ namespace simdutf {
207
+ namespace SIMDUTF_IMPLEMENTATION {
208
+
209
+ #if SIMDUTF_FEATURE_DETECT_ENCODING
210
+ simdutf_warn_unused int
211
+ implementation::detect_encodings(const char *input,
212
+ size_t length) const noexcept {
213
+ // If there is a BOM, then we trust it.
214
+ auto bom_encoding = simdutf::BOM::check_bom(input, length);
215
+ if (bom_encoding != encoding_type::unspecified) {
216
+ return bom_encoding;
217
+ }
218
+ // todo: reimplement as a one-pass algorithm.
219
+ int out = 0;
220
+ if (validate_utf8(input, length)) {
221
+ out |= encoding_type::UTF8;
222
+ }
223
+ if ((length % 2) == 0) {
224
+ if (validate_utf16le(reinterpret_cast<const char16_t *>(input),
225
+ length / 2)) {
226
+ out |= encoding_type::UTF16_LE;
227
+ }
228
+ }
229
+ if ((length % 4) == 0) {
230
+ if (validate_utf32(reinterpret_cast<const char32_t *>(input), length / 4)) {
231
+ out |= encoding_type::UTF32_LE;
232
+ }
233
+ }
234
+ return out;
235
+ }
236
+ #endif // SIMDUTF_FEATURE_DETECT_ENCODING
237
+
238
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
239
+ simdutf_warn_unused bool
240
+ implementation::validate_utf8(const char *buf, size_t len) const noexcept {
241
+ return arm64::utf8_validation::generic_validate_utf8(buf, len);
242
+ }
243
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
244
+
245
+ #if SIMDUTF_FEATURE_UTF8
246
+ simdutf_warn_unused result implementation::validate_utf8_with_errors(
247
+ const char *buf, size_t len) const noexcept {
248
+ return arm64::utf8_validation::generic_validate_utf8_with_errors(buf, len);
249
+ }
250
+ #endif // SIMDUTF_FEATURE_UTF8
251
+
252
+ #if SIMDUTF_FEATURE_ASCII
253
+ simdutf_warn_unused bool
254
+ implementation::validate_ascii(const char *buf, size_t len) const noexcept {
255
+ return arm64::ascii_validation::generic_validate_ascii(buf, len);
256
+ }
257
+
258
+ simdutf_warn_unused result implementation::validate_ascii_with_errors(
259
+ const char *buf, size_t len) const noexcept {
260
+ return arm64::ascii_validation::generic_validate_ascii_with_errors(buf, len);
261
+ }
262
+ #endif // SIMDUTF_FEATURE_ASCII
263
+
264
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
265
+ simdutf_warn_unused bool
266
+ implementation::validate_utf16le_as_ascii(const char16_t *buf,
267
+ size_t len) const noexcept {
268
+ if (simdutf_unlikely(len == 0)) {
269
+ // empty input is valid. protected the implementation from nullptr.
270
+ return true;
271
+ }
272
+ const char16_t *tail =
273
+ arm_validate_utf16_as_ascii<endianness::LITTLE>(buf, len);
274
+ if (tail) {
275
+ return scalar::utf16::validate_as_ascii<endianness::LITTLE>(
276
+ tail, len - (tail - buf));
277
+ } else {
278
+ return false;
279
+ }
280
+ }
281
+
282
+ simdutf_warn_unused bool
283
+ implementation::validate_utf16be_as_ascii(const char16_t *buf,
284
+ size_t len) const noexcept {
285
+ if (simdutf_unlikely(len == 0)) {
286
+ // empty input is valid. protected the implementation from nullptr.
287
+ return true;
288
+ }
289
+ const char16_t *tail = arm_validate_utf16_as_ascii<endianness::BIG>(buf, len);
290
+ if (tail) {
291
+ return scalar::utf16::validate_as_ascii<endianness::BIG>(
292
+ tail, len - (tail - buf));
293
+ } else {
294
+ return false;
295
+ }
296
+ }
297
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
298
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
299
+ simdutf_warn_unused bool
300
+ implementation::validate_utf16le(const char16_t *buf,
301
+ size_t len) const noexcept {
302
+ if (simdutf_unlikely(len == 0)) {
303
+ // empty input is valid. protected the implementation from nullptr.
304
+ return true;
305
+ }
306
+ const char16_t *tail = arm_validate_utf16<endianness::LITTLE>(buf, len);
307
+ if (tail) {
308
+ return scalar::utf16::validate<endianness::LITTLE>(tail,
309
+ len - (tail - buf));
310
+ } else {
311
+ return false;
312
+ }
313
+ }
314
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
315
+
316
+ #if SIMDUTF_FEATURE_UTF16
317
+ simdutf_warn_unused bool
318
+ implementation::validate_utf16be(const char16_t *buf,
319
+ size_t len) const noexcept {
320
+ if (simdutf_unlikely(len == 0)) {
321
+ // empty input is valid. protected the implementation from nullptr.
322
+ return true;
323
+ }
324
+ const char16_t *tail = arm_validate_utf16<endianness::BIG>(buf, len);
325
+ if (tail) {
326
+ return scalar::utf16::validate<endianness::BIG>(tail, len - (tail - buf));
327
+ } else {
328
+ return false;
329
+ }
330
+ }
331
+
332
+ simdutf_warn_unused result implementation::validate_utf16le_with_errors(
333
+ const char16_t *buf, size_t len) const noexcept {
334
+ if (simdutf_unlikely(len == 0)) {
335
+ return result(error_code::SUCCESS, 0);
336
+ }
337
+ result res = arm_validate_utf16_with_errors<endianness::LITTLE>(buf, len);
338
+ if (res.count != len) {
339
+ result scalar_res = scalar::utf16::validate_with_errors<endianness::LITTLE>(
340
+ buf + res.count, len - res.count);
341
+ return result(scalar_res.error, res.count + scalar_res.count);
342
+ } else {
343
+ return res;
344
+ }
345
+ }
346
+
347
+ simdutf_warn_unused result implementation::validate_utf16be_with_errors(
348
+ const char16_t *buf, size_t len) const noexcept {
349
+ if (simdutf_unlikely(len == 0)) {
350
+ return result(error_code::SUCCESS, 0);
351
+ }
352
+ result res = arm_validate_utf16_with_errors<endianness::BIG>(buf, len);
353
+ if (res.count != len) {
354
+ result scalar_res = scalar::utf16::validate_with_errors<endianness::BIG>(
355
+ buf + res.count, len - res.count);
356
+ return result(scalar_res.error, res.count + scalar_res.count);
357
+ } else {
358
+ return res;
359
+ }
360
+ }
361
+
362
+ void implementation::to_well_formed_utf16le(const char16_t *input, size_t len,
363
+ char16_t *output) const noexcept {
364
+ return utf16fix_neon_64bits<endianness::LITTLE>(input, len, output);
365
+ }
366
+
367
+ void implementation::to_well_formed_utf16be(const char16_t *input, size_t len,
368
+ char16_t *output) const noexcept {
369
+ return utf16fix_neon_64bits<endianness::BIG>(input, len, output);
370
+ }
371
+ #endif // SIMDUTF_FEATURE_UTF16
372
+
373
+ #if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
374
+ simdutf_warn_unused bool
375
+ implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept {
376
+ if (simdutf_unlikely(len == 0)) {
377
+ // empty input is valid. protected the implementation from nullptr.
378
+ return true;
379
+ }
380
+ const char32_t *tail = arm_validate_utf32le(buf, len);
381
+ if (tail) {
382
+ return scalar::utf32::validate(tail, len - (tail - buf));
383
+ } else {
384
+ return false;
385
+ }
386
+ }
387
+ #endif // SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
388
+
389
+ #if SIMDUTF_FEATURE_UTF32
390
+ simdutf_warn_unused result implementation::validate_utf32_with_errors(
391
+ const char32_t *buf, size_t len) const noexcept {
392
+ if (simdutf_unlikely(len == 0)) {
393
+ return result(error_code::SUCCESS, 0);
394
+ }
395
+ result res = arm_validate_utf32le_with_errors(buf, len);
396
+ if (res.count != len) {
397
+ result scalar_res =
398
+ scalar::utf32::validate_with_errors(buf + res.count, len - res.count);
399
+ return result(scalar_res.error, res.count + scalar_res.count);
400
+ } else {
401
+ return res;
402
+ }
403
+ }
404
+ #endif // SIMDUTF_FEATURE_UTF32
405
+
406
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
407
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(
408
+ const char *buf, size_t len, char *utf8_output) const noexcept {
409
+ std::pair<const char *, char *> ret =
410
+ arm_convert_latin1_to_utf8(buf, len, utf8_output);
411
+ size_t converted_chars = ret.second - utf8_output;
412
+
413
+ if (ret.first != buf + len) {
414
+ const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert(
415
+ ret.first, len - (ret.first - buf), ret.second);
416
+ converted_chars += scalar_converted_chars;
417
+ }
418
+ return converted_chars;
419
+ }
420
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
421
+
422
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
423
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(
424
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
425
+ std::pair<const char *, char16_t *> ret =
426
+ arm_convert_latin1_to_utf16<endianness::LITTLE>(buf, len, utf16_output);
427
+ size_t converted_chars = ret.second - utf16_output;
428
+ if (ret.first != buf + len) {
429
+ const size_t scalar_converted_chars =
430
+ scalar::latin1_to_utf16::convert<endianness::LITTLE>(
431
+ ret.first, len - (ret.first - buf), ret.second);
432
+ converted_chars += scalar_converted_chars;
433
+ }
434
+ return converted_chars;
435
+ }
436
+
437
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(
438
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
439
+ std::pair<const char *, char16_t *> ret =
440
+ arm_convert_latin1_to_utf16<endianness::BIG>(buf, len, utf16_output);
441
+ size_t converted_chars = ret.second - utf16_output;
442
+ if (ret.first != buf + len) {
443
+ const size_t scalar_converted_chars =
444
+ scalar::latin1_to_utf16::convert<endianness::BIG>(
445
+ ret.first, len - (ret.first - buf), ret.second);
446
+ converted_chars += scalar_converted_chars;
447
+ }
448
+ return converted_chars;
449
+ }
450
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
451
+
452
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
453
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(
454
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
455
+ std::pair<const char *, char32_t *> ret =
456
+ arm_convert_latin1_to_utf32(buf, len, utf32_output);
457
+ size_t converted_chars = ret.second - utf32_output;
458
+ if (ret.first != buf + len) {
459
+ const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
460
+ ret.first, len - (ret.first - buf), ret.second);
461
+ converted_chars += scalar_converted_chars;
462
+ }
463
+ return converted_chars;
464
+ }
465
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
466
+
467
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
468
+ simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(
469
+ const char *buf, size_t len, char *latin1_output) const noexcept {
470
+ utf8_to_latin1::validating_transcoder converter;
471
+ return converter.convert(buf, len, latin1_output);
472
+ }
473
+
474
+ simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(
475
+ const char *buf, size_t len, char *latin1_output) const noexcept {
476
+ utf8_to_latin1::validating_transcoder converter;
477
+ return converter.convert_with_errors(buf, len, latin1_output);
478
+ }
479
+
480
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(
481
+ const char *buf, size_t len, char *latin1_output) const noexcept {
482
+ return arm64::utf8_to_latin1::convert_valid(buf, len, latin1_output);
483
+ }
484
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
485
+
486
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
487
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(
488
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
489
+ utf8_to_utf16::validating_transcoder converter;
490
+ return converter.convert<endianness::LITTLE>(buf, len, utf16_output);
491
+ }
492
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
493
+
494
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
495
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be(
496
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
497
+ utf8_to_utf16::validating_transcoder converter;
498
+ return converter.convert<endianness::BIG>(buf, len, utf16_output);
499
+ }
500
+
501
+ simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors(
502
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
503
+ utf8_to_utf16::validating_transcoder converter;
504
+ return converter.convert_with_errors<endianness::LITTLE>(buf, len,
505
+ utf16_output);
506
+ }
507
+
508
+ simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors(
509
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
510
+ utf8_to_utf16::validating_transcoder converter;
511
+ return converter.convert_with_errors<endianness::BIG>(buf, len, utf16_output);
512
+ }
513
+
514
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le(
515
+ const char *input, size_t size, char16_t *utf16_output) const noexcept {
516
+ return utf8_to_utf16::convert_valid<endianness::LITTLE>(input, size,
517
+ utf16_output);
518
+ }
519
+
520
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be(
521
+ const char *input, size_t size, char16_t *utf16_output) const noexcept {
522
+ return utf8_to_utf16::convert_valid<endianness::BIG>(input, size,
523
+ utf16_output);
524
+ }
525
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
526
+
527
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
528
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf32(
529
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
530
+ utf8_to_utf32::validating_transcoder converter;
531
+ return converter.convert(buf, len, utf32_output);
532
+ }
533
+
534
+ simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors(
535
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
536
+ utf8_to_utf32::validating_transcoder converter;
537
+ return converter.convert_with_errors(buf, len, utf32_output);
538
+ }
539
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
540
+
541
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
542
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(
543
+ const char *input, size_t size, char32_t *utf32_output) const noexcept {
544
+ return utf8_to_utf32::convert_valid(input, size, utf32_output);
545
+ }
546
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
547
+
548
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
549
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(
550
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
551
+ std::pair<const char16_t *, char *> ret =
552
+ arm_convert_utf16_to_latin1<endianness::LITTLE>(buf, len, latin1_output);
553
+ if (ret.first == nullptr) {
554
+ return 0;
555
+ }
556
+ size_t saved_bytes = ret.second - latin1_output;
557
+
558
+ if (ret.first != buf + len) {
559
+ const size_t scalar_saved_bytes =
560
+ scalar::utf16_to_latin1::convert<endianness::LITTLE>(
561
+ ret.first, len - (ret.first - buf), ret.second);
562
+ if (scalar_saved_bytes == 0) {
563
+ return 0;
564
+ }
565
+ saved_bytes += scalar_saved_bytes;
566
+ }
567
+ return saved_bytes;
568
+ }
569
+
570
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(
571
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
572
+ std::pair<const char16_t *, char *> ret =
573
+ arm_convert_utf16_to_latin1<endianness::BIG>(buf, len, latin1_output);
574
+ if (ret.first == nullptr) {
575
+ return 0;
576
+ }
577
+ size_t saved_bytes = ret.second - latin1_output;
578
+
579
+ if (ret.first != buf + len) {
580
+ const size_t scalar_saved_bytes =
581
+ scalar::utf16_to_latin1::convert<endianness::BIG>(
582
+ ret.first, len - (ret.first - buf), ret.second);
583
+ if (scalar_saved_bytes == 0) {
584
+ return 0;
585
+ }
586
+ saved_bytes += scalar_saved_bytes;
587
+ }
588
+ return saved_bytes;
589
+ }
590
+
591
+ simdutf_warn_unused result
592
+ implementation::convert_utf16le_to_latin1_with_errors(
593
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
594
+ std::pair<result, char *> ret =
595
+ arm_convert_utf16_to_latin1_with_errors<endianness::LITTLE>(
596
+ buf, len, latin1_output);
597
+ if (ret.first.error) {
598
+ return ret.first;
599
+ } // Can return directly since scalar fallback already found correct
600
+ // ret.first.count
601
+ if (ret.first.count != len) { // All good so far, but not finished
602
+ result scalar_res =
603
+ scalar::utf16_to_latin1::convert_with_errors<endianness::LITTLE>(
604
+ buf + ret.first.count, len - ret.first.count, ret.second);
605
+ if (scalar_res.error) {
606
+ scalar_res.count += ret.first.count;
607
+ return scalar_res;
608
+ } else {
609
+ ret.second += scalar_res.count;
610
+ }
611
+ }
612
+ ret.first.count =
613
+ ret.second -
614
+ latin1_output; // Set count to the number of 8-bit code units written
615
+ return ret.first;
616
+ }
617
+
618
+ simdutf_warn_unused result
619
+ implementation::convert_utf16be_to_latin1_with_errors(
620
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
621
+ std::pair<result, char *> ret =
622
+ arm_convert_utf16_to_latin1_with_errors<endianness::BIG>(buf, len,
623
+ latin1_output);
624
+ if (ret.first.error) {
625
+ return ret.first;
626
+ } // Can return directly since scalar fallback already found correct
627
+ // ret.first.count
628
+ if (ret.first.count != len) { // All good so far, but not finished
629
+ result scalar_res =
630
+ scalar::utf16_to_latin1::convert_with_errors<endianness::BIG>(
631
+ buf + ret.first.count, len - ret.first.count, ret.second);
632
+ if (scalar_res.error) {
633
+ scalar_res.count += ret.first.count;
634
+ return scalar_res;
635
+ } else {
636
+ ret.second += scalar_res.count;
637
+ }
638
+ }
639
+ ret.first.count =
640
+ ret.second -
641
+ latin1_output; // Set count to the number of 8-bit code units written
642
+ return ret.first;
643
+ }
644
+
645
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(
646
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
647
+ // optimization opportunity: implement a custom function.
648
+ return convert_utf16be_to_latin1(buf, len, latin1_output);
649
+ }
650
+
651
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(
652
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
653
+ // optimization opportunity: implement a custom function.
654
+ return convert_utf16le_to_latin1(buf, len, latin1_output);
655
+ }
656
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
657
+
658
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
659
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(
660
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
661
+ std::pair<const char16_t *, char *> ret =
662
+ arm_convert_utf16_to_utf8<endianness::LITTLE>(buf, len, utf8_output);
663
+ if (ret.first == nullptr) {
664
+ return 0;
665
+ }
666
+ size_t saved_bytes = ret.second - utf8_output;
667
+ if (ret.first != buf + len) {
668
+ const size_t scalar_saved_bytes =
669
+ scalar::utf16_to_utf8::convert<endianness::LITTLE>(
670
+ ret.first, len - (ret.first - buf), ret.second);
671
+ if (scalar_saved_bytes == 0) {
672
+ return 0;
673
+ }
674
+ saved_bytes += scalar_saved_bytes;
675
+ }
676
+ return saved_bytes;
677
+ }
678
+
679
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8(
680
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
681
+ std::pair<const char16_t *, char *> ret =
682
+ arm_convert_utf16_to_utf8<endianness::BIG>(buf, len, utf8_output);
683
+ if (ret.first == nullptr) {
684
+ return 0;
685
+ }
686
+ size_t saved_bytes = ret.second - utf8_output;
687
+ if (ret.first != buf + len) {
688
+ const size_t scalar_saved_bytes =
689
+ scalar::utf16_to_utf8::convert<endianness::BIG>(
690
+ ret.first, len - (ret.first - buf), ret.second);
691
+ if (scalar_saved_bytes == 0) {
692
+ return 0;
693
+ }
694
+ saved_bytes += scalar_saved_bytes;
695
+ }
696
+ return saved_bytes;
697
+ }
698
+
699
+ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(
700
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
701
+ // ret.first.count is always the position in the buffer, not the number of
702
+ // code units written even if finished
703
+ std::pair<result, char *> ret =
704
+ arm_convert_utf16_to_utf8_with_errors<endianness::LITTLE>(buf, len,
705
+ utf8_output);
706
+ if (ret.first.error) {
707
+ return ret.first;
708
+ } // Can return directly since scalar fallback already found correct
709
+ // ret.first.count
710
+ if (ret.first.count != len) { // All good so far, but not finished
711
+ result scalar_res =
712
+ scalar::utf16_to_utf8::convert_with_errors<endianness::LITTLE>(
713
+ buf + ret.first.count, len - ret.first.count, ret.second);
714
+ if (scalar_res.error) {
715
+ scalar_res.count += ret.first.count;
716
+ return scalar_res;
717
+ } else {
718
+ ret.second += scalar_res.count;
719
+ }
720
+ }
721
+ ret.first.count =
722
+ ret.second -
723
+ utf8_output; // Set count to the number of 8-bit code units written
724
+ return ret.first;
725
+ }
726
+
727
+ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(
728
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
729
+ // ret.first.count is always the position in the buffer, not the number of
730
+ // code units written even if finished
731
+ std::pair<result, char *> ret =
732
+ arm_convert_utf16_to_utf8_with_errors<endianness::BIG>(buf, len,
733
+ utf8_output);
734
+ if (ret.first.error) {
735
+ return ret.first;
736
+ } // Can return directly since scalar fallback already found correct
737
+ // ret.first.count
738
+ if (ret.first.count != len) { // All good so far, but not finished
739
+ result scalar_res =
740
+ scalar::utf16_to_utf8::convert_with_errors<endianness::BIG>(
741
+ buf + ret.first.count, len - ret.first.count, ret.second);
742
+ if (scalar_res.error) {
743
+ scalar_res.count += ret.first.count;
744
+ return scalar_res;
745
+ } else {
746
+ ret.second += scalar_res.count;
747
+ }
748
+ }
749
+ ret.first.count =
750
+ ret.second -
751
+ utf8_output; // Set count to the number of 8-bit code units written
752
+ return ret.first;
753
+ }
754
+
755
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8(
756
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
757
+ return convert_utf16le_to_utf8(buf, len, utf8_output);
758
+ }
759
+
760
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8(
761
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
762
+ return convert_utf16be_to_utf8(buf, len, utf8_output);
763
+ }
764
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
765
+
766
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
767
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(
768
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
769
+ if (simdutf_unlikely(len == 0)) {
770
+ return 0;
771
+ }
772
+ std::pair<const char32_t *, char *> ret =
773
+ arm_convert_utf32_to_utf8(buf, len, utf8_output);
774
+ if (ret.first == nullptr) {
775
+ return 0;
776
+ }
777
+ size_t saved_bytes = ret.second - utf8_output;
778
+ if (ret.first != buf + len) {
779
+ const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert(
780
+ ret.first, len - (ret.first - buf), ret.second);
781
+ if (scalar_saved_bytes == 0) {
782
+ return 0;
783
+ }
784
+ saved_bytes += scalar_saved_bytes;
785
+ }
786
+ return saved_bytes;
787
+ }
788
+
789
+ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(
790
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
791
+ if (simdutf_unlikely(len == 0)) {
792
+ return result(error_code::SUCCESS, 0);
793
+ }
794
+ // ret.first.count is always the position in the buffer, not the number of
795
+ // code units written even if finished
796
+ std::pair<result, char *> ret =
797
+ arm_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
798
+ if (ret.first.count != len) {
799
+ result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
800
+ buf + ret.first.count, len - ret.first.count, ret.second);
801
+ if (scalar_res.error) {
802
+ scalar_res.count += ret.first.count;
803
+ return scalar_res;
804
+ } else {
805
+ ret.second += scalar_res.count;
806
+ }
807
+ }
808
+ ret.first.count =
809
+ ret.second -
810
+ utf8_output; // Set count to the number of 8-bit code units written
811
+ return ret.first;
812
+ }
813
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
814
+
815
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
816
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32(
817
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
818
+ std::pair<const char16_t *, char32_t *> ret =
819
+ arm_convert_utf16_to_utf32<endianness::LITTLE>(buf, len, utf32_output);
820
+ if (ret.first == nullptr) {
821
+ return 0;
822
+ }
823
+ size_t saved_bytes = ret.second - utf32_output;
824
+ if (ret.first != buf + len) {
825
+ const size_t scalar_saved_bytes =
826
+ scalar::utf16_to_utf32::convert<endianness::LITTLE>(
827
+ ret.first, len - (ret.first - buf), ret.second);
828
+ if (scalar_saved_bytes == 0) {
829
+ return 0;
830
+ }
831
+ saved_bytes += scalar_saved_bytes;
832
+ }
833
+ return saved_bytes;
834
+ }
835
+
836
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32(
837
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
838
+ std::pair<const char16_t *, char32_t *> ret =
839
+ arm_convert_utf16_to_utf32<endianness::BIG>(buf, len, utf32_output);
840
+ if (ret.first == nullptr) {
841
+ return 0;
842
+ }
843
+ size_t saved_bytes = ret.second - utf32_output;
844
+ if (ret.first != buf + len) {
845
+ const size_t scalar_saved_bytes =
846
+ scalar::utf16_to_utf32::convert<endianness::BIG>(
847
+ ret.first, len - (ret.first - buf), ret.second);
848
+ if (scalar_saved_bytes == 0) {
849
+ return 0;
850
+ }
851
+ saved_bytes += scalar_saved_bytes;
852
+ }
853
+ return saved_bytes;
854
+ }
855
+
856
+ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(
857
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
858
+ // ret.first.count is always the position in the buffer, not the number of
859
+ // code units written even if finished
860
+ std::pair<result, char32_t *> ret =
861
+ arm_convert_utf16_to_utf32_with_errors<endianness::LITTLE>(buf, len,
862
+ utf32_output);
863
+ if (ret.first.error) {
864
+ return ret.first;
865
+ } // Can return directly since scalar fallback already found correct
866
+ // ret.first.count
867
+ if (ret.first.count != len) { // All good so far, but not finished
868
+ result scalar_res =
869
+ scalar::utf16_to_utf32::convert_with_errors<endianness::LITTLE>(
870
+ buf + ret.first.count, len - ret.first.count, ret.second);
871
+ if (scalar_res.error) {
872
+ scalar_res.count += ret.first.count;
873
+ return scalar_res;
874
+ } else {
875
+ ret.second += scalar_res.count;
876
+ }
877
+ }
878
+ ret.first.count =
879
+ ret.second -
880
+ utf32_output; // Set count to the number of 8-bit code units written
881
+ return ret.first;
882
+ }
883
+
884
+ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(
885
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
886
+ // ret.first.count is always the position in the buffer, not the number of
887
+ // code units written even if finished
888
+ std::pair<result, char32_t *> ret =
889
+ arm_convert_utf16_to_utf32_with_errors<endianness::BIG>(buf, len,
890
+ utf32_output);
891
+ if (ret.first.error) {
892
+ return ret.first;
893
+ } // Can return directly since scalar fallback already found correct
894
+ // ret.first.count
895
+ if (ret.first.count != len) { // All good so far, but not finished
896
+ result scalar_res =
897
+ scalar::utf16_to_utf32::convert_with_errors<endianness::BIG>(
898
+ buf + ret.first.count, len - ret.first.count, ret.second);
899
+ if (scalar_res.error) {
900
+ scalar_res.count += ret.first.count;
901
+ return scalar_res;
902
+ } else {
903
+ ret.second += scalar_res.count;
904
+ }
905
+ }
906
+ ret.first.count =
907
+ ret.second -
908
+ utf32_output; // Set count to the number of 8-bit code units written
909
+ return ret.first;
910
+ }
911
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
912
+
913
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
914
+ simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(
915
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
916
+ std::pair<const char32_t *, char *> ret =
917
+ arm_convert_utf32_to_latin1(buf, len, latin1_output);
918
+ if (ret.first == nullptr) {
919
+ return 0;
920
+ }
921
+ size_t saved_bytes = ret.second - latin1_output;
922
+
923
+ if (ret.first != buf + len) {
924
+ const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert(
925
+ ret.first, len - (ret.first - buf), ret.second);
926
+ if (scalar_saved_bytes == 0) {
927
+ return 0;
928
+ }
929
+ saved_bytes += scalar_saved_bytes;
930
+ }
931
+ return saved_bytes;
932
+ }
933
+
934
+ simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(
935
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
936
+ std::pair<result, char *> ret =
937
+ arm_convert_utf32_to_latin1_with_errors(buf, len, latin1_output);
938
+ if (ret.first.error) {
939
+ return ret.first;
940
+ } // Can return directly since scalar fallback already found correct
941
+ // ret.first.count
942
+ if (ret.first.count != len) { // All good so far, but not finished
943
+ result scalar_res = scalar::utf32_to_latin1::convert_with_errors(
944
+ buf + ret.first.count, len - ret.first.count, ret.second);
945
+ if (scalar_res.error) {
946
+ scalar_res.count += ret.first.count;
947
+ return scalar_res;
948
+ } else {
949
+ ret.second += scalar_res.count;
950
+ }
951
+ }
952
+ ret.first.count =
953
+ ret.second -
954
+ latin1_output; // Set count to the number of 8-bit code units written
955
+ return ret.first;
956
+ }
957
+
958
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(
959
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
960
+ std::pair<const char32_t *, char *> ret =
961
+ arm_convert_utf32_to_latin1(buf, len, latin1_output);
962
+ if (ret.first == nullptr) {
963
+ return 0;
964
+ }
965
+ size_t saved_bytes = ret.second - latin1_output;
966
+
967
+ if (ret.first != buf + len) {
968
+ const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid(
969
+ ret.first, len - (ret.first - buf), ret.second);
970
+ saved_bytes += scalar_saved_bytes;
971
+ }
972
+ return saved_bytes;
973
+ }
974
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
975
+
976
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
977
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8(
978
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
979
+ // optimization opportunity: implement a custom function.
980
+ return convert_utf32_to_utf8(buf, len, utf8_output);
981
+ }
982
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
983
+
984
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
985
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le(
986
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
987
+ std::pair<const char32_t *, char16_t *> ret =
988
+ arm_convert_utf32_to_utf16<endianness::LITTLE>(buf, len, utf16_output);
989
+ if (ret.first == nullptr) {
990
+ return 0;
991
+ }
992
+ size_t saved_bytes = ret.second - utf16_output;
993
+ if (ret.first != buf + len) {
994
+ const size_t scalar_saved_bytes =
995
+ scalar::utf32_to_utf16::convert<endianness::LITTLE>(
996
+ ret.first, len - (ret.first - buf), ret.second);
997
+ if (scalar_saved_bytes == 0) {
998
+ return 0;
999
+ }
1000
+ saved_bytes += scalar_saved_bytes;
1001
+ }
1002
+ return saved_bytes;
1003
+ }
1004
+
1005
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(
1006
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1007
+ std::pair<const char32_t *, char16_t *> ret =
1008
+ arm_convert_utf32_to_utf16<endianness::BIG>(buf, len, utf16_output);
1009
+ if (ret.first == nullptr) {
1010
+ return 0;
1011
+ }
1012
+ size_t saved_bytes = ret.second - utf16_output;
1013
+ if (ret.first != buf + len) {
1014
+ const size_t scalar_saved_bytes =
1015
+ scalar::utf32_to_utf16::convert<endianness::BIG>(
1016
+ ret.first, len - (ret.first - buf), ret.second);
1017
+ if (scalar_saved_bytes == 0) {
1018
+ return 0;
1019
+ }
1020
+ saved_bytes += scalar_saved_bytes;
1021
+ }
1022
+ return saved_bytes;
1023
+ }
1024
+
1025
+ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
1026
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1027
+ // ret.first.count is always the position in the buffer, not the number of
1028
+ // code units written even if finished
1029
+ std::pair<result, char16_t *> ret =
1030
+ arm_convert_utf32_to_utf16_with_errors<endianness::LITTLE>(buf, len,
1031
+ utf16_output);
1032
+ if (ret.first.count != len) {
1033
+ result scalar_res =
1034
+ scalar::utf32_to_utf16::convert_with_errors<endianness::LITTLE>(
1035
+ buf + ret.first.count, len - ret.first.count, ret.second);
1036
+ if (scalar_res.error) {
1037
+ scalar_res.count += ret.first.count;
1038
+ return scalar_res;
1039
+ } else {
1040
+ ret.second += scalar_res.count;
1041
+ }
1042
+ }
1043
+ ret.first.count =
1044
+ ret.second -
1045
+ utf16_output; // Set count to the number of 8-bit code units written
1046
+ return ret.first;
1047
+ }
1048
+
1049
+ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
1050
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1051
+ // ret.first.count is always the position in the buffer, not the number of
1052
+ // code units written even if finished
1053
+ std::pair<result, char16_t *> ret =
1054
+ arm_convert_utf32_to_utf16_with_errors<endianness::BIG>(buf, len,
1055
+ utf16_output);
1056
+ if (ret.first.count != len) {
1057
+ result scalar_res =
1058
+ scalar::utf32_to_utf16::convert_with_errors<endianness::BIG>(
1059
+ buf + ret.first.count, len - ret.first.count, ret.second);
1060
+ if (scalar_res.error) {
1061
+ scalar_res.count += ret.first.count;
1062
+ return scalar_res;
1063
+ } else {
1064
+ ret.second += scalar_res.count;
1065
+ }
1066
+ }
1067
+ ret.first.count =
1068
+ ret.second -
1069
+ utf16_output; // Set count to the number of 8-bit code units written
1070
+ return ret.first;
1071
+ }
1072
+
1073
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le(
1074
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1075
+ return convert_utf32_to_utf16le(buf, len, utf16_output);
1076
+ }
1077
+
1078
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be(
1079
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1080
+ return convert_utf32_to_utf16be(buf, len, utf16_output);
1081
+ }
1082
+
1083
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32(
1084
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
1085
+ return convert_utf16le_to_utf32(buf, len, utf32_output);
1086
+ }
1087
+
1088
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32(
1089
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
1090
+ return convert_utf16be_to_utf32(buf, len, utf32_output);
1091
+ }
1092
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1093
+
1094
+ #if SIMDUTF_FEATURE_UTF16
1095
+ void implementation::change_endianness_utf16(const char16_t *input,
1096
+ size_t length,
1097
+ char16_t *output) const noexcept {
1098
+ utf16::change_endianness_utf16(input, length, output);
1099
+ }
1100
+
1101
+ simdutf_warn_unused size_t implementation::count_utf16le(
1102
+ const char16_t *input, size_t length) const noexcept {
1103
+ return utf16::count_code_points<endianness::LITTLE>(input, length);
1104
+ }
1105
+
1106
+ simdutf_warn_unused size_t implementation::count_utf16be(
1107
+ const char16_t *input, size_t length) const noexcept {
1108
+ return utf16::count_code_points<endianness::BIG>(input, length);
1109
+ }
1110
+ #endif // SIMDUTF_FEATURE_UTF16
1111
+
1112
+ #if SIMDUTF_FEATURE_UTF8
1113
+ simdutf_warn_unused size_t
1114
+ implementation::count_utf8(const char *input, size_t length) const noexcept {
1115
+ return utf8::count_code_points(input, length);
1116
+ }
1117
+ #endif // SIMDUTF_FEATURE_UTF8
1118
+
1119
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1120
+ simdutf_warn_unused size_t implementation::latin1_length_from_utf8(
1121
+ const char *buf, size_t len) const noexcept {
1122
+ return count_utf8(buf, len);
1123
+ }
1124
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1125
+
1126
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1127
+ simdutf_warn_unused size_t implementation::utf8_length_from_latin1(
1128
+ const char *input, size_t length) const noexcept {
1129
+ // See
1130
+ // https://lemire.me/blog/2023/05/15/computing-the-utf-8-size-of-a-latin-1-string-quickly-arm-neon-edition/
1131
+ // credit to Pete Cawley
1132
+ const uint8_t *data = reinterpret_cast<const uint8_t *>(input);
1133
+ uint64_t result = 0;
1134
+ const int lanes = sizeof(uint8x16_t);
1135
+ uint8_t rem = length % lanes;
1136
+ const uint8_t *simd_end = data + (length / lanes) * lanes;
1137
+ const uint8x16_t threshold = vdupq_n_u8(0x80);
1138
+ for (; data < simd_end; data += lanes) {
1139
+ // load 16 bytes
1140
+ uint8x16_t input_vec = vld1q_u8(data);
1141
+ // compare to threshold (0x80)
1142
+ uint8x16_t withhighbit = vcgeq_u8(input_vec, threshold);
1143
+ // vertical addition
1144
+ result -= vaddvq_s8(vreinterpretq_s8_u8(withhighbit));
1145
+ }
1146
+ return result + (length / lanes) * lanes +
1147
+ scalar::latin1::utf8_length_from_latin1((const char *)simd_end, rem);
1148
+ }
1149
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1150
+
1151
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1152
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(
1153
+ const char16_t *input, size_t length) const noexcept {
1154
+ return arm64_utf8_length_from_utf16_bytemask<endianness::LITTLE>(input,
1155
+ length);
1156
+ }
1157
+
1158
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf16be(
1159
+ const char16_t *input, size_t length) const noexcept {
1160
+ return arm64_utf8_length_from_utf16_bytemask<endianness::BIG>(input, length);
1161
+ }
1162
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1163
+
1164
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1165
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf16le(
1166
+ const char16_t *input, size_t length) const noexcept {
1167
+ return utf16::utf32_length_from_utf16<endianness::LITTLE>(input, length);
1168
+ }
1169
+
1170
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf16be(
1171
+ const char16_t *input, size_t length) const noexcept {
1172
+ return utf16::utf32_length_from_utf16<endianness::BIG>(input, length);
1173
+ }
1174
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1175
+
1176
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1177
+ simdutf_warn_unused size_t implementation::utf16_length_from_utf8(
1178
+ const char *input, size_t length) const noexcept {
1179
+ return utf8::utf16_length_from_utf8(input, length);
1180
+ }
1181
+ simdutf_warn_unused result
1182
+ implementation::utf8_length_from_utf16le_with_replacement(
1183
+ const char16_t *input, size_t length) const noexcept {
1184
+ return arm64_utf8_length_from_utf16_with_replacement<endianness::LITTLE>(
1185
+ input, length);
1186
+ }
1187
+
1188
+ simdutf_warn_unused result
1189
+ implementation::utf8_length_from_utf16be_with_replacement(
1190
+ const char16_t *input, size_t length) const noexcept {
1191
+ return arm64_utf8_length_from_utf16_with_replacement<endianness::BIG>(input,
1192
+ length);
1193
+ }
1194
+
1195
+ simdutf_warn_unused size_t
1196
+ implementation::convert_utf16le_to_utf8_with_replacement(
1197
+ const char16_t *input, size_t length, char *utf8_buffer) const noexcept {
1198
+ return scalar::utf16_to_utf8::convert_with_replacement<endianness::LITTLE>(
1199
+ input, length, utf8_buffer);
1200
+ }
1201
+
1202
+ simdutf_warn_unused size_t
1203
+ implementation::convert_utf16be_to_utf8_with_replacement(
1204
+ const char16_t *input, size_t length, char *utf8_buffer) const noexcept {
1205
+ return scalar::utf16_to_utf8::convert_with_replacement<endianness::BIG>(
1206
+ input, length, utf8_buffer);
1207
+ }
1208
+
1209
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1210
+
1211
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1212
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf32(
1213
+ const char32_t *input, size_t length) const noexcept {
1214
+ const uint32x4_t v_7f = vmovq_n_u32((uint32_t)0x7f);
1215
+ const uint32x4_t v_7ff = vmovq_n_u32((uint32_t)0x7ff);
1216
+ const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff);
1217
+ const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1);
1218
+ size_t pos = 0;
1219
+ size_t count = 0;
1220
+ for (; pos + 4 <= length; pos += 4) {
1221
+ uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(input + pos));
1222
+ const uint32x4_t ascii_bytes_bytemask = vcleq_u32(in, v_7f);
1223
+ const uint32x4_t one_two_bytes_bytemask = vcleq_u32(in, v_7ff);
1224
+ const uint32x4_t two_bytes_bytemask =
1225
+ veorq_u32(one_two_bytes_bytemask, ascii_bytes_bytemask);
1226
+ const uint32x4_t three_bytes_bytemask =
1227
+ veorq_u32(vcleq_u32(in, v_ffff), one_two_bytes_bytemask);
1228
+
1229
+ const uint16x8_t reduced_ascii_bytes_bytemask =
1230
+ vreinterpretq_u16_u32(vandq_u32(ascii_bytes_bytemask, v_1));
1231
+ const uint16x8_t reduced_two_bytes_bytemask =
1232
+ vreinterpretq_u16_u32(vandq_u32(two_bytes_bytemask, v_1));
1233
+ const uint16x8_t reduced_three_bytes_bytemask =
1234
+ vreinterpretq_u16_u32(vandq_u32(three_bytes_bytemask, v_1));
1235
+
1236
+ const uint16x8_t compressed_bytemask0 =
1237
+ vpaddq_u16(reduced_ascii_bytes_bytemask, reduced_two_bytes_bytemask);
1238
+ const uint16x8_t compressed_bytemask1 =
1239
+ vpaddq_u16(reduced_three_bytes_bytemask, reduced_three_bytes_bytemask);
1240
+
1241
+ size_t ascii_count = count_ones(
1242
+ vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 0));
1243
+ size_t two_bytes_count = count_ones(
1244
+ vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 1));
1245
+ size_t three_bytes_count = count_ones(
1246
+ vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask1), 0));
1247
+
1248
+ count += 16 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count;
1249
+ }
1250
+ return count +
1251
+ scalar::utf32::utf8_length_from_utf32(input + pos, length - pos);
1252
+ }
1253
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1254
+
1255
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1256
+ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(
1257
+ const char32_t *input, size_t length) const noexcept {
1258
+ const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff);
1259
+ const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1);
1260
+ size_t pos = 0;
1261
+ size_t count = 0;
1262
+ for (; pos + 4 <= length; pos += 4) {
1263
+ uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(input + pos));
1264
+ const uint32x4_t surrogate_bytemask = vcgtq_u32(in, v_ffff);
1265
+ const uint16x8_t reduced_bytemask =
1266
+ vreinterpretq_u16_u32(vandq_u32(surrogate_bytemask, v_1));
1267
+ const uint16x8_t compressed_bytemask =
1268
+ vpaddq_u16(reduced_bytemask, reduced_bytemask);
1269
+ size_t surrogate_count = count_ones(
1270
+ vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask), 0));
1271
+ count += 4 + surrogate_count;
1272
+ }
1273
+ return count +
1274
+ scalar::utf32::utf16_length_from_utf32(input + pos, length - pos);
1275
+ }
1276
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1277
+
1278
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1279
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(
1280
+ const char *input, size_t length) const noexcept {
1281
+ return utf8::count_code_points(input, length);
1282
+ }
1283
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1284
+
1285
+ #if SIMDUTF_FEATURE_BASE64
1286
+ simdutf_warn_unused result implementation::base64_to_binary(
1287
+ const char *input, size_t length, char *output, base64_options options,
1288
+ last_chunk_handling_options last_chunk_options) const noexcept {
1289
+ if (options & base64_default_or_url) {
1290
+ if (options == base64_options::base64_default_or_url_accept_garbage) {
1291
+ return compress_decode_base64<false, true, true>(
1292
+ output, input, length, options, last_chunk_options);
1293
+ } else {
1294
+ return compress_decode_base64<false, false, true>(
1295
+ output, input, length, options, last_chunk_options);
1296
+ }
1297
+ } else if (options & base64_url) {
1298
+ if (options == base64_options::base64_url_accept_garbage) {
1299
+ return compress_decode_base64<true, true, false>(
1300
+ output, input, length, options, last_chunk_options);
1301
+ } else {
1302
+ return compress_decode_base64<true, false, false>(
1303
+ output, input, length, options, last_chunk_options);
1304
+ }
1305
+ } else {
1306
+ if (options == base64_options::base64_default_accept_garbage) {
1307
+ return compress_decode_base64<false, true, false>(
1308
+ output, input, length, options, last_chunk_options);
1309
+ } else {
1310
+ return compress_decode_base64<false, false, false>(
1311
+ output, input, length, options, last_chunk_options);
1312
+ }
1313
+ }
1314
+ }
1315
+
1316
+ simdutf_warn_unused full_result implementation::base64_to_binary_details(
1317
+ const char *input, size_t length, char *output, base64_options options,
1318
+ last_chunk_handling_options last_chunk_options) const noexcept {
1319
+ if (options & base64_default_or_url) {
1320
+ if (options == base64_options::base64_default_or_url_accept_garbage) {
1321
+ return compress_decode_base64<false, true, true>(
1322
+ output, input, length, options, last_chunk_options);
1323
+ } else {
1324
+ return compress_decode_base64<false, false, true>(
1325
+ output, input, length, options, last_chunk_options);
1326
+ }
1327
+ } else if (options & base64_url) {
1328
+ if (options == base64_options::base64_url_accept_garbage) {
1329
+ return compress_decode_base64<true, true, false>(
1330
+ output, input, length, options, last_chunk_options);
1331
+ } else {
1332
+ return compress_decode_base64<true, false, false>(
1333
+ output, input, length, options, last_chunk_options);
1334
+ }
1335
+ } else {
1336
+ if (options == base64_options::base64_default_accept_garbage) {
1337
+ return compress_decode_base64<false, true, false>(
1338
+ output, input, length, options, last_chunk_options);
1339
+ } else {
1340
+ return compress_decode_base64<false, false, false>(
1341
+ output, input, length, options, last_chunk_options);
1342
+ }
1343
+ }
1344
+ }
1345
+
1346
+ simdutf_warn_unused result implementation::base64_to_binary(
1347
+ const char16_t *input, size_t length, char *output, base64_options options,
1348
+ last_chunk_handling_options last_chunk_options) const noexcept {
1349
+ if (options & base64_default_or_url) {
1350
+ if (options == base64_options::base64_default_or_url_accept_garbage) {
1351
+ return compress_decode_base64<false, true, true>(
1352
+ output, input, length, options, last_chunk_options);
1353
+ } else {
1354
+ return compress_decode_base64<false, false, true>(
1355
+ output, input, length, options, last_chunk_options);
1356
+ }
1357
+ } else if (options & base64_url) {
1358
+ if (options == base64_options::base64_url_accept_garbage) {
1359
+ return compress_decode_base64<true, true, false>(
1360
+ output, input, length, options, last_chunk_options);
1361
+ } else {
1362
+ return compress_decode_base64<true, false, false>(
1363
+ output, input, length, options, last_chunk_options);
1364
+ }
1365
+ } else {
1366
+ if (options == base64_options::base64_default_accept_garbage) {
1367
+ return compress_decode_base64<false, true, false>(
1368
+ output, input, length, options, last_chunk_options);
1369
+ } else {
1370
+ return compress_decode_base64<false, false, false>(
1371
+ output, input, length, options, last_chunk_options);
1372
+ }
1373
+ }
1374
+ }
1375
+
1376
+ simdutf_warn_unused full_result implementation::base64_to_binary_details(
1377
+ const char16_t *input, size_t length, char *output, base64_options options,
1378
+ last_chunk_handling_options last_chunk_options) const noexcept {
1379
+ if (options & base64_default_or_url) {
1380
+ if (options == base64_options::base64_default_or_url_accept_garbage) {
1381
+ return compress_decode_base64<false, true, true>(
1382
+ output, input, length, options, last_chunk_options);
1383
+ } else {
1384
+ return compress_decode_base64<false, false, true>(
1385
+ output, input, length, options, last_chunk_options);
1386
+ }
1387
+ } else if (options & base64_url) {
1388
+ if (options == base64_options::base64_url_accept_garbage) {
1389
+ return compress_decode_base64<true, true, false>(
1390
+ output, input, length, options, last_chunk_options);
1391
+ } else {
1392
+ return compress_decode_base64<true, false, false>(
1393
+ output, input, length, options, last_chunk_options);
1394
+ }
1395
+ } else {
1396
+ if (options == base64_options::base64_default_accept_garbage) {
1397
+ return compress_decode_base64<false, true, false>(
1398
+ output, input, length, options, last_chunk_options);
1399
+ } else {
1400
+ return compress_decode_base64<false, false, false>(
1401
+ output, input, length, options, last_chunk_options);
1402
+ }
1403
+ }
1404
+ }
1405
+
1406
+ size_t implementation::binary_to_base64(const char *input, size_t length,
1407
+ char *output,
1408
+ base64_options options) const noexcept {
1409
+ return encode_base64(output, input, length, options);
1410
+ }
1411
+
1412
+ size_t implementation::binary_to_base64_with_lines(
1413
+ const char *input, size_t length, char *output, size_t line_length,
1414
+ base64_options options) const noexcept {
1415
+ return encode_base64_impl<true>(output, input, length, options, line_length);
1416
+ }
1417
+
1418
+ const char *implementation::find(const char *start, const char *end,
1419
+ char character) const noexcept {
1420
+ return util_find(start, end, character);
1421
+ }
1422
+
1423
+ const char16_t *implementation::find(const char16_t *start, const char16_t *end,
1424
+ char16_t character) const noexcept {
1425
+ return util_find(start, end, character);
1426
+ }
1427
+
1428
+ simdutf_warn_unused size_t implementation::binary_length_from_base64(
1429
+ const char *input, size_t length) const noexcept {
1430
+ return base64_lengths::binary_length_from_base64(input, length);
1431
+ }
1432
+
1433
+ simdutf_warn_unused size_t implementation::binary_length_from_base64(
1434
+ const char16_t *input, size_t length) const noexcept {
1435
+ return base64_lengths::binary_length_from_base64(input, length);
1436
+ }
1437
+ #endif // SIMDUTF_FEATURE_BASE64
1438
+
1439
+ } // namespace SIMDUTF_IMPLEMENTATION
1440
+ } // namespace simdutf
1441
+
1442
+ #include "simdutf/arm64/end.h"