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,240 @@
1
+ /**
2
+ * TurboPython Runtime - Type Traits
3
+ *
4
+ * Compile-time type classification for value vs reference semantics.
5
+ */
6
+
7
+ #pragma once
8
+
9
+ #include <array>
10
+ #include <cstdint>
11
+ #include <memory>
12
+ #include <string>
13
+ #include <string_view>
14
+ #include <tuple>
15
+ #include <type_traits>
16
+ #include <variant>
17
+ #include <vector>
18
+
19
+ namespace tpy {
20
+
21
+ // Forward declaration for BigInt specialization
22
+ class BigInt;
23
+
24
+ // --- Type trait for value vs reference semantics ---
25
+
26
+ /**
27
+ * is_value_type - Type trait for determining copy vs reference semantics.
28
+ *
29
+ * Value types (primitives) are returned by copy when accessed from containers.
30
+ * Object types (records, nested containers) are returned by reference.
31
+ */
32
+ template<typename T> struct is_value_type : std::false_type {};
33
+
34
+ // const-qualified types share their unqualified value-ness, so a readonly
35
+ // `*args` param lowered to `varargs<const T>` selects the same specialization
36
+ // (value vs dual-mode) as the mutable `varargs<T>`.
37
+ template<typename T> struct is_value_type<const T> : is_value_type<T> {};
38
+
39
+ // Primitive value types
40
+ template<> struct is_value_type<int8_t> : std::true_type {};
41
+ template<> struct is_value_type<int16_t> : std::true_type {};
42
+ template<> struct is_value_type<int32_t> : std::true_type {};
43
+ template<> struct is_value_type<int64_t> : std::true_type {};
44
+ template<> struct is_value_type<uint8_t> : std::true_type {};
45
+ template<> struct is_value_type<uint16_t> : std::true_type {};
46
+ template<> struct is_value_type<uint32_t> : std::true_type {};
47
+ template<> struct is_value_type<uint64_t> : std::true_type {};
48
+ template<> struct is_value_type<bool> : std::true_type {};
49
+ template<> struct is_value_type<char> : std::true_type {};
50
+ template<> struct is_value_type<double> : std::true_type {};
51
+ template<> struct is_value_type<std::string> : std::true_type {};
52
+ template<> struct is_value_type<std::string_view> : std::true_type {};
53
+ template<> struct is_value_type<BigInt> : std::true_type {};
54
+ // std::monostate -- TPy NoneType at value-bearing positions (e.g. Future[None]).
55
+ // Pure unit type, trivially copyable; passes through containers and generics
56
+ // the same way primitives do.
57
+ template<> struct is_value_type<std::monostate> : std::true_type {};
58
+
59
+ // Forward declaration for SpanIter specialization
60
+ template<typename T> struct SpanIter;
61
+
62
+ // SpanIter is a lightweight view (span + index), passed by value but borrows
63
+ template<typename T> struct is_value_type<SpanIter<T>> : std::true_type {};
64
+
65
+ // Tuples are value types (immutable in Python, always copied/moved)
66
+ template<typename... Ts> struct is_value_type<std::tuple<Ts...>> : std::true_type {};
67
+
68
+ // val_or_ref<T> is a lightweight pointer/value wrapper, always passed by value
69
+ template<typename T> struct val_or_ref;
70
+ template<typename T> struct is_value_type<val_or_ref<T>> : std::true_type {};
71
+
72
+ template<typename T>
73
+ inline constexpr bool is_value_type_v = is_value_type<T>::value;
74
+
75
+ // C++ concept for the ValueType marker protocol
76
+ template<typename T>
77
+ concept ValueType = is_value_type_v<T>;
78
+
79
+ // C++ concept for the Copyable marker protocol. Maps to copy-constructibility,
80
+ // which is the operation a generic method like Box[T].clone() actually needs.
81
+ // std::copy_constructible would also require move-constructibility; we want
82
+ // just the copy step here, so check the trait directly. Two theoretical edge
83
+ // cases the trait admits but std::copy_constructible would reject: types with
84
+ // an `explicit`-only copy ctor (direct-init works, copy-init doesn't) and
85
+ // types that are copy-constructible but not destructible. Neither pattern is
86
+ // generated by TPy today; if @native ever introduces one, switch to the
87
+ // standard concept or add a static_assert in the requires-clause emit path.
88
+ template<typename T>
89
+ concept Copyable = std::is_copy_constructible_v<T>;
90
+
91
+ // --- Thread safety markers ---
92
+
93
+ /**
94
+ * is_send - Type trait for thread-safe ownership transfer.
95
+ *
96
+ * Send types can be safely moved to another thread. All value types are Send
97
+ * by default. Raw pointers and non-owning views are not Send.
98
+ * User records specialize this trait when auto-derived by the compiler.
99
+ */
100
+ template<typename T> struct is_send : is_value_type<T> {};
101
+
102
+ // Pointers are not Send (raw pointer, no ownership guarantee)
103
+ template<typename T> struct is_send<T*> : std::false_type {};
104
+ template<typename T> struct is_send<const T*> : std::false_type {};
105
+
106
+ // string_view is not Send (borrows from another string)
107
+ template<> struct is_send<std::string_view> : std::false_type {};
108
+
109
+ // SpanIter borrows from a span -- not safe to transfer or share
110
+ template<typename T> struct is_send<SpanIter<T>> : std::false_type {};
111
+
112
+ // Containers: Send if elements are Send
113
+ template<typename T, typename A> struct is_send<std::vector<T, A>> : is_send<T> {};
114
+ template<typename T, std::size_t N> struct is_send<std::array<T, N>> : is_send<T> {};
115
+
116
+ // Forward declarations for container specializations
117
+ template<typename K, typename V> class ordered_map;
118
+ template<typename T> class ordered_set;
119
+
120
+ // ordered_map: Send if both key and value are Send
121
+ template<typename K, typename V>
122
+ struct is_send<ordered_map<K, V>>
123
+ : std::bool_constant<is_send<K>::value && is_send<V>::value> {};
124
+
125
+ // ordered_set: Send if element is Send
126
+ template<typename T>
127
+ struct is_send<ordered_set<T>> : is_send<T> {};
128
+
129
+ template<typename T>
130
+ concept Send = is_send<T>::value;
131
+
132
+ /**
133
+ * is_sync - Type trait for thread-safe shared access.
134
+ *
135
+ * Sync types can be safely referenced from multiple threads. Immutable types
136
+ * are Sync. Mutable containers (vector, ordered_map) are not Sync.
137
+ * User records specialize this trait when auto-derived by the compiler.
138
+ */
139
+ template<typename T> struct is_sync : is_value_type<T> {};
140
+
141
+ // Mutable pointers are not Sync
142
+ template<typename T> struct is_sync<T*> : std::false_type {};
143
+ // Const pointers are Sync if the pointee is Sync
144
+ template<typename T> struct is_sync<const T*> : is_sync<T> {};
145
+
146
+ // Mutable containers are not Sync
147
+ template<typename T, typename A> struct is_sync<std::vector<T, A>> : std::false_type {};
148
+ template<typename K, typename V> struct is_sync<ordered_map<K, V>> : std::false_type {};
149
+ template<typename T> struct is_sync<ordered_set<T>> : std::false_type {};
150
+ template<typename T, std::size_t N> struct is_sync<std::array<T, N>> : is_sync<T> {};
151
+
152
+ // SpanIter has mutable index_ state, not safe to share
153
+ template<typename T> struct is_sync<SpanIter<T>> : std::false_type {};
154
+
155
+ template<typename T>
156
+ concept Sync = is_sync<T>::value;
157
+
158
+ // Dispatched through impl structs so `T = void` can be specialized;
159
+ // `val_or_ref_t<void> = void` lets `def f[T] -> T` instantiate with
160
+ // T=None (the naked `std::conditional_t<..., void, void&>` form would
161
+ // substitute to ill-formed `void&`).
162
+ namespace detail {
163
+ template<typename T> struct val_or_ref_impl { using type = std::conditional_t<is_value_type<T>::value, T, T&>; };
164
+ template<typename T> struct val_or_cref_impl { using type = std::conditional_t<is_value_type<T>::value, T, const T&>; };
165
+ template<typename T> struct param_val_or_ref_impl { using type = std::conditional_t<is_value_type<T>::value, const T&, T&>; };
166
+
167
+ template<> struct val_or_ref_impl<void> { using type = void; };
168
+ template<> struct val_or_cref_impl<void> { using type = void; };
169
+ template<> struct param_val_or_ref_impl<void> { using type = void; };
170
+ }
171
+
172
+ template<typename T> using val_or_ref_t = typename detail::val_or_ref_impl<T>::type;
173
+ template<typename T> using val_or_cref_t = typename detail::val_or_cref_impl<T>::type;
174
+ template<typename T> using param_val_or_ref_t = typename detail::param_val_or_ref_impl<T>::type;
175
+
176
+ /**
177
+ * is_dyn_protocol_base<T> -- true iff T is a TPy @dynamic protocol abstract
178
+ * base. Codegen emits a specialization next to each @dynamic protocol class;
179
+ * default-false primary tolerates incomplete T (recursive type aliases).
180
+ */
181
+ template<typename T> struct is_dyn_protocol_base : std::false_type {};
182
+
183
+ template<typename T>
184
+ inline constexpr bool is_dyn_protocol_base_v = is_dyn_protocol_base<T>::value;
185
+
186
+ /**
187
+ * own_param_t<T> -- C++ parameter shape for a TPy Own[T] slot, picking per T
188
+ * at template instantiation: unique_ptr<T> for abstract @dynamic bases,
189
+ * T&& otherwise. Lazy via alias, so one template body handles all T.
190
+ */
191
+ template<typename T>
192
+ using own_param_t = std::conditional_t<
193
+ is_dyn_protocol_base_v<T>,
194
+ std::unique_ptr<T>,
195
+ T&&
196
+ >;
197
+
198
+ /**
199
+ * own_return_t<T> -- C++ return shape for a TPy Own[T] result.
200
+ *
201
+ * Companion to own_param_t. The param shape uses T&& for concrete T
202
+ * (rvalue ref to a caller-owned object), but T&& can't be a return type
203
+ * without dangling -- callees can't return a reference to their local.
204
+ * own_return_t is the by-value return shape: T for concrete (move),
205
+ * unique_ptr<T> for abstract @dynamic bases (ownership handle).
206
+ */
207
+ template<typename T>
208
+ using own_return_t = std::conditional_t<
209
+ is_dyn_protocol_base_v<T>,
210
+ std::unique_ptr<T>,
211
+ T
212
+ >;
213
+
214
+ /**
215
+ * val_or_ref<T> - Wrapper for iterator __next__() returns.
216
+ *
217
+ * Stores value types (int, str, tuple, ...) by value, non-value types
218
+ * (records, containers) by pointer. This lets __next__() return element
219
+ * references through std::expected (which cannot hold T&).
220
+ *
221
+ * T may be const-qualified (e.g. from a const_iterator). val_or_ref<const T>
222
+ * stores const T* and get() returns const T&.
223
+ */
224
+ template<typename T>
225
+ struct val_or_ref {
226
+ using is_val_or_ref_tag = void;
227
+ static constexpr bool is_val = is_value_type<std::remove_const_t<T>>::value;
228
+ using storage_t = std::conditional_t<is_val, std::remove_const_t<T>, T*>;
229
+ storage_t data_;
230
+
231
+ val_or_ref(const std::remove_const_t<T>& v) requires (is_val) : data_(v) {}
232
+ val_or_ref(T& ref) requires (!is_val) : data_(&ref) {}
233
+
234
+ decltype(auto) get() const {
235
+ if constexpr (is_val) return data_;
236
+ else return (*data_);
237
+ }
238
+ };
239
+
240
+ } // namespace tpy
@@ -0,0 +1,250 @@
1
+ /**
2
+ * TurboPython Runtime - UninitArrayStorage
3
+ *
4
+ * Inline uninitialized storage for N elements of type T.
5
+ * Uses a union so elements are not default-constructed.
6
+ * Caller is responsible for managing element lifetimes via
7
+ * construct() / destroy().
8
+ *
9
+ * Copy/move: not explicitly deleted -- C++ union rules apply naturally:
10
+ * - Trivially copyable T: copy works (bytes are independent)
11
+ * - Non-trivially-copyable T: C++ implicitly deletes union copy
12
+ */
13
+
14
+ #pragma once
15
+
16
+ #include <cstddef>
17
+ #include <cstdint>
18
+ #include <cstring>
19
+ #include <new>
20
+ #include <span>
21
+ #include <type_traits>
22
+ #include <utility>
23
+
24
+ #include "core.hpp"
25
+
26
+ #ifndef NDEBUG
27
+ #include <bitset>
28
+ #endif
29
+
30
+ namespace tpy {
31
+
32
+ template <typename T, std::size_t N>
33
+ class UninitArrayStorage {
34
+ public:
35
+ UninitArrayStorage() noexcept {
36
+ #ifndef NDEBUG
37
+ alive_.reset();
38
+ #endif
39
+ }
40
+
41
+ UninitArrayStorage(UninitArrayStorage&& other) noexcept {
42
+ std::memcpy(static_cast<void*>(&elems_[0]), static_cast<const void*>(&other.elems_[0]), sizeof(elems_));
43
+ #ifndef NDEBUG
44
+ alive_ = other.alive_;
45
+ other.alive_.reset();
46
+ #endif
47
+ }
48
+
49
+ UninitArrayStorage& operator=(UninitArrayStorage&& other) noexcept {
50
+ if (this != &other) {
51
+ std::memcpy(static_cast<void*>(&elems_[0]), static_cast<const void*>(&other.elems_[0]), sizeof(elems_));
52
+ #ifndef NDEBUG
53
+ alive_ = other.alive_;
54
+ other.alive_.reset();
55
+ #endif
56
+ }
57
+ return *this;
58
+ }
59
+
60
+ ~UninitArrayStorage() {
61
+ #ifndef NDEBUG
62
+ if (alive_.any()) {
63
+ tpy_panic("UninitArrayStorage destroyed with live elements");
64
+ }
65
+ #endif
66
+ }
67
+
68
+ void init(uint32_t i, T&& value) {
69
+ #ifndef NDEBUG
70
+ if (i >= N) {
71
+ tpy_panic("UninitArrayStorage::init index out of bounds");
72
+ }
73
+ if (alive_.test(i)) {
74
+ tpy_panic("UninitArrayStorage::init on already-alive slot");
75
+ }
76
+ alive_.set(i);
77
+ #endif
78
+ ::new (static_cast<void*>(&elems_[i])) T(std::move(value));
79
+ }
80
+
81
+ void init(uint32_t i, const T& value) {
82
+ #ifndef NDEBUG
83
+ if (i >= N) {
84
+ tpy_panic("UninitArrayStorage::init index out of bounds");
85
+ }
86
+ if (alive_.test(i)) {
87
+ tpy_panic("UninitArrayStorage::init on already-alive slot");
88
+ }
89
+ alive_.set(i);
90
+ #endif
91
+ ::new (static_cast<void*>(&elems_[i])) T(value);
92
+ }
93
+
94
+ void init0(T&& value) { init(0, std::move(value)); }
95
+ void init0(const T& value) { init(0, value); }
96
+
97
+ void drop(uint32_t i) {
98
+ #ifndef NDEBUG
99
+ if (i >= N) {
100
+ tpy_panic("UninitArrayStorage::drop index out of bounds");
101
+ }
102
+ if (!alive_.test(i)) {
103
+ tpy_panic("UninitArrayStorage::drop on dead slot");
104
+ }
105
+ alive_.reset(i);
106
+ #endif
107
+ elems_[i].~T();
108
+ }
109
+
110
+ void drop0() { drop(0); }
111
+
112
+ T& load(uint32_t i) {
113
+ #ifndef NDEBUG
114
+ if (i >= N) {
115
+ tpy_panic("UninitArrayStorage::load index out of bounds");
116
+ }
117
+ if (!alive_.test(i)) {
118
+ tpy_panic("UninitArrayStorage::load on dead slot");
119
+ }
120
+ #endif
121
+ return elems_[i];
122
+ }
123
+
124
+ const T& load(uint32_t i) const {
125
+ #ifndef NDEBUG
126
+ if (i >= N) {
127
+ tpy_panic("UninitArrayStorage::load index out of bounds");
128
+ }
129
+ if (!alive_.test(i)) {
130
+ tpy_panic("UninitArrayStorage::load on dead slot");
131
+ }
132
+ #endif
133
+ return elems_[i];
134
+ }
135
+
136
+ T& load0() { return load(0); }
137
+ const T& load0() const { return load(0); }
138
+
139
+ T take(uint32_t i) {
140
+ #ifndef NDEBUG
141
+ if (i >= N) {
142
+ tpy_panic("UninitArrayStorage::take index out of bounds");
143
+ }
144
+ if (!alive_.test(i)) {
145
+ tpy_panic("UninitArrayStorage::take on dead slot");
146
+ }
147
+ alive_.reset(i);
148
+ #endif
149
+ T result = std::move(elems_[i]);
150
+ elems_[i].~T();
151
+ return result;
152
+ }
153
+
154
+ T take0() { return take(0); }
155
+
156
+ T* ptr() { return elems_; }
157
+ const T* ptr() const { return elems_; }
158
+
159
+ static constexpr uint32_t capacity() { return static_cast<uint32_t>(N); }
160
+
161
+ void init_from_span(uint32_t start, std::span<const T> src) {
162
+ #ifndef NDEBUG
163
+ if (start + src.size() > N) {
164
+ tpy_panic("UninitArrayStorage::init_from_span: span exceeds capacity");
165
+ }
166
+ for (std::size_t i = 0; i < src.size(); ++i) {
167
+ if (alive_.test(start + i)) {
168
+ tpy_panic("UninitArrayStorage::init_from_span on already-alive slot");
169
+ }
170
+ alive_.set(start + i);
171
+ }
172
+ #endif
173
+ if constexpr (std::is_trivially_copyable_v<T>) {
174
+ std::memcpy(static_cast<void*>(&elems_[start]), src.data(), src.size() * sizeof(T));
175
+ } else {
176
+ for (std::size_t i = 0; i < src.size(); ++i) {
177
+ ::new (static_cast<void*>(&elems_[start + i])) T(src[i]);
178
+ }
179
+ }
180
+ }
181
+
182
+ void drop_n(uint32_t start, uint32_t count) {
183
+ #ifndef NDEBUG
184
+ for (uint32_t i = 0; i < count; ++i) {
185
+ uint32_t idx = start + i;
186
+ if (idx >= N) {
187
+ tpy_panic("UninitArrayStorage::drop_n index out of bounds");
188
+ }
189
+ if (!alive_.test(idx)) {
190
+ tpy_panic("UninitArrayStorage::drop_n on dead slot");
191
+ }
192
+ alive_.reset(idx);
193
+ }
194
+ #endif
195
+ if constexpr (!std::is_trivially_destructible_v<T>) {
196
+ for (uint32_t i = 0; i < count; ++i) {
197
+ elems_[start + i].~T();
198
+ }
199
+ }
200
+ }
201
+
202
+ void shift(uint32_t src, uint32_t dst, uint32_t count) {
203
+ if (count == 0 || src == dst) return;
204
+ #ifndef NDEBUG
205
+ for (uint32_t i = 0; i < count; ++i) {
206
+ if (src + i >= N || dst + i >= N) {
207
+ tpy_panic("UninitArrayStorage::shift index out of bounds");
208
+ }
209
+ if (!alive_.test(src + i)) {
210
+ tpy_panic("UninitArrayStorage::shift on dead source slot");
211
+ }
212
+ }
213
+ for (uint32_t i = 0; i < count; ++i) {
214
+ alive_.reset(src + i);
215
+ }
216
+ for (uint32_t i = 0; i < count; ++i) {
217
+ alive_.set(dst + i);
218
+ }
219
+ #endif
220
+ if constexpr (std::is_trivially_copyable_v<T>) {
221
+ std::memmove(static_cast<void*>(&elems_[dst]),
222
+ static_cast<const void*>(&elems_[src]),
223
+ static_cast<std::size_t>(count) * sizeof(T));
224
+ } else if (dst < src) {
225
+ for (uint32_t i = 0; i < count; ++i) {
226
+ ::new (static_cast<void*>(&elems_[dst + i]))
227
+ T(std::move(elems_[src + i]));
228
+ elems_[src + i].~T();
229
+ }
230
+ } else {
231
+ for (uint32_t i = count; i > 0; --i) {
232
+ uint32_t idx = i - 1;
233
+ ::new (static_cast<void*>(&elems_[dst + idx]))
234
+ T(std::move(elems_[src + idx]));
235
+ elems_[src + idx].~T();
236
+ }
237
+ }
238
+ }
239
+
240
+ // TODO: emplace(i, args...) for perfect-forwarding construction
241
+
242
+ private:
243
+ union { T elems_[N]; };
244
+
245
+ #ifndef NDEBUG
246
+ std::bitset<N> alive_;
247
+ #endif
248
+ };
249
+
250
+ } // namespace tpy