tpy-lang 0.3.0.dev0__py3-none-any.whl

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 (333) hide show
  1. tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
  2. tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
  3. tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
  4. tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
  5. tpyc/__init__.py +104 -0
  6. tpyc/__main__.py +6 -0
  7. tpyc/_buildinfo.py +1 -0
  8. tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
  9. tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
  10. tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
  11. tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
  12. tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
  13. tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
  14. tpyc/_data/lib/tpy/_functools_macros.py +80 -0
  15. tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
  16. tpyc/_data/lib/tpy/argparse.py +2062 -0
  17. tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
  18. tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
  19. tpyc/_data/lib/tpy/base64.py +410 -0
  20. tpyc/_data/lib/tpy/bisect.py +39 -0
  21. tpyc/_data/lib/tpy/builtins.py +38 -0
  22. tpyc/_data/lib/tpy/dataclasses.py +354 -0
  23. tpyc/_data/lib/tpy/enum.py +23 -0
  24. tpyc/_data/lib/tpy/functools.py +33 -0
  25. tpyc/_data/lib/tpy/hashlib.py +206 -0
  26. tpyc/_data/lib/tpy/heapq.py +118 -0
  27. tpyc/_data/lib/tpy/io.py +395 -0
  28. tpyc/_data/lib/tpy/json.py +221 -0
  29. tpyc/_data/lib/tpy/math.py +406 -0
  30. tpyc/_data/lib/tpy/random.py +597 -0
  31. tpyc/_data/lib/tpy/re.py +467 -0
  32. tpyc/_data/lib/tpy/socket.py +379 -0
  33. tpyc/_data/lib/tpy/struct.py +178 -0
  34. tpyc/_data/lib/tpy/sys.py +40 -0
  35. tpyc/_data/lib/tpy/time.py +39 -0
  36. tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
  37. tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
  38. tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
  39. tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
  40. tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
  41. tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
  42. tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
  43. tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
  44. tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
  45. tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
  46. tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
  47. tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
  48. tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
  49. tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
  50. tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
  51. tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
  52. tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
  53. tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
  54. tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
  55. tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
  56. tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
  57. tpyc/_data/lib/tpy/tpy/_version.py +29 -0
  58. tpyc/_data/lib/tpy/tpy/bits.py +28 -0
  59. tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
  60. tpyc/_data/lib/tpy/tpy/extern.py +8 -0
  61. tpyc/_data/lib/tpy/tpy/mem.py +49 -0
  62. tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
  63. tpyc/_data/lib/tpy/tpy/version.py +21 -0
  64. tpyc/_data/lib/tpy/typing.py +13 -0
  65. tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
  66. tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
  67. tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
  68. tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
  69. tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
  70. tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
  71. tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
  72. tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
  73. tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
  74. tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
  75. tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
  76. tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
  77. tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
  78. tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
  79. tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
  80. tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
  81. tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
  82. tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
  83. tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
  84. tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
  85. tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
  86. tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
  87. tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
  88. tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
  89. tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
  90. tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
  91. tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
  92. tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
  93. tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
  94. tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
  95. tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
  96. tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
  97. tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
  98. tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
  99. tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
  100. tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
  101. tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
  102. tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
  103. tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
  104. tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
  105. tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
  106. tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
  107. tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
  108. tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
  109. tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
  110. tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
  111. tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
  112. tpyc/_data/runtime/cpp/third_party/README.md +58 -0
  113. tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
  114. tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
  115. tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
  116. tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
  117. tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
  118. tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
  119. tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
  120. tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
  121. tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
  122. tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
  123. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  124. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
  125. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  126. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
  127. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
  128. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
  129. tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
  130. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
  131. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
  132. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
  133. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
  134. tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
  135. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
  136. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
  137. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
  138. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
  139. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
  140. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
  141. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
  142. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
  143. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
  144. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
  145. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
  146. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
  147. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
  148. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
  149. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
  150. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
  151. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
  152. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
  153. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
  154. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
  155. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
  156. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
  157. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
  158. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
  159. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
  160. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
  161. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
  162. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
  163. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
  164. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
  165. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
  166. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
  167. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
  168. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
  169. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
  170. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
  171. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
  172. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
  173. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
  174. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
  175. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
  176. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
  177. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
  178. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
  179. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
  180. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
  181. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
  182. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
  183. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
  184. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
  185. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
  186. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
  187. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
  188. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
  189. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
  190. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
  191. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
  192. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
  193. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
  194. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
  195. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
  196. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
  197. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
  198. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
  199. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
  200. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
  201. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
  202. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
  203. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
  204. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
  205. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
  206. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
  207. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
  208. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
  209. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
  210. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
  211. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
  212. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
  213. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
  214. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
  215. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
  216. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
  217. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
  218. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
  219. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
  220. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
  221. tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
  222. tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
  223. tpyc/build/__init__.py +7 -0
  224. tpyc/build/pcre2.py +122 -0
  225. tpyc/build/third_party.py +413 -0
  226. tpyc/cli.py +822 -0
  227. tpyc/codegen_cpp/__init__.py +18 -0
  228. tpyc/codegen_cpp/builtins.py +484 -0
  229. tpyc/codegen_cpp/context.py +2064 -0
  230. tpyc/codegen_cpp/expressions.py +5940 -0
  231. tpyc/codegen_cpp/functions.py +1913 -0
  232. tpyc/codegen_cpp/gen_async.py +3258 -0
  233. tpyc/codegen_cpp/gen_generators.py +657 -0
  234. tpyc/codegen_cpp/generator.py +2258 -0
  235. tpyc/codegen_cpp/match.py +1997 -0
  236. tpyc/codegen_cpp/param_const.py +172 -0
  237. tpyc/codegen_cpp/protocols.py +907 -0
  238. tpyc/codegen_cpp/records.py +1654 -0
  239. tpyc/codegen_cpp/resumable_cfg.py +1651 -0
  240. tpyc/codegen_cpp/statements.py +4963 -0
  241. tpyc/codegen_cpp/string_dispatch.py +76 -0
  242. tpyc/codegen_cpp/test_context.py +46 -0
  243. tpyc/codegen_cpp/test_param_const.py +113 -0
  244. tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
  245. tpyc/codegen_cpp/type_resolution.py +53 -0
  246. tpyc/codegen_cpp/types.py +436 -0
  247. tpyc/codegen_cpp/variant_access.py +135 -0
  248. tpyc/coercions.py +749 -0
  249. tpyc/compilation_context.py +57 -0
  250. tpyc/compiler.py +3945 -0
  251. tpyc/cycle_detection.py +358 -0
  252. tpyc/diagnostics.py +135 -0
  253. tpyc/dump_types.py +353 -0
  254. tpyc/frontend_diagnostics.py +47 -0
  255. tpyc/frontend_ir/__init__.py +140 -0
  256. tpyc/frontend_ir/lower.py +1098 -0
  257. tpyc/frontend_ir/nodes.py +718 -0
  258. tpyc/frontend_ir/resolver_adapter.py +151 -0
  259. tpyc/frontend_plugin.py +209 -0
  260. tpyc/install_docs.py +81 -0
  261. tpyc/liveness.py +756 -0
  262. tpyc/macro_api.py +1724 -0
  263. tpyc/macro_loader.py +497 -0
  264. tpyc/module_names.py +64 -0
  265. tpyc/modules/__init__.py +31 -0
  266. tpyc/modules/defs.py +89 -0
  267. tpyc/modules/registry.py +36 -0
  268. tpyc/modules/resolver.py +192 -0
  269. tpyc/modules/type_resolution.py +629 -0
  270. tpyc/namespace.py +172 -0
  271. tpyc/parse/__init__.py +84 -0
  272. tpyc/parse/imports.py +490 -0
  273. tpyc/parse/nodes.py +1732 -0
  274. tpyc/parse/parser.py +4043 -0
  275. tpyc/parse/resolve_refs.py +466 -0
  276. tpyc/parse/type_resolver.py +1060 -0
  277. tpyc/prescan.py +254 -0
  278. tpyc/qnames.py +149 -0
  279. tpyc/repl.py +529 -0
  280. tpyc/repl_backends.py +848 -0
  281. tpyc/sema/__init__.py +21 -0
  282. tpyc/sema/analyzer.py +3625 -0
  283. tpyc/sema/bound_check.py +72 -0
  284. tpyc/sema/builder_trace.py +684 -0
  285. tpyc/sema/calls.py +5406 -0
  286. tpyc/sema/compatibility.py +2107 -0
  287. tpyc/sema/context.py +1243 -0
  288. tpyc/sema/expressions.py +3737 -0
  289. tpyc/sema/flow_facts.py +199 -0
  290. tpyc/sema/init_tracker.py +150 -0
  291. tpyc/sema/list_literals.py +69 -0
  292. tpyc/sema/literal_utils.py +27 -0
  293. tpyc/sema/local_deduction.py +1088 -0
  294. tpyc/sema/macros.py +179 -0
  295. tpyc/sema/match.py +1177 -0
  296. tpyc/sema/method_expansion.py +347 -0
  297. tpyc/sema/methods.py +2197 -0
  298. tpyc/sema/mutation_propagation.py +268 -0
  299. tpyc/sema/narrowing.py +857 -0
  300. tpyc/sema/numeric_lattice.py +160 -0
  301. tpyc/sema/operators.py +402 -0
  302. tpyc/sema/overloads.py +841 -0
  303. tpyc/sema/protocols.py +1209 -0
  304. tpyc/sema/reach_analysis.py +202 -0
  305. tpyc/sema/registration.py +3156 -0
  306. tpyc/sema/scope_tracker.py +193 -0
  307. tpyc/sema/statements.py +4426 -0
  308. tpyc/sema/type_ops.py +1879 -0
  309. tpyc/sema/value_range.py +181 -0
  310. tpyc/symbol_binding.py +259 -0
  311. tpyc/test_c3_mro.py +208 -0
  312. tpyc/test_cli_argv.py +52 -0
  313. tpyc/test_compiler.py +559 -0
  314. tpyc/test_contains_type_param.py +101 -0
  315. tpyc/test_cycle_detection.py +221 -0
  316. tpyc/test_dump_types.py +225 -0
  317. tpyc/test_install_docs.py +65 -0
  318. tpyc/test_local_cpp_form.py +135 -0
  319. tpyc/test_macro_loader.py +76 -0
  320. tpyc/test_method_expansion.py +254 -0
  321. tpyc/test_nominal_identity.py +182 -0
  322. tpyc/test_overloads.py +410 -0
  323. tpyc/test_parse.py +303 -0
  324. tpyc/test_parse_type_ref.py +506 -0
  325. tpyc/test_parse_version_info.py +58 -0
  326. tpyc/test_reach_analysis.py +72 -0
  327. tpyc/test_ref_type.py +216 -0
  328. tpyc/test_send_sync_substitution.py +276 -0
  329. tpyc/test_tuple_mutation_propagation.py +206 -0
  330. tpyc/test_type_def_registry.py +1729 -0
  331. tpyc/test_union_types.py +195 -0
  332. tpyc/type_def_registry.py +975 -0
  333. tpyc/typesys.py +5104 -0
