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.
- tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
- tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
- tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
- tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- tpyc/__init__.py +104 -0
- tpyc/__main__.py +6 -0
- tpyc/_buildinfo.py +1 -0
- tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
- tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
- tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
- tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
- tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
- tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
- tpyc/_data/lib/tpy/_functools_macros.py +80 -0
- tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
- tpyc/_data/lib/tpy/argparse.py +2062 -0
- tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
- tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
- tpyc/_data/lib/tpy/base64.py +410 -0
- tpyc/_data/lib/tpy/bisect.py +39 -0
- tpyc/_data/lib/tpy/builtins.py +38 -0
- tpyc/_data/lib/tpy/dataclasses.py +354 -0
- tpyc/_data/lib/tpy/enum.py +23 -0
- tpyc/_data/lib/tpy/functools.py +33 -0
- tpyc/_data/lib/tpy/hashlib.py +206 -0
- tpyc/_data/lib/tpy/heapq.py +118 -0
- tpyc/_data/lib/tpy/io.py +395 -0
- tpyc/_data/lib/tpy/json.py +221 -0
- tpyc/_data/lib/tpy/math.py +406 -0
- tpyc/_data/lib/tpy/random.py +597 -0
- tpyc/_data/lib/tpy/re.py +467 -0
- tpyc/_data/lib/tpy/socket.py +379 -0
- tpyc/_data/lib/tpy/struct.py +178 -0
- tpyc/_data/lib/tpy/sys.py +40 -0
- tpyc/_data/lib/tpy/time.py +39 -0
- tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
- tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
- tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
- tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
- tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
- tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
- tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
- tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
- tpyc/_data/lib/tpy/tpy/_version.py +29 -0
- tpyc/_data/lib/tpy/tpy/bits.py +28 -0
- tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
- tpyc/_data/lib/tpy/tpy/extern.py +8 -0
- tpyc/_data/lib/tpy/tpy/mem.py +49 -0
- tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
- tpyc/_data/lib/tpy/tpy/version.py +21 -0
- tpyc/_data/lib/tpy/typing.py +13 -0
- tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
- tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
- tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
- tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
- tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
- tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
- tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
- tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
- tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
- tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
- tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
- tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
- tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
- tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
- tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
- tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
- tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
- tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
- tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
- tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
- tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
- tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
- tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
- tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
- tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
- tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
- tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
- tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
- tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
- tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
- tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
- tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
- tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
- tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
- tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
- tpyc/_data/runtime/cpp/third_party/README.md +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
- tpyc/build/__init__.py +7 -0
- tpyc/build/pcre2.py +122 -0
- tpyc/build/third_party.py +413 -0
- tpyc/cli.py +822 -0
- tpyc/codegen_cpp/__init__.py +18 -0
- tpyc/codegen_cpp/builtins.py +484 -0
- tpyc/codegen_cpp/context.py +2064 -0
- tpyc/codegen_cpp/expressions.py +5940 -0
- tpyc/codegen_cpp/functions.py +1913 -0
- tpyc/codegen_cpp/gen_async.py +3258 -0
- tpyc/codegen_cpp/gen_generators.py +657 -0
- tpyc/codegen_cpp/generator.py +2258 -0
- tpyc/codegen_cpp/match.py +1997 -0
- tpyc/codegen_cpp/param_const.py +172 -0
- tpyc/codegen_cpp/protocols.py +907 -0
- tpyc/codegen_cpp/records.py +1654 -0
- tpyc/codegen_cpp/resumable_cfg.py +1651 -0
- tpyc/codegen_cpp/statements.py +4963 -0
- tpyc/codegen_cpp/string_dispatch.py +76 -0
- tpyc/codegen_cpp/test_context.py +46 -0
- tpyc/codegen_cpp/test_param_const.py +113 -0
- tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
- tpyc/codegen_cpp/type_resolution.py +53 -0
- tpyc/codegen_cpp/types.py +436 -0
- tpyc/codegen_cpp/variant_access.py +135 -0
- tpyc/coercions.py +749 -0
- tpyc/compilation_context.py +57 -0
- tpyc/compiler.py +3945 -0
- tpyc/cycle_detection.py +358 -0
- tpyc/diagnostics.py +135 -0
- tpyc/dump_types.py +353 -0
- tpyc/frontend_diagnostics.py +47 -0
- tpyc/frontend_ir/__init__.py +140 -0
- tpyc/frontend_ir/lower.py +1098 -0
- tpyc/frontend_ir/nodes.py +718 -0
- tpyc/frontend_ir/resolver_adapter.py +151 -0
- tpyc/frontend_plugin.py +209 -0
- tpyc/install_docs.py +81 -0
- tpyc/liveness.py +756 -0
- tpyc/macro_api.py +1724 -0
- tpyc/macro_loader.py +497 -0
- tpyc/module_names.py +64 -0
- tpyc/modules/__init__.py +31 -0
- tpyc/modules/defs.py +89 -0
- tpyc/modules/registry.py +36 -0
- tpyc/modules/resolver.py +192 -0
- tpyc/modules/type_resolution.py +629 -0
- tpyc/namespace.py +172 -0
- tpyc/parse/__init__.py +84 -0
- tpyc/parse/imports.py +490 -0
- tpyc/parse/nodes.py +1732 -0
- tpyc/parse/parser.py +4043 -0
- tpyc/parse/resolve_refs.py +466 -0
- tpyc/parse/type_resolver.py +1060 -0
- tpyc/prescan.py +254 -0
- tpyc/qnames.py +149 -0
- tpyc/repl.py +529 -0
- tpyc/repl_backends.py +848 -0
- tpyc/sema/__init__.py +21 -0
- tpyc/sema/analyzer.py +3625 -0
- tpyc/sema/bound_check.py +72 -0
- tpyc/sema/builder_trace.py +684 -0
- tpyc/sema/calls.py +5406 -0
- tpyc/sema/compatibility.py +2107 -0
- tpyc/sema/context.py +1243 -0
- tpyc/sema/expressions.py +3737 -0
- tpyc/sema/flow_facts.py +199 -0
- tpyc/sema/init_tracker.py +150 -0
- tpyc/sema/list_literals.py +69 -0
- tpyc/sema/literal_utils.py +27 -0
- tpyc/sema/local_deduction.py +1088 -0
- tpyc/sema/macros.py +179 -0
- tpyc/sema/match.py +1177 -0
- tpyc/sema/method_expansion.py +347 -0
- tpyc/sema/methods.py +2197 -0
- tpyc/sema/mutation_propagation.py +268 -0
- tpyc/sema/narrowing.py +857 -0
- tpyc/sema/numeric_lattice.py +160 -0
- tpyc/sema/operators.py +402 -0
- tpyc/sema/overloads.py +841 -0
- tpyc/sema/protocols.py +1209 -0
- tpyc/sema/reach_analysis.py +202 -0
- tpyc/sema/registration.py +3156 -0
- tpyc/sema/scope_tracker.py +193 -0
- tpyc/sema/statements.py +4426 -0
- tpyc/sema/type_ops.py +1879 -0
- tpyc/sema/value_range.py +181 -0
- tpyc/symbol_binding.py +259 -0
- tpyc/test_c3_mro.py +208 -0
- tpyc/test_cli_argv.py +52 -0
- tpyc/test_compiler.py +559 -0
- tpyc/test_contains_type_param.py +101 -0
- tpyc/test_cycle_detection.py +221 -0
- tpyc/test_dump_types.py +225 -0
- tpyc/test_install_docs.py +65 -0
- tpyc/test_local_cpp_form.py +135 -0
- tpyc/test_macro_loader.py +76 -0
- tpyc/test_method_expansion.py +254 -0
- tpyc/test_nominal_identity.py +182 -0
- tpyc/test_overloads.py +410 -0
- tpyc/test_parse.py +303 -0
- tpyc/test_parse_type_ref.py +506 -0
- tpyc/test_parse_version_info.py +58 -0
- tpyc/test_reach_analysis.py +72 -0
- tpyc/test_ref_type.py +216 -0
- tpyc/test_send_sync_substitution.py +276 -0
- tpyc/test_tuple_mutation_propagation.py +206 -0
- tpyc/test_type_def_registry.py +1729 -0
- tpyc/test_union_types.py +195 -0
- tpyc/type_def_registry.py +975 -0
- 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
|