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,1417 @@
1
+ #include "simdutf/lsx/begin.h"
2
+ namespace simdutf {
3
+ namespace SIMDUTF_IMPLEMENTATION {
4
+ namespace {
5
+ #ifndef SIMDUTF_LSX_H
6
+ #error "lsx.h must be included"
7
+ #endif
8
+ using namespace simd;
9
+
10
+ #if SIMDUTF_FEATURE_UTF8
11
+ // convert vmskltz/vmskgez/vmsknz to
12
+ // simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes index
13
+ const uint8_t lsx_1_2_utf8_bytes_mask[] = {
14
+ 0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84,
15
+ 85, 2, 3, 6, 7, 18, 19, 22, 23, 66, 67, 70, 71, 82, 83,
16
+ 86, 87, 8, 9, 12, 13, 24, 25, 28, 29, 72, 73, 76, 77, 88,
17
+ 89, 92, 93, 10, 11, 14, 15, 26, 27, 30, 31, 74, 75, 78, 79,
18
+ 90, 91, 94, 95, 32, 33, 36, 37, 48, 49, 52, 53, 96, 97, 100,
19
+ 101, 112, 113, 116, 117, 34, 35, 38, 39, 50, 51, 54, 55, 98, 99,
20
+ 102, 103, 114, 115, 118, 119, 40, 41, 44, 45, 56, 57, 60, 61, 104,
21
+ 105, 108, 109, 120, 121, 124, 125, 42, 43, 46, 47, 58, 59, 62, 63,
22
+ 106, 107, 110, 111, 122, 123, 126, 127, 128, 129, 132, 133, 144, 145, 148,
23
+ 149, 192, 193, 196, 197, 208, 209, 212, 213, 130, 131, 134, 135, 146, 147,
24
+ 150, 151, 194, 195, 198, 199, 210, 211, 214, 215, 136, 137, 140, 141, 152,
25
+ 153, 156, 157, 200, 201, 204, 205, 216, 217, 220, 221, 138, 139, 142, 143,
26
+ 154, 155, 158, 159, 202, 203, 206, 207, 218, 219, 222, 223, 160, 161, 164,
27
+ 165, 176, 177, 180, 181, 224, 225, 228, 229, 240, 241, 244, 245, 162, 163,
28
+ 166, 167, 178, 179, 182, 183, 226, 227, 230, 231, 242, 243, 246, 247, 168,
29
+ 169, 172, 173, 184, 185, 188, 189, 232, 233, 236, 237, 248, 249, 252, 253,
30
+ 170, 171, 174, 175, 186, 187, 190, 191, 234, 235, 238, 239, 250, 251, 254,
31
+ 255};
32
+ #endif // SIMDUTF_FEATURE_UTF8
33
+
34
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_UTF32
35
+ simdutf_really_inline __m128i lsx_swap_bytes(__m128i vec) {
36
+ return __lsx_vshuf4i_b(vec, 0b10110001);
37
+ }
38
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_UTF32
39
+
40
+ #if SIMDUTF_FEATURE_ASCII || SIMDUTF_FEATURE_DETECT_ENCODING || \
41
+ SIMDUTF_FEATURE_UTF8
42
+ simdutf_really_inline bool is_ascii(const simd8x64<uint8_t> &input) {
43
+ return input.is_ascii();
44
+ }
45
+ #endif // SIMDUTF_FEATURE_ASCII || SIMDUTF_FEATURE_DETECT_ENCODING ||
46
+ // SIMDUTF_FEATURE_UTF8
47
+
48
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
49
+ simdutf_really_inline simd8<bool>
50
+ must_be_2_3_continuation(const simd8<uint8_t> prev2,
51
+ const simd8<uint8_t> prev3) {
52
+ simd8<bool> is_third_byte = prev2 >= uint8_t(0b11100000u);
53
+ simd8<bool> is_fourth_byte = prev3 >= uint8_t(0b11110000u);
54
+ return is_third_byte ^ is_fourth_byte;
55
+ }
56
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
57
+
58
+ #if SIMDUTF_FEATURE_UTF8 && (SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_UTF32)
59
+ // common functions for utf8 conversions
60
+ simdutf_really_inline __m128i convert_utf8_3_byte_to_utf16(__m128i in) {
61
+ // Low half contains 10bbbbbb|10cccccc
62
+ // High half contains 1110aaaa|1110aaaa
63
+ const v16u8 sh = {2, 1, 5, 4, 8, 7, 11, 10, 0, 0, 3, 3, 6, 6, 9, 9};
64
+ const v8u16 v0fff = {0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff};
65
+
66
+ __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, (__m128i)sh);
67
+ // 1110aaaa => aaaa0000
68
+ __m128i perm_high = __lsx_vslli_b(__lsx_vbsrl_v(perm, 8), 4);
69
+ // 10bbbbbb 10cccccc => 0010bbbb bbcccccc
70
+ __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), /* perm >> 2*/
71
+ perm, __lsx_vrepli_h(0x3f) /* 0x003f */);
72
+ // 0010bbbb bbcccccc => aaaabbbb bbcccccc
73
+ composed = __lsx_vbitsel_v(perm_high, composed, (__m128i)v0fff);
74
+
75
+ return composed;
76
+ }
77
+
78
+ simdutf_really_inline __m128i convert_utf8_2_byte_to_utf16(__m128i in) {
79
+ // 10bbbbb 110aaaaa => 00bbbbb 000aaaaa
80
+ __m128i composed = __lsx_vand_v(in, __lsx_vldi(0x3f));
81
+ // 00bbbbbb 000aaaaa => 00000aaa aabbbbbb
82
+ composed = __lsx_vbitsel_v(
83
+ __lsx_vsrli_h(__lsx_vslli_h(composed, 8), 2), /* (aaaaa << 8) >> 2 */
84
+ __lsx_vsrli_h(composed, 8), /* bbbbbb >> 8 */
85
+ __lsx_vrepli_h(0x3f)); /* 0x003f */
86
+ return composed;
87
+ }
88
+
89
+ simdutf_really_inline __m128i
90
+ convert_utf8_1_to_2_byte_to_utf16(__m128i in, size_t shufutf8_idx) {
91
+ // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters.
92
+ // This is a relatively easy scenario
93
+ // we process SIX (6) input code-code units. The max length in bytes of six
94
+ // code code units spanning between 1 and 2 bytes each is 12 bytes.
95
+ __m128i sh =
96
+ __lsx_vld(reinterpret_cast<const uint8_t *>(
97
+ simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx]),
98
+ 0);
99
+ // Shuffle
100
+ // 1 byte: 00000000 0bbbbbbb
101
+ // 2 byte: 110aaaaa 10bbbbbb
102
+ __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh);
103
+ // 1 byte: 00000000 0bbbbbbb
104
+ // 2 byte: 00000000 00bbbbbb
105
+ __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_h(0x7f)); // 6 or 7 bits
106
+ // 1 byte: 00000000 00000000
107
+ // 2 byte: 00000aaa aa000000
108
+ const __m128i v1f00 = lsx_splat_u16(0x1f00);
109
+ __m128i composed = __lsx_vsrli_h(__lsx_vand_v(perm, v1f00), 2); // 5 bits
110
+ // Combine with a shift right accumulate
111
+ // 1 byte: 00000000 0bbbbbbb
112
+ // 2 byte: 00000aaa aabbbbbb
113
+ composed = __lsx_vadd_h(ascii, composed);
114
+ return composed;
115
+ }
116
+ #endif // SIMDUTF_FEATURE_UTF8 && (SIMDUTF_FEATURE_UTF16 ||
117
+ // SIMDUTF_FEATURE_UTF32)
118
+
119
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
120
+ #include "lsx/lsx_validate_utf16.cpp"
121
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
122
+ #if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
123
+ #include "lsx/lsx_validate_utf32le.cpp"
124
+ #endif // SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
125
+
126
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
127
+ #include "lsx/lsx_convert_latin1_to_utf8.cpp"
128
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
129
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
130
+ #include "lsx/lsx_convert_latin1_to_utf16.cpp"
131
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
132
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
133
+ #include "lsx/lsx_convert_latin1_to_utf32.cpp"
134
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
135
+
136
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
137
+ #include "lsx/lsx_convert_utf8_to_utf16.cpp"
138
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
139
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
140
+ #include "lsx/lsx_convert_utf8_to_utf32.cpp"
141
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
142
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
143
+ #include "lsx/lsx_convert_utf8_to_latin1.cpp"
144
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
145
+
146
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
147
+ #include "lsx/lsx_convert_utf16_to_latin1.cpp"
148
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
149
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF8
150
+ #include "lsx/lsx_convert_utf16_to_utf8.cpp"
151
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF8
152
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
153
+ #include "lsx/lsx_convert_utf16_to_utf32.cpp"
154
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
155
+
156
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
157
+ #include "lsx/lsx_convert_utf32_to_latin1.cpp"
158
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
159
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
160
+ #include "lsx/lsx_convert_utf32_to_utf8.cpp"
161
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
162
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
163
+ #include "lsx/lsx_convert_utf32_to_utf16.cpp"
164
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
165
+ #if SIMDUTF_FEATURE_BASE64
166
+ #include "lsx/lsx_base64.cpp"
167
+ #include "lsx/lsx_find.cpp"
168
+ #endif // SIMDUTF_FEATURE_BASE64
169
+
170
+ } // namespace
171
+ } // namespace SIMDUTF_IMPLEMENTATION
172
+ } // namespace simdutf
173
+
174
+ #include "generic/buf_block_reader.h"
175
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
176
+ #include "generic/utf8_validation/utf8_lookup4_algorithm.h"
177
+ #include "generic/utf8_validation/utf8_validator.h"
178
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
179
+ #if SIMDUTF_FEATURE_ASCII
180
+ #include "generic/ascii_validation.h"
181
+ #endif // SIMDUTF_FEATURE_ASCII
182
+
183
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
184
+ // transcoding from UTF-8 to Latin 1
185
+ #include "generic/utf8_to_latin1/utf8_to_latin1.h"
186
+ #include "generic/utf8_to_latin1/valid_utf8_to_latin1.h"
187
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
188
+
189
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
190
+ // transcoding from UTF-8 to UTF-16
191
+ #include "generic/utf8_to_utf16/valid_utf8_to_utf16.h"
192
+ #include "generic/utf8_to_utf16/utf8_to_utf16.h"
193
+ #include "generic/utf8/utf16_length_from_utf8_bytemask.h"
194
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
195
+
196
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
197
+ // transcoding from UTF-8 to UTF-32
198
+ #include "generic/utf8_to_utf32/valid_utf8_to_utf32.h"
199
+ #include "generic/utf8_to_utf32/utf8_to_utf32.h"
200
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
201
+
202
+ #if SIMDUTF_FEATURE_UTF8
203
+ #include "generic/utf8.h"
204
+ #endif // SIMDUTF_FEATURE_UTF8
205
+
206
+ #if SIMDUTF_FEATURE_UTF16
207
+ #include "generic/utf16/count_code_points_bytemask.h"
208
+ #include "generic/utf16/change_endianness.h"
209
+ #include "generic/utf16/utf8_length_from_utf16_bytemask.h"
210
+ #include "generic/utf16/utf32_length_from_utf16.h"
211
+ #include "generic/utf16/to_well_formed.h"
212
+ #endif // SIMDUTF_FEATURE_UTF16
213
+
214
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
215
+ #include "generic/validate_utf16.h"
216
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
217
+
218
+ #if SIMDUTF_FEATURE_UTF32
219
+ #include "generic/utf32.h"
220
+ #endif // SIMDUTF_FEATURE_UTF32
221
+ #if SIMDUTF_FEATURE_BASE64
222
+ #include "generic/base64lengths.h"
223
+ #endif // SIMDUTF_FEATURE_BASE64
224
+
225
+ //
226
+ // Implementation-specific overrides
227
+ //
228
+ namespace simdutf {
229
+ namespace SIMDUTF_IMPLEMENTATION {
230
+
231
+ #if SIMDUTF_FEATURE_DETECT_ENCODING
232
+ simdutf_warn_unused int
233
+ implementation::detect_encodings(const char *input,
234
+ size_t length) const noexcept {
235
+ // If there is a BOM, then we trust it.
236
+ auto bom_encoding = simdutf::BOM::check_bom(input, length);
237
+ // todo: reimplement as a one-pass algorithm.
238
+ if (bom_encoding != encoding_type::unspecified) {
239
+ return bom_encoding;
240
+ }
241
+ int out = 0;
242
+ if (validate_utf8(input, length)) {
243
+ out |= encoding_type::UTF8;
244
+ }
245
+ if ((length % 2) == 0) {
246
+ if (validate_utf16le(reinterpret_cast<const char16_t *>(input),
247
+ length / 2)) {
248
+ out |= encoding_type::UTF16_LE;
249
+ }
250
+ }
251
+ if ((length % 4) == 0) {
252
+ if (validate_utf32(reinterpret_cast<const char32_t *>(input), length / 4)) {
253
+ out |= encoding_type::UTF32_LE;
254
+ }
255
+ }
256
+ return out;
257
+ }
258
+ #endif // SIMDUTF_FEATURE_DETECT_ENCODING
259
+
260
+ #if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
261
+ simdutf_warn_unused bool
262
+ implementation::validate_utf8(const char *buf, size_t len) const noexcept {
263
+ return lsx::utf8_validation::generic_validate_utf8(buf, len);
264
+ }
265
+ #endif // SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
266
+
267
+ #if SIMDUTF_FEATURE_UTF8
268
+ simdutf_warn_unused result implementation::validate_utf8_with_errors(
269
+ const char *buf, size_t len) const noexcept {
270
+ return lsx::utf8_validation::generic_validate_utf8_with_errors(buf, len);
271
+ }
272
+ #endif // SIMDUTF_FEATURE_UTF8
273
+
274
+ #if SIMDUTF_FEATURE_ASCII
275
+ simdutf_warn_unused bool
276
+ implementation::validate_ascii(const char *buf, size_t len) const noexcept {
277
+ return lsx::ascii_validation::generic_validate_ascii(buf, len);
278
+ }
279
+
280
+ simdutf_warn_unused result implementation::validate_ascii_with_errors(
281
+ const char *buf, size_t len) const noexcept {
282
+ return lsx::ascii_validation::generic_validate_ascii_with_errors(buf, len);
283
+ }
284
+ #endif // SIMDUTF_FEATURE_ASCII
285
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
286
+ simdutf_warn_unused bool
287
+ implementation::validate_utf16le_as_ascii(const char16_t *buf,
288
+ size_t len) const noexcept {
289
+ return lsx::utf16::validate_utf16_as_ascii_with_errors<endianness::LITTLE>(
290
+ buf, len)
291
+ .error == SUCCESS;
292
+ }
293
+
294
+ simdutf_warn_unused bool
295
+ implementation::validate_utf16be_as_ascii(const char16_t *buf,
296
+ size_t len) const noexcept {
297
+ return lsx::utf16::validate_utf16_as_ascii_with_errors<endianness::BIG>(buf,
298
+ len)
299
+ .error == SUCCESS;
300
+ }
301
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
302
+ #if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
303
+ simdutf_warn_unused bool
304
+ implementation::validate_utf16le(const char16_t *buf,
305
+ size_t len) const noexcept {
306
+ if (simdutf_unlikely(len == 0)) {
307
+ // empty input is valid. protected the implementation from nullptr.
308
+ return true;
309
+ }
310
+ const auto res =
311
+ lsx::utf16::validate_utf16_with_errors<endianness::LITTLE>(buf, len);
312
+
313
+ if (res.is_err()) {
314
+ return false;
315
+ }
316
+
317
+ if (res.count != len) {
318
+ return scalar::utf16::validate<endianness::LITTLE>(buf + res.count,
319
+ len - res.count);
320
+ }
321
+
322
+ return true;
323
+ }
324
+ #endif // SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
325
+
326
+ #if SIMDUTF_FEATURE_UTF16
327
+ simdutf_warn_unused bool
328
+ implementation::validate_utf16be(const char16_t *buf,
329
+ size_t len) const noexcept {
330
+ if (simdutf_unlikely(len == 0)) {
331
+ // empty input is valid. protected the implementation from nullptr.
332
+ return true;
333
+ }
334
+ const auto res =
335
+ lsx::utf16::validate_utf16_with_errors<endianness::BIG>(buf, len);
336
+
337
+ if (res.is_err()) {
338
+ return false;
339
+ }
340
+
341
+ if (res.count != len) {
342
+ return scalar::utf16::validate<endianness::BIG>(buf + res.count,
343
+ len - res.count);
344
+ }
345
+
346
+ return true;
347
+ }
348
+
349
+ simdutf_warn_unused result implementation::validate_utf16le_with_errors(
350
+ const char16_t *buf, size_t len) const noexcept {
351
+ if (simdutf_unlikely(len == 0)) {
352
+ return result(error_code::SUCCESS, 0);
353
+ }
354
+ const result res =
355
+ lsx::utf16::validate_utf16_with_errors<endianness::LITTLE>(buf, len);
356
+ if (res.count != len) {
357
+ const result scalar_res =
358
+ scalar::utf16::validate_with_errors<endianness::LITTLE>(
359
+ buf + res.count, len - res.count);
360
+ return result(scalar_res.error, res.count + scalar_res.count);
361
+ } else {
362
+ return res;
363
+ }
364
+ }
365
+
366
+ simdutf_warn_unused result implementation::validate_utf16be_with_errors(
367
+ const char16_t *buf, size_t len) const noexcept {
368
+ if (simdutf_unlikely(len == 0)) {
369
+ return result(error_code::SUCCESS, 0);
370
+ }
371
+ const result res =
372
+ lsx::utf16::validate_utf16_with_errors<endianness::BIG>(buf, len);
373
+ if (res.count != len) {
374
+ const result scalar_res =
375
+ scalar::utf16::validate_with_errors<endianness::BIG>(buf + res.count,
376
+ len - res.count);
377
+ return result(scalar_res.error, res.count + scalar_res.count);
378
+ } else {
379
+ return res;
380
+ }
381
+ }
382
+
383
+ void implementation::to_well_formed_utf16le(const char16_t *input, size_t len,
384
+ char16_t *output) const noexcept {
385
+ utf16::to_well_formed<endianness::LITTLE>(input, len, output);
386
+ }
387
+
388
+ void implementation::to_well_formed_utf16be(const char16_t *input, size_t len,
389
+ char16_t *output) const noexcept {
390
+ utf16::to_well_formed<endianness::BIG>(input, len, output);
391
+ }
392
+ #endif // SIMDUTF_FEATURE_UTF16
393
+
394
+ #if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
395
+ simdutf_warn_unused bool
396
+ implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept {
397
+ if (simdutf_unlikely(len == 0)) {
398
+ // empty input is valid. protected the implementation from nullptr.
399
+ return true;
400
+ }
401
+ const char32_t *tail = lsx_validate_utf32le(buf, len);
402
+ if (tail) {
403
+ return scalar::utf32::validate(tail, len - (tail - buf));
404
+ } else {
405
+ return false;
406
+ }
407
+ }
408
+ #endif // SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
409
+
410
+ #if SIMDUTF_FEATURE_UTF32
411
+ simdutf_warn_unused result implementation::validate_utf32_with_errors(
412
+ const char32_t *buf, size_t len) const noexcept {
413
+ if (simdutf_unlikely(len == 0)) {
414
+ return result(error_code::SUCCESS, 0);
415
+ }
416
+ result res = lsx_validate_utf32le_with_errors(buf, len);
417
+ if (res.count != len) {
418
+ result scalar_res =
419
+ scalar::utf32::validate_with_errors(buf + res.count, len - res.count);
420
+ return result(scalar_res.error, res.count + scalar_res.count);
421
+ } else {
422
+ return res;
423
+ }
424
+ }
425
+ #endif // SIMDUTF_FEATURE_UTF32
426
+
427
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
428
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(
429
+ const char *buf, size_t len, char *utf8_output) const noexcept {
430
+ std::pair<const char *, char *> ret =
431
+ lsx_convert_latin1_to_utf8(buf, len, utf8_output);
432
+ size_t converted_chars = ret.second - utf8_output;
433
+
434
+ if (ret.first != buf + len) {
435
+ const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert(
436
+ ret.first, len - (ret.first - buf), ret.second);
437
+ converted_chars += scalar_converted_chars;
438
+ }
439
+ return converted_chars;
440
+ }
441
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
442
+
443
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
444
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(
445
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
446
+ std::pair<const char *, char16_t *> ret =
447
+ lsx_convert_latin1_to_utf16le(buf, len, utf16_output);
448
+ size_t converted_chars = ret.second - utf16_output;
449
+ if (ret.first != buf + len) {
450
+ const size_t scalar_converted_chars =
451
+ scalar::latin1_to_utf16::convert<endianness::LITTLE>(
452
+ ret.first, len - (ret.first - buf), ret.second);
453
+ converted_chars += scalar_converted_chars;
454
+ }
455
+ return converted_chars;
456
+ }
457
+
458
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(
459
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
460
+ std::pair<const char *, char16_t *> ret =
461
+ lsx_convert_latin1_to_utf16be(buf, len, utf16_output);
462
+ size_t converted_chars = ret.second - utf16_output;
463
+ if (ret.first != buf + len) {
464
+ const size_t scalar_converted_chars =
465
+ scalar::latin1_to_utf16::convert<endianness::BIG>(
466
+ ret.first, len - (ret.first - buf), ret.second);
467
+ converted_chars += scalar_converted_chars;
468
+ }
469
+ return converted_chars;
470
+ }
471
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
472
+
473
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
474
+ simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(
475
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
476
+ std::pair<const char *, char32_t *> ret =
477
+ lsx_convert_latin1_to_utf32(buf, len, utf32_output);
478
+ size_t converted_chars = ret.second - utf32_output;
479
+ if (ret.first != buf + len) {
480
+ const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
481
+ ret.first, len - (ret.first - buf), ret.second);
482
+ converted_chars += scalar_converted_chars;
483
+ }
484
+ return converted_chars;
485
+ }
486
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
487
+
488
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
489
+ simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(
490
+ const char *buf, size_t len, char *latin1_output) const noexcept {
491
+ utf8_to_latin1::validating_transcoder converter;
492
+ return converter.convert(buf, len, latin1_output);
493
+ }
494
+
495
+ simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(
496
+ const char *buf, size_t len, char *latin1_output) const noexcept {
497
+ utf8_to_latin1::validating_transcoder converter;
498
+ return converter.convert_with_errors(buf, len, latin1_output);
499
+ }
500
+
501
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(
502
+ const char *buf, size_t len, char *latin1_output) const noexcept {
503
+ return lsx::utf8_to_latin1::convert_valid(buf, len, latin1_output);
504
+ }
505
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
506
+
507
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
508
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(
509
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
510
+ utf8_to_utf16::validating_transcoder converter;
511
+ return converter.convert<endianness::LITTLE>(buf, len, utf16_output);
512
+ }
513
+
514
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be(
515
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
516
+ utf8_to_utf16::validating_transcoder converter;
517
+ return converter.convert<endianness::BIG>(buf, len, utf16_output);
518
+ }
519
+
520
+ simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors(
521
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
522
+ utf8_to_utf16::validating_transcoder converter;
523
+ return converter.convert_with_errors<endianness::LITTLE>(buf, len,
524
+ utf16_output);
525
+ }
526
+
527
+ simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors(
528
+ const char *buf, size_t len, char16_t *utf16_output) const noexcept {
529
+ utf8_to_utf16::validating_transcoder converter;
530
+ return converter.convert_with_errors<endianness::BIG>(buf, len, utf16_output);
531
+ }
532
+
533
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le(
534
+ const char *input, size_t size, char16_t *utf16_output) const noexcept {
535
+ return utf8_to_utf16::convert_valid<endianness::LITTLE>(input, size,
536
+ utf16_output);
537
+ }
538
+
539
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be(
540
+ const char *input, size_t size, char16_t *utf16_output) const noexcept {
541
+ return utf8_to_utf16::convert_valid<endianness::BIG>(input, size,
542
+ utf16_output);
543
+ }
544
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
545
+
546
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
547
+ simdutf_warn_unused size_t implementation::convert_utf8_to_utf32(
548
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
549
+ utf8_to_utf32::validating_transcoder converter;
550
+ return converter.convert(buf, len, utf32_output);
551
+ }
552
+
553
+ simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors(
554
+ const char *buf, size_t len, char32_t *utf32_output) const noexcept {
555
+ utf8_to_utf32::validating_transcoder converter;
556
+ return converter.convert_with_errors(buf, len, utf32_output);
557
+ }
558
+
559
+ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(
560
+ const char *input, size_t size, char32_t *utf32_output) const noexcept {
561
+ return utf8_to_utf32::convert_valid(input, size, utf32_output);
562
+ }
563
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
564
+
565
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
566
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(
567
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
568
+ std::pair<const char16_t *, char *> ret =
569
+ lsx_convert_utf16_to_latin1<endianness::LITTLE>(buf, len, latin1_output);
570
+ if (ret.first == nullptr) {
571
+ return 0;
572
+ }
573
+ size_t saved_bytes = ret.second - latin1_output;
574
+
575
+ if (ret.first != buf + len) {
576
+ const size_t scalar_saved_bytes =
577
+ scalar::utf16_to_latin1::convert<endianness::LITTLE>(
578
+ ret.first, len - (ret.first - buf), ret.second);
579
+ if (scalar_saved_bytes == 0) {
580
+ return 0;
581
+ }
582
+ saved_bytes += scalar_saved_bytes;
583
+ }
584
+ return saved_bytes;
585
+ }
586
+
587
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(
588
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
589
+ std::pair<const char16_t *, char *> ret =
590
+ lsx_convert_utf16_to_latin1<endianness::BIG>(buf, len, latin1_output);
591
+ if (ret.first == nullptr) {
592
+ return 0;
593
+ }
594
+ size_t saved_bytes = ret.second - latin1_output;
595
+
596
+ if (ret.first != buf + len) {
597
+ const size_t scalar_saved_bytes =
598
+ scalar::utf16_to_latin1::convert<endianness::BIG>(
599
+ ret.first, len - (ret.first - buf), ret.second);
600
+ if (scalar_saved_bytes == 0) {
601
+ return 0;
602
+ }
603
+ saved_bytes += scalar_saved_bytes;
604
+ }
605
+ return saved_bytes;
606
+ }
607
+
608
+ simdutf_warn_unused result
609
+ implementation::convert_utf16le_to_latin1_with_errors(
610
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
611
+ std::pair<result, char *> ret =
612
+ lsx_convert_utf16_to_latin1_with_errors<endianness::LITTLE>(
613
+ buf, len, latin1_output);
614
+ if (ret.first.error) {
615
+ return ret.first;
616
+ } // Can return directly since scalar fallback already found correct
617
+ // ret.first.count
618
+ if (ret.first.count != len) { // All good so far, but not finished
619
+ result scalar_res =
620
+ scalar::utf16_to_latin1::convert_with_errors<endianness::LITTLE>(
621
+ buf + ret.first.count, len - ret.first.count, ret.second);
622
+ if (scalar_res.error) {
623
+ scalar_res.count += ret.first.count;
624
+ return scalar_res;
625
+ } else {
626
+ ret.second += scalar_res.count;
627
+ }
628
+ }
629
+ ret.first.count =
630
+ ret.second -
631
+ latin1_output; // Set count to the number of 8-bit code units written
632
+ return ret.first;
633
+ }
634
+
635
+ simdutf_warn_unused result
636
+ implementation::convert_utf16be_to_latin1_with_errors(
637
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
638
+ std::pair<result, char *> ret =
639
+ lsx_convert_utf16_to_latin1_with_errors<endianness::BIG>(buf, len,
640
+ latin1_output);
641
+ if (ret.first.error) {
642
+ return ret.first;
643
+ } // Can return directly since scalar fallback already found correct
644
+ // ret.first.count
645
+ if (ret.first.count != len) { // All good so far, but not finished
646
+ result scalar_res =
647
+ scalar::utf16_to_latin1::convert_with_errors<endianness::BIG>(
648
+ buf + ret.first.count, len - ret.first.count, ret.second);
649
+ if (scalar_res.error) {
650
+ scalar_res.count += ret.first.count;
651
+ return scalar_res;
652
+ } else {
653
+ ret.second += scalar_res.count;
654
+ }
655
+ }
656
+ ret.first.count =
657
+ ret.second -
658
+ latin1_output; // Set count to the number of 8-bit code units written
659
+ return ret.first;
660
+ }
661
+
662
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(
663
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
664
+ // optimization opportunity: implement a custom function.
665
+ return convert_utf16be_to_latin1(buf, len, latin1_output);
666
+ }
667
+
668
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(
669
+ const char16_t *buf, size_t len, char *latin1_output) const noexcept {
670
+ // optimization opportunity: implement a custom function.
671
+ return convert_utf16le_to_latin1(buf, len, latin1_output);
672
+ }
673
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
674
+
675
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
676
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(
677
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
678
+ std::pair<const char16_t *, char *> ret =
679
+ lsx_convert_utf16_to_utf8<endianness::LITTLE>(buf, len, utf8_output);
680
+ if (ret.first == nullptr) {
681
+ return 0;
682
+ }
683
+ size_t saved_bytes = ret.second - utf8_output;
684
+ if (ret.first != buf + len) {
685
+ const size_t scalar_saved_bytes =
686
+ scalar::utf16_to_utf8::convert<endianness::LITTLE>(
687
+ ret.first, len - (ret.first - buf), ret.second);
688
+ if (scalar_saved_bytes == 0) {
689
+ return 0;
690
+ }
691
+ saved_bytes += scalar_saved_bytes;
692
+ }
693
+ return saved_bytes;
694
+ }
695
+
696
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8(
697
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
698
+ std::pair<const char16_t *, char *> ret =
699
+ lsx_convert_utf16_to_utf8<endianness::BIG>(buf, len, utf8_output);
700
+ if (ret.first == nullptr) {
701
+ return 0;
702
+ }
703
+ size_t saved_bytes = ret.second - utf8_output;
704
+ if (ret.first != buf + len) {
705
+ const size_t scalar_saved_bytes =
706
+ scalar::utf16_to_utf8::convert<endianness::BIG>(
707
+ ret.first, len - (ret.first - buf), ret.second);
708
+ if (scalar_saved_bytes == 0) {
709
+ return 0;
710
+ }
711
+ saved_bytes += scalar_saved_bytes;
712
+ }
713
+ return saved_bytes;
714
+ }
715
+
716
+ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(
717
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
718
+ // ret.first.count is always the position in the buffer, not the number of
719
+ // code units written even if finished
720
+ std::pair<result, char *> ret =
721
+ lsx_convert_utf16_to_utf8_with_errors<endianness::LITTLE>(buf, len,
722
+ utf8_output);
723
+ if (ret.first.error) {
724
+ return ret.first;
725
+ } // Can return directly since scalar fallback already found correct
726
+ // ret.first.count
727
+ if (ret.first.count != len) { // All good so far, but not finished
728
+ result scalar_res =
729
+ scalar::utf16_to_utf8::convert_with_errors<endianness::LITTLE>(
730
+ buf + ret.first.count, len - ret.first.count, ret.second);
731
+ if (scalar_res.error) {
732
+ scalar_res.count += ret.first.count;
733
+ return scalar_res;
734
+ } else {
735
+ ret.second += scalar_res.count;
736
+ }
737
+ }
738
+ ret.first.count =
739
+ ret.second -
740
+ utf8_output; // Set count to the number of 8-bit code units written
741
+ return ret.first;
742
+ }
743
+
744
+ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(
745
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
746
+ // ret.first.count is always the position in the buffer, not the number of
747
+ // code units written even if finished
748
+ std::pair<result, char *> ret =
749
+ lsx_convert_utf16_to_utf8_with_errors<endianness::BIG>(buf, len,
750
+ utf8_output);
751
+ if (ret.first.error) {
752
+ return ret.first;
753
+ } // Can return directly since scalar fallback already found correct
754
+ // ret.first.count
755
+ if (ret.first.count != len) { // All good so far, but not finished
756
+ result scalar_res =
757
+ scalar::utf16_to_utf8::convert_with_errors<endianness::BIG>(
758
+ buf + ret.first.count, len - ret.first.count, ret.second);
759
+ if (scalar_res.error) {
760
+ scalar_res.count += ret.first.count;
761
+ return scalar_res;
762
+ } else {
763
+ ret.second += scalar_res.count;
764
+ }
765
+ }
766
+ ret.first.count =
767
+ ret.second -
768
+ utf8_output; // Set count to the number of 8-bit code units written
769
+ return ret.first;
770
+ }
771
+
772
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8(
773
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
774
+ return convert_utf16le_to_utf8(buf, len, utf8_output);
775
+ }
776
+
777
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8(
778
+ const char16_t *buf, size_t len, char *utf8_output) const noexcept {
779
+ return convert_utf16be_to_utf8(buf, len, utf8_output);
780
+ }
781
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
782
+
783
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
784
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(
785
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
786
+ if (simdutf_unlikely(len == 0)) {
787
+ return 0;
788
+ }
789
+ std::pair<const char32_t *, char *> ret =
790
+ lsx_convert_utf32_to_utf8(buf, len, utf8_output);
791
+ if (ret.first == nullptr) {
792
+ return 0;
793
+ }
794
+ size_t saved_bytes = ret.second - utf8_output;
795
+ if (ret.first != buf + len) {
796
+ const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert(
797
+ ret.first, len - (ret.first - buf), ret.second);
798
+ if (scalar_saved_bytes == 0) {
799
+ return 0;
800
+ }
801
+ saved_bytes += scalar_saved_bytes;
802
+ }
803
+ return saved_bytes;
804
+ }
805
+
806
+ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(
807
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
808
+ if (simdutf_unlikely(len == 0)) {
809
+ return result(error_code::SUCCESS, 0);
810
+ }
811
+ // ret.first.count is always the position in the buffer, not the number of
812
+ // code units written even if finished
813
+ std::pair<result, char *> ret =
814
+ lsx_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
815
+ if (ret.first.count != len) {
816
+ result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
817
+ buf + ret.first.count, len - ret.first.count, ret.second);
818
+ if (scalar_res.error) {
819
+ scalar_res.count += ret.first.count;
820
+ return scalar_res;
821
+ } else {
822
+ ret.second += scalar_res.count;
823
+ }
824
+ }
825
+ ret.first.count =
826
+ ret.second -
827
+ utf8_output; // Set count to the number of 8-bit code units written
828
+ return ret.first;
829
+ }
830
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
831
+
832
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
833
+ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32(
834
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
835
+ std::pair<const char16_t *, char32_t *> ret =
836
+ lsx_convert_utf16_to_utf32<endianness::LITTLE>(buf, len, utf32_output);
837
+ if (ret.first == nullptr) {
838
+ return 0;
839
+ }
840
+ size_t saved_bytes = ret.second - utf32_output;
841
+ if (ret.first != buf + len) {
842
+ const size_t scalar_saved_bytes =
843
+ scalar::utf16_to_utf32::convert<endianness::LITTLE>(
844
+ ret.first, len - (ret.first - buf), ret.second);
845
+ if (scalar_saved_bytes == 0) {
846
+ return 0;
847
+ }
848
+ saved_bytes += scalar_saved_bytes;
849
+ }
850
+ return saved_bytes;
851
+ }
852
+
853
+ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32(
854
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
855
+ std::pair<const char16_t *, char32_t *> ret =
856
+ lsx_convert_utf16_to_utf32<endianness::BIG>(buf, len, utf32_output);
857
+ if (ret.first == nullptr) {
858
+ return 0;
859
+ }
860
+ size_t saved_bytes = ret.second - utf32_output;
861
+ if (ret.first != buf + len) {
862
+ const size_t scalar_saved_bytes =
863
+ scalar::utf16_to_utf32::convert<endianness::BIG>(
864
+ ret.first, len - (ret.first - buf), ret.second);
865
+ if (scalar_saved_bytes == 0) {
866
+ return 0;
867
+ }
868
+ saved_bytes += scalar_saved_bytes;
869
+ }
870
+ return saved_bytes;
871
+ }
872
+
873
+ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(
874
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
875
+ // ret.first.count is always the position in the buffer, not the number of
876
+ // code units written even if finished
877
+ std::pair<result, char32_t *> ret =
878
+ lsx_convert_utf16_to_utf32_with_errors<endianness::LITTLE>(buf, len,
879
+ utf32_output);
880
+ if (ret.first.error) {
881
+ return ret.first;
882
+ } // Can return directly since scalar fallback already found correct
883
+ // ret.first.count
884
+ if (ret.first.count != len) { // All good so far, but not finished
885
+ result scalar_res =
886
+ scalar::utf16_to_utf32::convert_with_errors<endianness::LITTLE>(
887
+ buf + ret.first.count, len - ret.first.count, ret.second);
888
+ if (scalar_res.error) {
889
+ scalar_res.count += ret.first.count;
890
+ return scalar_res;
891
+ } else {
892
+ ret.second += scalar_res.count;
893
+ }
894
+ }
895
+ ret.first.count =
896
+ ret.second -
897
+ utf32_output; // Set count to the number of 8-bit code units written
898
+ return ret.first;
899
+ }
900
+
901
+ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(
902
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
903
+ // ret.first.count is always the position in the buffer, not the number of
904
+ // code units written even if finished
905
+ std::pair<result, char32_t *> ret =
906
+ lsx_convert_utf16_to_utf32_with_errors<endianness::BIG>(buf, len,
907
+ utf32_output);
908
+ if (ret.first.error) {
909
+ return ret.first;
910
+ } // Can return directly since scalar fallback already found correct
911
+ // ret.first.count
912
+ if (ret.first.count != len) { // All good so far, but not finished
913
+ result scalar_res =
914
+ scalar::utf16_to_utf32::convert_with_errors<endianness::BIG>(
915
+ buf + ret.first.count, len - ret.first.count, ret.second);
916
+ if (scalar_res.error) {
917
+ scalar_res.count += ret.first.count;
918
+ return scalar_res;
919
+ } else {
920
+ ret.second += scalar_res.count;
921
+ }
922
+ }
923
+ ret.first.count =
924
+ ret.second -
925
+ utf32_output; // Set count to the number of 8-bit code units written
926
+ return ret.first;
927
+ }
928
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
929
+
930
+ #if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
931
+ simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(
932
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
933
+ std::pair<const char32_t *, char *> ret =
934
+ lsx_convert_utf32_to_latin1(buf, len, latin1_output);
935
+ if (ret.first == nullptr) {
936
+ return 0;
937
+ }
938
+ size_t saved_bytes = ret.second - latin1_output;
939
+
940
+ if (ret.first != buf + len) {
941
+ const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert(
942
+ ret.first, len - (ret.first - buf), ret.second);
943
+ if (scalar_saved_bytes == 0) {
944
+ return 0;
945
+ }
946
+ saved_bytes += scalar_saved_bytes;
947
+ }
948
+ return saved_bytes;
949
+ }
950
+
951
+ simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(
952
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
953
+ std::pair<result, char *> ret =
954
+ lsx_convert_utf32_to_latin1_with_errors(buf, len, latin1_output);
955
+ if (ret.first.error) {
956
+ return ret.first;
957
+ } // Can return directly since scalar fallback already found correct
958
+ // ret.first.count
959
+ if (ret.first.count != len) { // All good so far, but not finished
960
+ result scalar_res = scalar::utf32_to_latin1::convert_with_errors(
961
+ buf + ret.first.count, len - ret.first.count, ret.second);
962
+ if (scalar_res.error) {
963
+ scalar_res.count += ret.first.count;
964
+ return scalar_res;
965
+ } else {
966
+ ret.second += scalar_res.count;
967
+ }
968
+ }
969
+ ret.first.count =
970
+ ret.second -
971
+ latin1_output; // Set count to the number of 8-bit code units written
972
+ return ret.first;
973
+ }
974
+
975
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(
976
+ const char32_t *buf, size_t len, char *latin1_output) const noexcept {
977
+ std::pair<const char32_t *, char *> ret =
978
+ lsx_convert_utf32_to_latin1(buf, len, latin1_output);
979
+ if (ret.first == nullptr) {
980
+ return 0;
981
+ }
982
+ size_t saved_bytes = ret.second - latin1_output;
983
+
984
+ if (ret.first != buf + len) {
985
+ const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid(
986
+ ret.first, len - (ret.first - buf), ret.second);
987
+ saved_bytes += scalar_saved_bytes;
988
+ }
989
+ return saved_bytes;
990
+ }
991
+ #endif // SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
992
+
993
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
994
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8(
995
+ const char32_t *buf, size_t len, char *utf8_output) const noexcept {
996
+ // optimization opportunity: implement a custom function.
997
+ return convert_utf32_to_utf8(buf, len, utf8_output);
998
+ }
999
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1000
+
1001
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1002
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le(
1003
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1004
+ std::pair<const char32_t *, char16_t *> ret =
1005
+ lsx_convert_utf32_to_utf16<endianness::LITTLE>(buf, len, utf16_output);
1006
+ if (ret.first == nullptr) {
1007
+ return 0;
1008
+ }
1009
+ size_t saved_bytes = ret.second - utf16_output;
1010
+ if (ret.first != buf + len) {
1011
+ const size_t scalar_saved_bytes =
1012
+ scalar::utf32_to_utf16::convert<endianness::LITTLE>(
1013
+ ret.first, len - (ret.first - buf), ret.second);
1014
+ if (scalar_saved_bytes == 0) {
1015
+ return 0;
1016
+ }
1017
+ saved_bytes += scalar_saved_bytes;
1018
+ }
1019
+
1020
+ return saved_bytes;
1021
+ }
1022
+
1023
+ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(
1024
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1025
+ std::pair<const char32_t *, char16_t *> ret =
1026
+ lsx_convert_utf32_to_utf16<endianness::BIG>(buf, len, utf16_output);
1027
+ if (ret.first == nullptr) {
1028
+ return 0;
1029
+ }
1030
+ size_t saved_bytes = ret.second - utf16_output;
1031
+ if (ret.first != buf + len) {
1032
+ const size_t scalar_saved_bytes =
1033
+ scalar::utf32_to_utf16::convert<endianness::BIG>(
1034
+ ret.first, len - (ret.first - buf), ret.second);
1035
+ if (scalar_saved_bytes == 0) {
1036
+ return 0;
1037
+ }
1038
+ saved_bytes += scalar_saved_bytes;
1039
+ }
1040
+ return saved_bytes;
1041
+ }
1042
+
1043
+ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
1044
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1045
+ // ret.first.count is always the position in the buffer, not the number of
1046
+ // code units written even if finished
1047
+ std::pair<result, char16_t *> ret =
1048
+ lsx_convert_utf32_to_utf16_with_errors<endianness::LITTLE>(buf, len,
1049
+ utf16_output);
1050
+ if (ret.first.count != len) {
1051
+ result scalar_res =
1052
+ scalar::utf32_to_utf16::convert_with_errors<endianness::LITTLE>(
1053
+ buf + ret.first.count, len - ret.first.count, ret.second);
1054
+ if (scalar_res.error) {
1055
+ scalar_res.count += ret.first.count;
1056
+ return scalar_res;
1057
+ } else {
1058
+ ret.second += scalar_res.count;
1059
+ }
1060
+ }
1061
+ ret.first.count =
1062
+ ret.second -
1063
+ utf16_output; // Set count to the number of 8-bit code units written
1064
+ return ret.first;
1065
+ }
1066
+
1067
+ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
1068
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1069
+ // ret.first.count is always the position in the buffer, not the number of
1070
+ // code units written even if finished
1071
+ std::pair<result, char16_t *> ret =
1072
+ lsx_convert_utf32_to_utf16_with_errors<endianness::BIG>(buf, len,
1073
+ utf16_output);
1074
+ if (ret.first.count != len) {
1075
+ result scalar_res =
1076
+ scalar::utf32_to_utf16::convert_with_errors<endianness::BIG>(
1077
+ buf + ret.first.count, len - ret.first.count, ret.second);
1078
+ if (scalar_res.error) {
1079
+ scalar_res.count += ret.first.count;
1080
+ return scalar_res;
1081
+ } else {
1082
+ ret.second += scalar_res.count;
1083
+ }
1084
+ }
1085
+ ret.first.count =
1086
+ ret.second -
1087
+ utf16_output; // Set count to the number of 8-bit code units written
1088
+ return ret.first;
1089
+ }
1090
+
1091
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le(
1092
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1093
+ return convert_utf32_to_utf16le(buf, len, utf16_output);
1094
+ }
1095
+
1096
+ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be(
1097
+ const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept {
1098
+ return convert_utf32_to_utf16be(buf, len, utf16_output);
1099
+ }
1100
+
1101
+ simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32(
1102
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
1103
+ return convert_utf16le_to_utf32(buf, len, utf32_output);
1104
+ }
1105
+
1106
+ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32(
1107
+ const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept {
1108
+ return convert_utf16be_to_utf32(buf, len, utf32_output);
1109
+ }
1110
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1111
+
1112
+ #if SIMDUTF_FEATURE_UTF16
1113
+ void implementation::change_endianness_utf16(const char16_t *input,
1114
+ size_t length,
1115
+ char16_t *output) const noexcept {
1116
+ utf16::change_endianness_utf16(input, length, output);
1117
+ }
1118
+
1119
+ simdutf_warn_unused size_t implementation::count_utf16le(
1120
+ const char16_t *input, size_t length) const noexcept {
1121
+ return utf16::count_code_points<endianness::LITTLE>(input, length);
1122
+ }
1123
+
1124
+ simdutf_warn_unused size_t implementation::count_utf16be(
1125
+ const char16_t *input, size_t length) const noexcept {
1126
+ return utf16::count_code_points<endianness::BIG>(input, length);
1127
+ }
1128
+ #endif // SIMDUTF_FEATURE_UTF16
1129
+
1130
+ #if SIMDUTF_FEATURE_UTF8
1131
+ simdutf_warn_unused size_t
1132
+ implementation::count_utf8(const char *input, size_t length) const noexcept {
1133
+ return utf8::count_code_points(input, length);
1134
+ }
1135
+ #endif // SIMDUTF_FEATURE_UTF8
1136
+
1137
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1138
+ simdutf_warn_unused size_t implementation::latin1_length_from_utf8(
1139
+ const char *buf, size_t len) const noexcept {
1140
+ return count_utf8(buf, len);
1141
+ }
1142
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1143
+
1144
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1145
+ simdutf_warn_unused size_t implementation::utf8_length_from_latin1(
1146
+ const char *input, size_t length) const noexcept {
1147
+ const uint8_t *data = reinterpret_cast<const uint8_t *>(input);
1148
+ const uint8_t *data_end = data + length;
1149
+ uint64_t result = 0;
1150
+ while (data_end - data > 16) {
1151
+ uint64_t two_bytes = 0;
1152
+ __m128i input_vec = __lsx_vld(data, 0);
1153
+ two_bytes =
1154
+ __lsx_vpickve2gr_hu(__lsx_vpcnt_h(__lsx_vmskltz_b(input_vec)), 0);
1155
+ result += 16 + two_bytes;
1156
+ data += 16;
1157
+ }
1158
+ return result + scalar::latin1::utf8_length_from_latin1((const char *)data,
1159
+ data_end - data);
1160
+ }
1161
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1162
+
1163
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1164
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(
1165
+ const char16_t *input, size_t length) const noexcept {
1166
+ return utf16::utf8_length_from_utf16_bytemask<endianness::LITTLE>(input,
1167
+ length);
1168
+ }
1169
+
1170
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf16be(
1171
+ const char16_t *input, size_t length) const noexcept {
1172
+ return utf16::utf8_length_from_utf16_bytemask<endianness::BIG>(input, length);
1173
+ }
1174
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1175
+
1176
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1177
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf16le(
1178
+ const char16_t *input, size_t length) const noexcept {
1179
+ return utf16::utf32_length_from_utf16<endianness::LITTLE>(input, length);
1180
+ }
1181
+
1182
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf16be(
1183
+ const char16_t *input, size_t length) const noexcept {
1184
+ return utf16::utf32_length_from_utf16<endianness::BIG>(input, length);
1185
+ }
1186
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1187
+
1188
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1189
+ simdutf_warn_unused size_t implementation::utf16_length_from_utf8(
1190
+ const char *input, size_t length) const noexcept {
1191
+ return utf8::utf16_length_from_utf8_bytemask(input, length);
1192
+ }
1193
+ simdutf_warn_unused result
1194
+ implementation::utf8_length_from_utf16le_with_replacement(
1195
+ const char16_t *input, size_t length) const noexcept {
1196
+ return scalar::utf16::utf8_length_from_utf16_with_replacement<
1197
+ endianness::LITTLE>(input, length);
1198
+ }
1199
+
1200
+ simdutf_warn_unused result
1201
+ implementation::utf8_length_from_utf16be_with_replacement(
1202
+ const char16_t *input, size_t length) const noexcept {
1203
+ return scalar::utf16::utf8_length_from_utf16_with_replacement<
1204
+ endianness::BIG>(input, length);
1205
+ }
1206
+
1207
+ simdutf_warn_unused size_t
1208
+ implementation::convert_utf16le_to_utf8_with_replacement(
1209
+ const char16_t *input, size_t length, char *utf8_buffer) const noexcept {
1210
+ return scalar::utf16_to_utf8::convert_with_replacement<endianness::LITTLE>(
1211
+ input, length, utf8_buffer);
1212
+ }
1213
+
1214
+ simdutf_warn_unused size_t
1215
+ implementation::convert_utf16be_to_utf8_with_replacement(
1216
+ const char16_t *input, size_t length, char *utf8_buffer) const noexcept {
1217
+ return scalar::utf16_to_utf8::convert_with_replacement<endianness::BIG>(
1218
+ input, length, utf8_buffer);
1219
+ }
1220
+
1221
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1222
+
1223
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1224
+ simdutf_warn_unused size_t implementation::utf8_length_from_utf32(
1225
+ const char32_t *input, size_t length) const noexcept {
1226
+ return utf32::utf8_length_from_utf32(input, length);
1227
+ }
1228
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1229
+
1230
+ #if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1231
+ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(
1232
+ const char32_t *input, size_t length) const noexcept {
1233
+ const __m128i v_ffff = lsx_splat_u32(0x0000ffff);
1234
+ size_t pos = 0;
1235
+ size_t count = 0;
1236
+ for (; pos + 4 <= length; pos += 4) {
1237
+ __m128i in = __lsx_vld(reinterpret_cast<const uint32_t *>(input + pos), 0);
1238
+ const __m128i surrogate_bytemask = __lsx_vslt_wu(v_ffff, in);
1239
+ size_t surrogate_count = __lsx_vpickve2gr_bu(
1240
+ __lsx_vpcnt_b(__lsx_vmskltz_w(surrogate_bytemask)), 0);
1241
+ count += 4 + surrogate_count;
1242
+ }
1243
+ return count +
1244
+ scalar::utf32::utf16_length_from_utf32(input + pos, length - pos);
1245
+ }
1246
+ #endif // SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1247
+
1248
+ #if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1249
+ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(
1250
+ const char *input, size_t length) const noexcept {
1251
+ return utf8::count_code_points(input, length);
1252
+ }
1253
+ #endif // SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1254
+
1255
+ #if SIMDUTF_FEATURE_BASE64
1256
+ simdutf_warn_unused result implementation::base64_to_binary(
1257
+ const char *input, size_t length, char *output, base64_options options,
1258
+ last_chunk_handling_options last_chunk_options) const noexcept {
1259
+ if (options & base64_default_or_url) {
1260
+ if (options == base64_options::base64_default_or_url_accept_garbage) {
1261
+ return compress_decode_base64<false, true, true>(
1262
+ output, input, length, options, last_chunk_options);
1263
+ } else {
1264
+ return compress_decode_base64<false, false, true>(
1265
+ output, input, length, options, last_chunk_options);
1266
+ }
1267
+ } else if (options & base64_url) {
1268
+ if (options == base64_options::base64_url_accept_garbage) {
1269
+ return compress_decode_base64<true, true, false>(
1270
+ output, input, length, options, last_chunk_options);
1271
+ } else {
1272
+ return compress_decode_base64<true, false, false>(
1273
+ output, input, length, options, last_chunk_options);
1274
+ }
1275
+ } else {
1276
+ if (options == base64_options::base64_default_accept_garbage) {
1277
+ return compress_decode_base64<false, true, false>(
1278
+ output, input, length, options, last_chunk_options);
1279
+ } else {
1280
+ return compress_decode_base64<false, false, false>(
1281
+ output, input, length, options, last_chunk_options);
1282
+ }
1283
+ }
1284
+ }
1285
+
1286
+ simdutf_warn_unused full_result implementation::base64_to_binary_details(
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 result implementation::base64_to_binary(
1317
+ const char16_t *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 full_result implementation::base64_to_binary_details(
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
+ size_t implementation::binary_to_base64(const char *input, size_t length,
1377
+ char *output,
1378
+ base64_options options) const noexcept {
1379
+ if (options & base64_url) {
1380
+ return encode_base64<true>(output, input, length, options);
1381
+ } else {
1382
+ return encode_base64<false>(output, input, length, options);
1383
+ }
1384
+ }
1385
+
1386
+ size_t implementation::binary_to_base64_with_lines(
1387
+ const char *input, size_t length, char *output, size_t line_length,
1388
+ base64_options options) const noexcept {
1389
+ return scalar::base64::tail_encode_base64_impl<true>(output, input, length,
1390
+ options, line_length);
1391
+ }
1392
+
1393
+ const char *implementation::find(const char *start, const char *end,
1394
+ char character) const noexcept {
1395
+ return util_find(start, end, character);
1396
+ }
1397
+
1398
+ const char16_t *implementation::find(const char16_t *start, const char16_t *end,
1399
+ char16_t character) const noexcept {
1400
+ return util_find(start, end, character);
1401
+ }
1402
+
1403
+ simdutf_warn_unused size_t implementation::binary_length_from_base64(
1404
+ const char *input, size_t length) const noexcept {
1405
+ return base64_lengths::binary_length_from_base64(input, length);
1406
+ }
1407
+
1408
+ simdutf_warn_unused size_t implementation::binary_length_from_base64(
1409
+ const char16_t *input, size_t length) const noexcept {
1410
+ return base64_lengths::binary_length_from_base64(input, length);
1411
+ }
1412
+ #endif // SIMDUTF_FEATURE_BASE64
1413
+
1414
+ } // namespace SIMDUTF_IMPLEMENTATION
1415
+ } // namespace simdutf
1416
+
1417
+ #include "simdutf/lsx/end.h"