@@ -0,0 +1,410 @@
1
+ # base64 -- RFC 4648 binary-to-text encodings (b64, b32, b16).
2
+ #
3
+ # Gaps vs. CPython:
4
+ # - b85/a85 encodings not implemented (rare; separate algorithms).
5
+ # - memoryview input not accepted: depends on TPy builtin `memoryview`,
6
+ # which is itself missing (see STDLIB_ROADMAP.md builtins section).
7
+ # - `b64decode(..., validate=False)` is stricter than CPython on
8
+ # degenerate padding. CPython's `binascii.a2b_base64` silently eats
9
+ # excess padding bytes: `b64decode(b"====") == b""`,
10
+ # `b64decode(b"TWFu=") == b"Man"`. This implementation raises
11
+ # ValueError in those cases (padding-length guard is unconditional).
12
+ # Valid inputs decode identically; only pathological inputs differ.
13
+ #
14
+ # Performance TODO -- benchmark vs. optimal C and close the gap.
15
+ # Current release-build numbers (1 MB payload, 50-iter avg, debug build
16
+ # excluded): TPy encode 540 MB/s, decode 500 MB/s; CPython `binascii`
17
+ # (hand-tuned C) encode 720 MB/s, decode 740 MB/s -- roughly 1.3-1.5x
18
+ # slower. Small-payload (32 B token) decode already beats CPython
19
+ # (lower per-call overhead). Low-hanging fruit to close the bulk gap:
20
+ # 1. Elide bounds checks on `data[i]`/`data[i+1]`/... when the loop
21
+ # guard (`i + 3 <= n`) proves in-range. Needs value-range analysis
22
+ # to flow across the if/while. Generic compiler work; helps every
23
+ # stdlib byte-level loop. Tracked in TODO.md.
24
+ # 2. Pre-size the output bytearray to the known final length instead
25
+ # of growing via push_back. Needs `bytearray.reserve()` (not yet
26
+ # exposed).
27
+ # 3. Fuse the `_filter_b64_input` + `_b64_decode` passes in lax mode
28
+ # (validate=False) -- single walk, skip non-alphabet chars as
29
+ # encountered.
30
+ # 4. `encodebytes`: inline the 76-char line wrap into the encode loop
31
+ # instead of encoding once and re-walking to insert `\n`.
32
+ # Compare against CPython on representative payloads before claiming a
33
+ # fix works -- aim for parity with binascii on 1 MB, superior on small
34
+ # inputs.
35
+ # tpy: cpp_namespace("tpystd::base64")
36
+ from typing import overload
37
+ from tpy import Int32, UInt8
38
+
39
+ _B64_STD: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
40
+ _B64_URL: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
41
+ _B32_ALPHA: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
42
+ _B16_ALPHA: bytes = b"0123456789ABCDEF"
43
+
44
+ _PAD: Int32 = 61 # '='
45
+ _CHAR_PLUS: Int32 = 43
46
+ _CHAR_SLASH: Int32 = 47
47
+ _CHAR_MINUS: Int32 = 45
48
+ _CHAR_UNDER: Int32 = 95
49
+
50
+ def _b64_encode(data: bytes, alphabet: bytes) -> bytes:
51
+ n: Int32 = Int32(len(data))
52
+ result: bytearray = bytearray()
53
+ i: Int32 = 0
54
+ while i + 3 <= n:
55
+ b0: Int32 = Int32(data[i])
56
+ b1: Int32 = Int32(data[i + 1])
57
+ b2: Int32 = Int32(data[i + 2])
58
+ result.append(alphabet[b0 >> 2])
59
+ result.append(alphabet[((b0 & 0x03) << 4) | (b1 >> 4)])
60
+ result.append(alphabet[((b1 & 0x0F) << 2) | (b2 >> 6)])
61
+ result.append(alphabet[b2 & 0x3F])
62
+ i += 3
63
+ rem: Int32 = n - i
64
+ if rem == 1:
65
+ r0: Int32 = Int32(data[i])
66
+ result.append(alphabet[r0 >> 2])
67
+ result.append(alphabet[(r0 & 0x03) << 4])
68
+ result.append(UInt8(_PAD))
69
+ result.append(UInt8(_PAD))
70
+ elif rem == 2:
71
+ s0: Int32 = Int32(data[i])
72
+ s1: Int32 = Int32(data[i + 1])
73
+ result.append(alphabet[s0 >> 2])
74
+ result.append(alphabet[((s0 & 0x03) << 4) | (s1 >> 4)])
75
+ result.append(alphabet[(s1 & 0x0F) << 2])
76
+ result.append(UInt8(_PAD))
77
+ return bytes(result)
78
+
79
+ def _b64_char_to_value(c: Int32, c62: Int32, c63: Int32) -> Int32:
80
+ if c >= 65 and c <= 90:
81
+ return c - 65
82
+ if c >= 97 and c <= 122:
83
+ return c - 97 + 26
84
+ if c >= 48 and c <= 57:
85
+ return c - 48 + 52
86
+ if c == c62:
87
+ return 62
88
+ if c == c63:
89
+ return 63
90
+ raise ValueError("Invalid base64 character")
91
+
92
+ def _b64_decode(data: bytes, c62: Int32, c63: Int32) -> bytes:
93
+ n: Int32 = Int32(len(data))
94
+ if n % 4 != 0:
95
+ raise ValueError("Invalid base64-encoded data length")
96
+ result: bytearray = bytearray()
97
+ i: Int32 = 0
98
+ while i < n:
99
+ c0: Int32 = Int32(data[i])
100
+ c1: Int32 = Int32(data[i + 1])
101
+ c2: Int32 = Int32(data[i + 2])
102
+ c3: Int32 = Int32(data[i + 3])
103
+ d0: Int32 = _b64_char_to_value(c0, c62, c63)
104
+ d1: Int32 = _b64_char_to_value(c1, c62, c63)
105
+ if c2 == _PAD:
106
+ if c3 != _PAD or i + 4 != n:
107
+ raise ValueError("Invalid base64 padding")
108
+ result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
109
+ elif c3 == _PAD:
110
+ if i + 4 != n:
111
+ raise ValueError("Invalid base64 padding")
112
+ e2: Int32 = _b64_char_to_value(c2, c62, c63)
113
+ result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
114
+ result.append(UInt8((((d1 & 0x0F) << 4) | (e2 >> 2)) & 0xFF))
115
+ else:
116
+ f2: Int32 = _b64_char_to_value(c2, c62, c63)
117
+ f3: Int32 = _b64_char_to_value(c3, c62, c63)
118
+ result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
119
+ result.append(UInt8((((d1 & 0x0F) << 4) | (f2 >> 2)) & 0xFF))
120
+ result.append(UInt8((((f2 & 0x03) << 6) | f3) & 0xFF))
121
+ i += 4
122
+ return bytes(result)
123
+
124
+ def _build_altchars_alphabet(altchars: bytes) -> bytes:
125
+ if len(altchars) != 2:
126
+ raise ValueError("altchars must be 2 bytes")
127
+ buf: bytearray = bytearray()
128
+ i: Int32 = 0
129
+ while i < 62:
130
+ buf.append(_B64_STD[i])
131
+ i += 1
132
+ buf.append(altchars[0])
133
+ buf.append(altchars[1])
134
+ return bytes(buf)
135
+
136
+ def _filter_b64_input(data: bytes, c62: Int32, c63: Int32) -> bytes:
137
+ # CPython's validate=False default silently drops non-alphabet chars
138
+ # (matching RFC 4648's MIME-mode leniency). Keep padding chars.
139
+ buf: bytearray = bytearray()
140
+ n: Int32 = Int32(len(data))
141
+ i: Int32 = 0
142
+ while i < n:
143
+ c: Int32 = Int32(data[i])
144
+ keep: bool = False
145
+ if c >= 65 and c <= 90:
146
+ keep = True
147
+ elif c >= 97 and c <= 122:
148
+ keep = True
149
+ elif c >= 48 and c <= 57:
150
+ keep = True
151
+ elif c == c62 or c == c63 or c == _PAD:
152
+ keep = True
153
+ if keep:
154
+ buf.append(UInt8(c))
155
+ i += 1
156
+ return bytes(buf)
157
+
158
+ def b64encode(data: bytes, altchars: bytes | None = None) -> bytes:
159
+ if altchars is None:
160
+ return _b64_encode(data, _B64_STD)
161
+ return _b64_encode(data, _build_altchars_alphabet(altchars))
162
+
163
+ @overload
164
+ def b64decode(data: bytes, altchars: bytes | None = None, validate: bool = False) -> bytes:
165
+ c62: Int32 = _CHAR_PLUS
166
+ c63: Int32 = _CHAR_SLASH
167
+ if altchars is not None:
168
+ if len(altchars) != 2:
169
+ raise ValueError("altchars must be 2 bytes")
170
+ c62 = Int32(altchars[0])
171
+ c63 = Int32(altchars[1])
172
+ if validate:
173
+ return _b64_decode(data, c62, c63)
174
+ return _b64_decode(_filter_b64_input(data, c62, c63), c62, c63)
175
+
176
+ @overload
177
+ def b64decode(data: str, altchars: bytes | None = None, validate: bool = False) -> bytes:
178
+ return b64decode(data.encode(), altchars, validate)
179
+
180
+ def standard_b64encode(data: bytes) -> bytes:
181
+ return _b64_encode(data, _B64_STD)
182
+
183
+ @overload
184
+ def standard_b64decode(data: bytes) -> bytes:
185
+ return _b64_decode(_filter_b64_input(data, _CHAR_PLUS, _CHAR_SLASH), _CHAR_PLUS, _CHAR_SLASH)
186
+
187
+ @overload
188
+ def standard_b64decode(data: str) -> bytes:
189
+ return standard_b64decode(data.encode())
190
+
191
+ def urlsafe_b64encode(data: bytes) -> bytes:
192
+ return _b64_encode(data, _B64_URL)
193
+
194
+ @overload
195
+ def urlsafe_b64decode(data: bytes) -> bytes:
196
+ return _b64_decode(_filter_b64_input(data, _CHAR_MINUS, _CHAR_UNDER), _CHAR_MINUS, _CHAR_UNDER)
197
+
198
+ @overload
199
+ def urlsafe_b64decode(data: str) -> bytes:
200
+ return urlsafe_b64decode(data.encode())
201
+
202
+ def b16encode(data: bytes) -> bytes:
203
+ n: Int32 = Int32(len(data))
204
+ result: bytearray = bytearray()
205
+ i: Int32 = 0
206
+ while i < n:
207
+ b: Int32 = Int32(data[i])
208
+ result.append(_B16_ALPHA[b >> 4])
209
+ result.append(_B16_ALPHA[b & 0x0F])
210
+ i += 1
211
+ return bytes(result)
212
+
213
+ def _b16_char_to_value(c: Int32, casefold: bool) -> Int32:
214
+ if c >= 48 and c <= 57:
215
+ return c - 48
216
+ if c >= 65 and c <= 70:
217
+ return c - 65 + 10
218
+ if casefold and c >= 97 and c <= 102:
219
+ return c - 97 + 10
220
+ raise ValueError("Invalid base16 character")
221
+
222
+ @overload
223
+ def b16decode(data: bytes, casefold: bool = False) -> bytes:
224
+ n: Int32 = Int32(len(data))
225
+ if n % 2 != 0:
226
+ raise ValueError("Invalid base16-encoded data length")
227
+ result: bytearray = bytearray()
228
+ i: Int32 = 0
229
+ while i < n:
230
+ hi: Int32 = _b16_char_to_value(Int32(data[i]), casefold)
231
+ lo: Int32 = _b16_char_to_value(Int32(data[i + 1]), casefold)
232
+ result.append(UInt8(((hi << 4) | lo) & 0xFF))
233
+ i += 2
234
+ return bytes(result)
235
+
236
+ @overload
237
+ def b16decode(data: str, casefold: bool = False) -> bytes:
238
+ return b16decode(data.encode(), casefold)
239
+
240
+ def b32encode(data: bytes) -> bytes:
241
+ # 5 input bytes (40 bits) -> 8 output chars (5 bits each).
242
+ n: Int32 = Int32(len(data))
243
+ result: bytearray = bytearray()
244
+ i: Int32 = 0
245
+ while i + 5 <= n:
246
+ b0: Int32 = Int32(data[i])
247
+ b1: Int32 = Int32(data[i + 1])
248
+ b2: Int32 = Int32(data[i + 2])
249
+ b3: Int32 = Int32(data[i + 3])
250
+ b4: Int32 = Int32(data[i + 4])
251
+ result.append(_B32_ALPHA[(b0 >> 3) & 0x1F])
252
+ result.append(_B32_ALPHA[((b0 & 0x07) << 2) | (b1 >> 6)])
253
+ result.append(_B32_ALPHA[(b1 >> 1) & 0x1F])
254
+ result.append(_B32_ALPHA[((b1 & 0x01) << 4) | (b2 >> 4)])
255
+ result.append(_B32_ALPHA[((b2 & 0x0F) << 1) | (b3 >> 7)])
256
+ result.append(_B32_ALPHA[(b3 >> 2) & 0x1F])
257
+ result.append(_B32_ALPHA[((b3 & 0x03) << 3) | (b4 >> 5)])
258
+ result.append(_B32_ALPHA[b4 & 0x1F])
259
+ i += 5
260
+ rem: Int32 = n - i
261
+ if rem > 0:
262
+ # CPython's b32encode pads input with zero bytes to 5-byte boundary,
263
+ # emits 8 output chars, then replaces trailing positions with '=' by
264
+ # rem-based count: 1->6 pads, 2->4, 3->3, 4->1.
265
+ t0: Int32 = Int32(data[i])
266
+ t1: Int32 = 0
267
+ t2: Int32 = 0
268
+ t3: Int32 = 0
269
+ if rem >= 2:
270
+ t1 = Int32(data[i + 1])
271
+ if rem >= 3:
272
+ t2 = Int32(data[i + 2])
273
+ if rem >= 4:
274
+ t3 = Int32(data[i + 3])
275
+ result.append(_B32_ALPHA[(t0 >> 3) & 0x1F])
276
+ result.append(_B32_ALPHA[((t0 & 0x07) << 2) | (t1 >> 6)])
277
+ if rem == 1:
278
+ result.append(UInt8(_PAD))
279
+ result.append(UInt8(_PAD))
280
+ result.append(UInt8(_PAD))
281
+ result.append(UInt8(_PAD))
282
+ result.append(UInt8(_PAD))
283
+ result.append(UInt8(_PAD))
284
+ return bytes(result)
285
+ result.append(_B32_ALPHA[(t1 >> 1) & 0x1F])
286
+ result.append(_B32_ALPHA[((t1 & 0x01) << 4) | (t2 >> 4)])
287
+ if rem == 2:
288
+ result.append(UInt8(_PAD))
289
+ result.append(UInt8(_PAD))
290
+ result.append(UInt8(_PAD))
291
+ result.append(UInt8(_PAD))
292
+ return bytes(result)
293
+ result.append(_B32_ALPHA[((t2 & 0x0F) << 1) | (t3 >> 7)])
294
+ if rem == 3:
295
+ result.append(UInt8(_PAD))
296
+ result.append(UInt8(_PAD))
297
+ result.append(UInt8(_PAD))
298
+ return bytes(result)
299
+ result.append(_B32_ALPHA[(t3 >> 2) & 0x1F])
300
+ result.append(_B32_ALPHA[(t3 & 0x03) << 3])
301
+ result.append(UInt8(_PAD))
302
+ return bytes(result)
303
+
304
+ def _b32_char_to_value(c: Int32) -> Int32:
305
+ if c >= 65 and c <= 90:
306
+ return c - 65
307
+ if c >= 50 and c <= 55: # '2'-'7'
308
+ return c - 50 + 26
309
+ raise ValueError("Invalid base32 character")
310
+
311
+ def _b32_preprocess(data: bytes, casefold: bool, map01: bytes | None) -> bytes:
312
+ n: Int32 = Int32(len(data))
313
+ buf: bytearray = bytearray()
314
+ map_target: Int32 = 0
315
+ if map01 is not None:
316
+ # RFC 4648 section 2.4 recommends 'I' or 'L' as targets, but CPython
317
+ # accepts any single byte -- match that.
318
+ if len(map01) != 1:
319
+ raise ValueError("map01 must be a single byte")
320
+ map_target = Int32(map01[0])
321
+ i: Int32 = 0
322
+ while i < n:
323
+ c: Int32 = Int32(data[i])
324
+ if casefold and c >= 97 and c <= 122:
325
+ c = c - 32 # to upper
326
+ if map01 is not None:
327
+ if c == 48: # '0' -> 'O'
328
+ c = 79
329
+ elif c == 49: # '1' -> map_target
330
+ c = map_target
331
+ buf.append(UInt8(c))
332
+ i += 1
333
+ return bytes(buf)
334
+
335
+ @overload
336
+ def b32decode(data: bytes, casefold: bool = False, map01: bytes | None = None) -> bytes:
337
+ if casefold or map01 is not None:
338
+ return _b32decode_impl(_b32_preprocess(data, casefold, map01))
339
+ return _b32decode_impl(data)
340
+
341
+ @overload
342
+ def b32decode(data: str, casefold: bool = False, map01: bytes | None = None) -> bytes:
343
+ return b32decode(data.encode(), casefold, map01)
344
+
345
+ def _b32decode_impl(data: bytes) -> bytes:
346
+ n: Int32 = Int32(len(data))
347
+ if n % 8 != 0:
348
+ raise ValueError("Invalid base32-encoded data length")
349
+ result: bytearray = bytearray()
350
+ i: Int32 = 0
351
+ while i < n:
352
+ # Count pads in this 8-char block (only trailing are valid).
353
+ pad: Int32 = 0
354
+ j: Int32 = 7
355
+ while j >= 0 and Int32(data[i + j]) == _PAD:
356
+ pad += 1
357
+ j -= 1
358
+ if pad != 0 and pad != 1 and pad != 3 and pad != 4 and pad != 6:
359
+ raise ValueError("Invalid base32 padding")
360
+ if pad > 0 and i + 8 != n:
361
+ raise ValueError("Invalid base32 padding")
362
+ # Decode non-pad chars.
363
+ vals: list[Int32] = [0, 0, 0, 0, 0, 0, 0, 0]
364
+ k: Int32 = 0
365
+ while k < 8 - pad:
366
+ vals[k] = _b32_char_to_value(Int32(data[i + k]))
367
+ k += 1
368
+ result.append(UInt8(((vals[0] << 3) | (vals[1] >> 2)) & 0xFF))
369
+ if pad == 6:
370
+ i += 8
371
+ continue
372
+ result.append(UInt8((((vals[1] & 0x03) << 6) | (vals[2] << 1) | (vals[3] >> 4)) & 0xFF))
373
+ if pad == 4:
374
+ i += 8
375
+ continue
376
+ result.append(UInt8((((vals[3] & 0x0F) << 4) | (vals[4] >> 1)) & 0xFF))
377
+ if pad == 3:
378
+ i += 8
379
+ continue
380
+ result.append(UInt8((((vals[4] & 0x01) << 7) | (vals[5] << 2) | (vals[6] >> 3)) & 0xFF))
381
+ if pad == 1:
382
+ i += 8
383
+ continue
384
+ result.append(UInt8((((vals[6] & 0x07) << 5) | vals[7]) & 0xFF))
385
+ i += 8
386
+ return bytes(result)
387
+
388
+ _NEWLINE: Int32 = 10 # '\n'
389
+ _MIME_LINE: Int32 = 76 # MIME line length for encodebytes
390
+
391
+ def encodebytes(data: bytes) -> bytes:
392
+ # MIME-style: standard base64 with a newline every 76 output chars and
393
+ # a trailing newline. For empty input, returns b'' (no newline).
394
+ encoded: bytes = _b64_encode(data, _B64_STD)
395
+ n: Int32 = Int32(len(encoded))
396
+ result: bytearray = bytearray()
397
+ i: Int32 = 0
398
+ while i < n:
399
+ j: Int32 = 0
400
+ while j < _MIME_LINE and i < n:
401
+ result.append(encoded[i])
402
+ i += 1
403
+ j += 1
404
+ result.append(UInt8(_NEWLINE))
405
+ return bytes(result)
406
+
407
+ def decodebytes(data: bytes) -> bytes:
408
+ # MIME-style: tolerate newlines and whitespace in input.
409
+ return b64decode(data)
410
+
@@ -0,0 +1,39 @@
1
+ # bisect -- array bisection algorithms
2
+ # tpy: cpp_namespace("tpystd::bisect")
3
+ from tpy import Int32, Comparable, copy
4
+
5
+ def bisect_left[T: Comparable](a: list[T], x: T) -> Int32:
6
+ lo: Int32 = 0
7
+ hi: Int32 = Int32(len(a))
8
+ while lo < hi:
9
+ mid: Int32 = (lo + hi) // 2
10
+ if a[mid] < x:
11
+ lo = mid + 1
12
+ else:
13
+ hi = mid
14
+ return lo
15
+
16
+ def bisect_right[T: Comparable](a: list[T], x: T) -> Int32:
17
+ lo: Int32 = 0
18
+ hi: Int32 = Int32(len(a))
19
+ while lo < hi:
20
+ mid: Int32 = (lo + hi) // 2
21
+ if x < a[mid]:
22
+ hi = mid
23
+ else:
24
+ lo = mid + 1
25
+ return lo
26
+
27
+ def insort_left[T: Comparable](a: list[T], x: T) -> None:
28
+ i: Int32 = bisect_left(a, x)
29
+ a.insert(i, copy(x))
30
+
31
+ def insort_right[T: Comparable](a: list[T], x: T) -> None:
32
+ i: Int32 = bisect_right(a, x)
33
+ a.insert(i, copy(x))
34
+
35
+ def bisect[T: Comparable](a: list[T], x: T) -> Int32:
36
+ return bisect_right(a, x)
37
+
38
+ def insort[T: Comparable](a: list[T], x: T) -> None:
39
+ insort_right(a, x)
@@ -0,0 +1,38 @@
1
+ # tpy: native_module
2
+ # tpy: cpp_namespace("tpystd::builtins")
3
+ from tpy._builtins import (
4
+ BaseException, Exception, ValueError, OSError, FileNotFoundError,
5
+ AttributeError, AssertionError, IndexError, KeyError,
6
+ ArithmeticError, ZeroDivisionError, OverflowError,
7
+ TypeError, NotImplementedError, RuntimeError, MemoryError, StopIteration,
8
+ StopAsyncIteration, TimeoutError,
9
+ Range, range,
10
+ len, repr, hash, chr, ord, abs, min, max, pow, divmod, next, iter, round, print, input, isinstance, getattr, setattr, delattr, hasattr,
11
+ all, any, sum, sorted, bin, hex, oct, enumerate, reversed, zip, map, filter,
12
+ bytes, bytearray,
13
+ bool, int, float, str, slice,
14
+ list, dict, dict_keys, dict_values, dict_items,
15
+ set,
16
+ TextIO, BinaryIO, open, open_text, open_binary,
17
+ )
18
+
19
+ __all__ = [
20
+ # Types (always available as annotations via implicit `import builtins`
21
+ # semantics, matching CPython -- the parser auto-resolves any name in
22
+ # this __all__ against `builtins` without requiring `from builtins import`
23
+ # in user code).
24
+ "int", "float", "bool", "str", "bytes", "bytearray", "None",
25
+ "tuple", "basic_slice", "slice", "type",
26
+ "Exception", "ValueError", "OSError", "FileNotFoundError", "BaseException",
27
+ "AttributeError", "AssertionError", "IndexError", "KeyError",
28
+ "ArithmeticError", "ZeroDivisionError", "OverflowError",
29
+ "TypeError", "NotImplementedError", "RuntimeError", "MemoryError",
30
+ "list", "dict", "dict_keys", "dict_values", "dict_items", "set",
31
+ "Range", "range",
32
+ "len", "repr", "hash", "chr", "ord", "abs", "min", "max", "pow", "divmod", "next", "iter", "round",
33
+ "print", "input", "isinstance", "getattr", "setattr", "delattr", "hasattr",
34
+ "all", "any", "sum", "sorted", "bin", "hex", "oct", "enumerate", "reversed", "zip",
35
+ "map", "filter",
36
+ "StopIteration", "StopAsyncIteration", "TimeoutError",
37
+ "TextIO", "BinaryIO", "open", "open_text", "open_binary",
38
+ ]