inkcpp_rb 0.1.0
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.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +84 -0
- data/LICENSE +7 -0
- data/README.md +3 -0
- data/Rakefile +16 -0
- data/bin/console +15 -0
- data/bin/setup +10 -0
- data/bin/tapioca +29 -0
- data/ext/inkcpp_rb/extconf.rb +19 -0
- data/ext/inkcpp_rb/inkcpp/.clang-format +99 -0
- data/ext/inkcpp_rb/inkcpp/.github/FUNDING.yml +1 -0
- data/ext/inkcpp_rb/inkcpp/.github/workflows/build.yml +344 -0
- data/ext/inkcpp_rb/inkcpp/.github/workflows/release.yml +49 -0
- data/ext/inkcpp_rb/inkcpp/.gitignore +25 -0
- data/ext/inkcpp_rb/inkcpp/.gitmodules +9 -0
- data/ext/inkcpp_rb/inkcpp/CMakeLists.txt +170 -0
- data/ext/inkcpp_rb/inkcpp/CODE_OF_CONDUCT.md +76 -0
- data/ext/inkcpp_rb/inkcpp/CONTRIBUTING.md +55 -0
- data/ext/inkcpp_rb/inkcpp/Config.cmake.in +2 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/CMakeLists.txt +13 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.c +38 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink.json +1 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example.zip +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/InkCPP_DEMO.zip +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/CreateThread.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/HandleChoice.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ListElementOf.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalRuntime.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalThread.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ObseverChange.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/TagListGetValue.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/YieldResume.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Doxyfile +2825 -0
- data/ext/inkcpp_rb/inkcpp/LICENSE.txt +22 -0
- data/ext/inkcpp_rb/inkcpp/Minimal.runsettings +8 -0
- data/ext/inkcpp_rb/inkcpp/README.md +192 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/CMakeLists.txt +67 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/array.h +481 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/avl_array.h +833 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/casting.h +93 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/choice.cpp +54 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.cpp +124 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.h +406 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.cpp +52 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.h +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/executioner.h +179 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functional.cpp +86 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functions.cpp +54 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functions.h +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.cpp +289 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.h +149 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/header.cpp +44 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/choice.h +106 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/functional.h +327 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/globals.h +196 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/list.h +187 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/runner.h +291 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/snapshot.h +61 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/story.h +219 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/story_ptr.h +233 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/traits.h +270 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/types.h +169 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.cpp +79 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.h +39 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.cpp +276 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.h +356 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.cpp +841 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.h +450 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.h +529 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/operation_bases.h +164 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/operations.h +100 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/output.cpp +528 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/output.h +153 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/platform.h +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/random.h +38 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.cpp +1396 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.h +336 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/simple_restorable_stack.h +335 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.cpp +182 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.h +91 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_interface.h +57 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/stack.cpp +618 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/stack.h +243 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.cpp +361 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.h +92 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_ptr.cpp +75 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.cpp +125 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.h +67 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.cpp +149 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.h +47 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_utils.h +207 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/system.cpp +39 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/tuple.hpp +151 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/value.cpp +279 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/value.h +666 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/CMakeLists.txt +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/include/inkcpp.h +393 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp.cpp +344 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp_c.pc.in +10 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/ExternalFunction.c +56 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Globals.c +98 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Lists.c +73 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Observer.c +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Snapshot.c +65 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/CMakeLists.txt +49 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/inkcpp_cl.cpp +215 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.cpp +209 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.h +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/CMakeLists.txt +37 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.cpp +446 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.h +70 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.cpp +166 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.h +79 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/command.cpp +107 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/compiler.cpp +96 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.cpp +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.h +104 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compilation_results.h +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compiler.h +44 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json.hpp +24596 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.cpp +411 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.h +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.cpp +47 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.h +70 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.cpp +107 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.h +55 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/CMakeLists.txt +19 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/example.py +78 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/src/module.cpp +317 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/conftest.py +53 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_ExternalFunctions.py +35 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Globals.py +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Lists.py +43 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Observer.py +27 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Snapshot.py +57 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/unreal_example.ink +71 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Array.cpp +115 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/CMakeLists.txt +117 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Callstack.cpp +392 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/EmptyStringForDivert.cpp +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ExternalFunctionsExecuteProperly.cpp +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/FallbackFunction.cpp +77 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Globals.cpp +73 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/InkyJson.cpp +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/LabelCondition.cpp +60 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Lists.cpp +144 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/LookaheadSafe.cpp +46 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Main.cpp +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/MoveTo.cpp +95 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/NewLines.cpp +76 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/NoEarlyTags.cpp +33 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Observer.cpp +245 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Pointer.cpp +191 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Restorable.cpp +294 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/SpaceAfterBracketChoice.cpp +45 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Stack.cpp +224 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Tags.cpp +131 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ThirdTierChoiceAfterBrackets.cpp +38 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/UTF8.cpp +56 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Value.cpp +210 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/catch.hpp +17970 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/AHF.ink +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ChoiceBracketStory.ink +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/EmptyStringForDivert.ink +13 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ExternalFunctionsExecuteProperly.ink +11 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/FallBack.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/GlobalStory.ink +9 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LabelConditionStory.ink +5 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LinesStory.ink +42 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListLogicStory.ink +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListStory.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LookaheadSafe.ink +14 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/MoveTo.ink +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/NoEarlyTags.ink +19 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ObserverStory.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/SimpleStoryFlow.ink +65 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TagsStory.ink +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TheIntercept.ink +1686 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ThirdTierChoiceAfterBracketsStory.ink +13 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF-8-demo.txt +212 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF8Story.ink +218 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inklecate.json +154 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inky.json +160 -0
- data/ext/inkcpp_rb/inkcpp/notes/ArchitectureNotes.md +54 -0
- data/ext/inkcpp_rb/inkcpp/notes/ListNotes.md +69 -0
- data/ext/inkcpp_rb/inkcpp/notes/OperationNotes.md +35 -0
- data/ext/inkcpp_rb/inkcpp/notes/TagsNotes.md +24 -0
- data/ext/inkcpp_rb/inkcpp/notes/WhitespaceNotes.md +28 -0
- data/ext/inkcpp_rb/inkcpp/proofing/README.md +3 -0
- data/ext/inkcpp_rb/inkcpp/proofing/inkcpp_runtime_driver +12 -0
- data/ext/inkcpp_rb/inkcpp/pyproject.toml +63 -0
- data/ext/inkcpp_rb/inkcpp/setup.py +166 -0
- data/ext/inkcpp_rb/inkcpp/shared/CMakeLists.txt +14 -0
- data/ext/inkcpp_rb/inkcpp/shared/private/command.h +172 -0
- data/ext/inkcpp_rb/inkcpp/shared/private/header.h +46 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/config.h +53 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/system.h +307 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/version.h +14 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestAllSequenceTypes.ink +59 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestArithmetic.ink +17 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBasicStringLiterals.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBasicTunnel.ink +10 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBlanksInInlineSequences.ink +51 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestCallStackEvaluation.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceCount.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceDivertsToDone.ink +6 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceWithBracketsOnly.ink +9 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestCompareDivertTargets.ink +26 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestComplexTunnels.ink +22 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestConditionalChoiceInWeave.ink +19 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestTunnelOnwardsAfterTunnel.ink +17 -0
- data/ext/inkcpp_rb/inkcpp/unreal/CMakeLists.txt +51 -0
- data/ext/inkcpp_rb/inkcpp/unreal/UE_example.ink +92 -0
- data/ext/inkcpp_rb/inkcpp/unreal/blueprint_filter.js +377 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Resources/Icon128.png +0 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkAsset.cpp +47 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkChoice.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkList.cpp +86 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkRuntime.cpp +265 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkThread.cpp +239 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkVar.cpp +143 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/TagList.cpp +95 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/inkcpp.cpp +13 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkAsset.h +50 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkChoice.h +58 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkDelegates.h +139 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkList.h +102 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkRuntime.h +177 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkSnapshot.h +30 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkThread.h +215 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkVar.h +245 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/TagList.h +77 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/inkcpp.h +217 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/inkcpp.Build.cs +62 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.cpp +237 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.h +43 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inkcpp_editor.cpp +13 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inklecate_cmd.cpp.in +24 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Public/inkcpp_editor.h +9 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/inkcpp_editor.Build.cs +61 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/inkcpp.uplugin +44 -0
- data/ext/inkcpp_rb/inkcpp/unreal/render.css +1 -0
- data/ext/inkcpp_rb/inkcpp_rb.cpp +321 -0
- data/inkcpp_rb.gemspec +54 -0
- data/rbi/inkcpp_rb.rbi +211 -0
- data/sorbet/config +4 -0
- data/sorbet/rbi/annotations/.gitattributes +1 -0
- data/sorbet/rbi/annotations/minitest.rbi +119 -0
- data/sorbet/rbi/gems/.gitattributes +1 -0
- data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
- data/sorbet/rbi/gems/erubi@1.13.1.rbi +155 -0
- data/sorbet/rbi/gems/minitest@5.25.4.rbi +1547 -0
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
- data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
- data/sorbet/rbi/gems/prism@1.3.0.rbi +40040 -0
- data/sorbet/rbi/gems/rake-compiler@1.2.8.rbi +9 -0
- data/sorbet/rbi/gems/rake@13.2.1.rbi +3033 -0
- data/sorbet/rbi/gems/rbi@0.2.2.rbi +4527 -0
- data/sorbet/rbi/gems/rice@4.3.3.rbi +44 -0
- data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
- data/sorbet/rbi/gems/tapioca@0.16.7.rbi +3611 -0
- data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
- data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
- data/sorbet/rbi/gems/yard@0.9.37.rbi +18379 -0
- data/sorbet/tapioca/config.yml +13 -0
- data/sorbet/tapioca/require.rb +4 -0
- metadata +400 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
/// very basic flat tuple implementation, only use for trivial data types.
|
|
10
|
+
|
|
11
|
+
#include "traits.h"
|
|
12
|
+
|
|
13
|
+
namespace ink::runtime::internal
|
|
14
|
+
{
|
|
15
|
+
namespace tuple_internal
|
|
16
|
+
{
|
|
17
|
+
/// data member of tuple
|
|
18
|
+
template<size_t I, typename T>
|
|
19
|
+
class tuple_leaf
|
|
20
|
+
{
|
|
21
|
+
public:
|
|
22
|
+
tuple_leaf()
|
|
23
|
+
: _value(){};
|
|
24
|
+
|
|
25
|
+
template<typename U>
|
|
26
|
+
explicit tuple_leaf(U&& u)
|
|
27
|
+
: _value(std::forward<U>(u))
|
|
28
|
+
{
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
T& get() { return _value; }
|
|
32
|
+
|
|
33
|
+
const T& get() const { return _value; }
|
|
34
|
+
|
|
35
|
+
private:
|
|
36
|
+
T _value;
|
|
37
|
+
tuple_leaf(const tuple_leaf& tl) = delete;
|
|
38
|
+
tuple_leaf& operator=(const tuple_leaf&) = delete;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// handle indexing
|
|
42
|
+
template<size_t... Is>
|
|
43
|
+
struct tuple_indexes {
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// create tuple_indexes in [Start,End[
|
|
47
|
+
template<size_t End, size_t Start = 0, size_t... Is>
|
|
48
|
+
struct make_tuple_indexes {
|
|
49
|
+
using type = typename make_tuple_indexes<End, Start + 1, Is..., Start>::type;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
template<size_t End, size_t... Is>
|
|
53
|
+
struct make_tuple_indexes<End, End, Is...> {
|
|
54
|
+
using type = tuple_indexes<Is...>;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/// get the index of first appearance of an type in tuple
|
|
58
|
+
template<typename T, size_t I, typename U, typename... Tys>
|
|
59
|
+
struct type_index_imp : type_index_imp<T, I + 1, Tys...> {
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
template<typename T, size_t I, typename... Tys>
|
|
63
|
+
struct type_index_imp<T, I, T, Tys...> {
|
|
64
|
+
static constexpr size_t value = I;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
template<typename T, typename... Tys>
|
|
68
|
+
constexpr size_t type_index = type_index_imp<T, 0, Tys...>::value;
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
/// implementation class to extract indices
|
|
72
|
+
template<typename Indexes, typename... Tys>
|
|
73
|
+
struct tuple_imp;
|
|
74
|
+
|
|
75
|
+
template<size_t... Is, typename... Tys>
|
|
76
|
+
struct tuple_imp<tuple_indexes<Is...>, Tys...> : public tuple_leaf<Is, Tys>... {
|
|
77
|
+
template<typename... Us>
|
|
78
|
+
tuple_imp(Us&&... us)
|
|
79
|
+
: tuple_leaf<Is, Tys>(std::forward<Us>(us))...
|
|
80
|
+
{
|
|
81
|
+
static_assert(
|
|
82
|
+
sizeof...(Us) == sizeof...(Tys),
|
|
83
|
+
"Tuple must be initialized with same amount of arguments"
|
|
84
|
+
", then types!"
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
} // namespace tuple_internal
|
|
89
|
+
|
|
90
|
+
/// minimal tuple class, only for simple data types!
|
|
91
|
+
/// flat tuple implementation
|
|
92
|
+
template<typename... Tys>
|
|
93
|
+
class tuple
|
|
94
|
+
: public tuple_internal::tuple_imp<
|
|
95
|
+
typename tuple_internal::make_tuple_indexes<sizeof...(Tys)>::type, Tys...>
|
|
96
|
+
{
|
|
97
|
+
using base = tuple_internal::tuple_imp<
|
|
98
|
+
typename tuple_internal::make_tuple_indexes<sizeof...(Tys)>::type, Tys...>;
|
|
99
|
+
using this_type = tuple<Tys...>;
|
|
100
|
+
|
|
101
|
+
public:
|
|
102
|
+
template<size_t I>
|
|
103
|
+
using element_type = typename get_ith_type<I, Tys...>::type;
|
|
104
|
+
template<typename T>
|
|
105
|
+
static constexpr size_t type_index = tuple_internal::type_index<T, Tys...>;
|
|
106
|
+
|
|
107
|
+
template<typename... Us>
|
|
108
|
+
tuple(Us&&... us)
|
|
109
|
+
: base(std::forward<Us>(us)...)
|
|
110
|
+
{
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/// access tuple element by index
|
|
115
|
+
template<size_t I, typename T>
|
|
116
|
+
constexpr const auto& get(const T& t)
|
|
117
|
+
{
|
|
118
|
+
return static_cast<const tuple_internal::tuple_leaf<I, typename T::template element_type<I>>&>(t)
|
|
119
|
+
.get();
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/// access tuple element by type. First of this type
|
|
123
|
+
template<typename T, typename Tuple>
|
|
124
|
+
constexpr const T& get(const Tuple& t)
|
|
125
|
+
{
|
|
126
|
+
return get<Tuple::template type_index<T>, Tuple>(t);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
template<>
|
|
130
|
+
class tuple<>
|
|
131
|
+
{
|
|
132
|
+
public:
|
|
133
|
+
tuple() {}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/// check if tuple contains type
|
|
137
|
+
template<typename T, typename Tuple>
|
|
138
|
+
struct has_type;
|
|
139
|
+
|
|
140
|
+
template<typename T>
|
|
141
|
+
struct has_type<T, tuple<>> : false_type {
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
template<typename T, typename U, typename... Tys>
|
|
145
|
+
struct has_type<T, tuple<U, Tys...>> : has_type<T, tuple<Tys...>> {
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
template<typename T, typename... Tys>
|
|
149
|
+
struct has_type<T, tuple<T, Tys...>> : true_type {
|
|
150
|
+
};
|
|
151
|
+
} // namespace ink::runtime::internal
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#include "value.h"
|
|
8
|
+
|
|
9
|
+
#include "list_impl.h"
|
|
10
|
+
#include "output.h"
|
|
11
|
+
#include "list_table.h"
|
|
12
|
+
#include "string_utils.h"
|
|
13
|
+
#include "string_table.h"
|
|
14
|
+
#include "system.h"
|
|
15
|
+
|
|
16
|
+
namespace ink::runtime::internal
|
|
17
|
+
{
|
|
18
|
+
|
|
19
|
+
template<value_type = value_type::OP_BEGIN>
|
|
20
|
+
bool truthy_impl(const value& v, const list_table& lists);
|
|
21
|
+
|
|
22
|
+
template<>
|
|
23
|
+
bool truthy_impl<value_type::OP_END>(const value& v, const list_table& lists)
|
|
24
|
+
{
|
|
25
|
+
inkFail("Type was not found in operational types or it has no conversion to boolean");
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
template<>
|
|
30
|
+
bool truthy_impl<value_type::string>(const value& v, const list_table& lists)
|
|
31
|
+
{
|
|
32
|
+
if (v.type() == value_type::string) {
|
|
33
|
+
// if string is not empty
|
|
34
|
+
return *v.get<value_type::string>().str != 0;
|
|
35
|
+
} else {
|
|
36
|
+
return truthy_impl<value_type::string + 1>(v, lists);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
template<>
|
|
41
|
+
bool truthy_impl<value_type::list_flag>(const value& v, const list_table& lists)
|
|
42
|
+
{
|
|
43
|
+
// if list is not empty -> valid flag -> filled list
|
|
44
|
+
if (v.type() == value_type::list_flag) {
|
|
45
|
+
return lists.to_bool(v.get<value_type::list_flag>());
|
|
46
|
+
} else {
|
|
47
|
+
return truthy_impl<value_type::list_flag + 1>(v, lists);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
template<>
|
|
52
|
+
bool truthy_impl<value_type::list>(const value& v, const list_table& lists)
|
|
53
|
+
{
|
|
54
|
+
// if list is not empty
|
|
55
|
+
if (v.type() == value_type::list) {
|
|
56
|
+
return lists.to_bool(v.get<value_type::list>());
|
|
57
|
+
} else {
|
|
58
|
+
return truthy_impl<value_type::list + 1>(v, lists);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
template<>
|
|
63
|
+
bool truthy_impl<value_type::float32>(const value& v, const list_table& lists)
|
|
64
|
+
{
|
|
65
|
+
if (v.type() == value_type::float32) {
|
|
66
|
+
return v.get<value_type::float32>() != 0.0f;
|
|
67
|
+
} else {
|
|
68
|
+
return truthy_impl<value_type::float32 + 1>(v, lists);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
template<>
|
|
73
|
+
bool truthy_impl<value_type::int32>(const value& v, const list_table& lists)
|
|
74
|
+
{
|
|
75
|
+
if (v.type() == value_type::int32) {
|
|
76
|
+
return v.get<value_type::int32>() != 0;
|
|
77
|
+
} else {
|
|
78
|
+
return truthy_impl<value_type::int32 + 1>(v, lists);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
template<>
|
|
83
|
+
bool truthy_impl<value_type::uint32>(const value& v, const list_table& lists)
|
|
84
|
+
{
|
|
85
|
+
if (v.type() == value_type::uint32) {
|
|
86
|
+
return v.get<value_type::uint32>() != 0;
|
|
87
|
+
} else {
|
|
88
|
+
return truthy_impl<value_type::uint32 + 1>(v, lists);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
template<>
|
|
93
|
+
bool truthy_impl<value_type::boolean>(const value& v, const list_table& lists)
|
|
94
|
+
{
|
|
95
|
+
if (v.type() == value_type::boolean) {
|
|
96
|
+
return v.get<value_type::boolean>();
|
|
97
|
+
} else {
|
|
98
|
+
return truthy_impl<value_type::boolean + 1>(v, lists);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
template<>
|
|
103
|
+
bool truthy_impl<value_type::divert>(const value& v, const list_table& lists)
|
|
104
|
+
{
|
|
105
|
+
if (v.type() == value_type::divert) {
|
|
106
|
+
inkFail("Divert can not be evaluated to boolean");
|
|
107
|
+
return false;
|
|
108
|
+
} else {
|
|
109
|
+
return truthy_impl<value_type::divert + 1>(v, lists);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
bool value::truthy(const list_table& lists) const { return truthy_impl(*this, lists); }
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
#ifdef INK_ENABLE_STL
|
|
117
|
+
template<value_type ty = value_type::PRINT_BEGIN>
|
|
118
|
+
void append(std::ostream& os, const value& val, const list_table* lists)
|
|
119
|
+
{
|
|
120
|
+
if constexpr (ty != value_type::PRINT_END) {
|
|
121
|
+
if (ty == val.type()) {
|
|
122
|
+
os << val.get<ty>();
|
|
123
|
+
} else {
|
|
124
|
+
append<ty + 1>(os, val, lists);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
template<>
|
|
130
|
+
void append<value_type::list_flag>(std::ostream& os, const value& val, const list_table* lists)
|
|
131
|
+
{
|
|
132
|
+
if (val.type() == value_type::list_flag) {
|
|
133
|
+
inkAssert(lists, "to stringify lists, we need a list_table");
|
|
134
|
+
os << lists->toString(val.get<value_type::list_flag>());
|
|
135
|
+
} else {
|
|
136
|
+
append<value_type::list_flag + 1>(os, val, lists);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
template<>
|
|
141
|
+
void append<value_type::list>(std::ostream& os, const value& val, const list_table* lists)
|
|
142
|
+
{
|
|
143
|
+
if (val.type() == value_type::list) {
|
|
144
|
+
inkAssert(lists, "to stringify lists, we need a list_table");
|
|
145
|
+
lists->write(os, val.get<value_type::list>());
|
|
146
|
+
} else {
|
|
147
|
+
append<value_type::list + 1>(os, val, lists);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
template<>
|
|
152
|
+
void append<value_type::float32>(std::ostream& os, const value& val, const list_table* lists)
|
|
153
|
+
{
|
|
154
|
+
if (val.type() == value_type::float32) {
|
|
155
|
+
char number[32];
|
|
156
|
+
ink::runtime::internal::toStr(number, 32, val.get<value_type::float32>());
|
|
157
|
+
os << number;
|
|
158
|
+
} else {
|
|
159
|
+
append<value_type::float32 + 1>(os, val, lists);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
template<>
|
|
164
|
+
void append<value_type::boolean>(std::ostream& os, const value& val, const list_table* lists)
|
|
165
|
+
{
|
|
166
|
+
if (val.type() == value_type::boolean) {
|
|
167
|
+
os << (val.get<value_type::boolean>() ? "true" : "false");
|
|
168
|
+
} else {
|
|
169
|
+
append<value_type::boolean + 1>(os, val, lists);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
std::ostream& value::write(std::ostream& os, const list_table* lists) const
|
|
174
|
+
{
|
|
175
|
+
if (type() < value_type::PRINT_BEGIN || type() >= value_type::PRINT_END) {
|
|
176
|
+
throw ink_exception("printing this type is not supported");
|
|
177
|
+
}
|
|
178
|
+
append(os, *this, lists);
|
|
179
|
+
return os;
|
|
180
|
+
}
|
|
181
|
+
#endif
|
|
182
|
+
|
|
183
|
+
basic_stream& operator<<(basic_stream& os, const value& val)
|
|
184
|
+
{
|
|
185
|
+
os.append(val);
|
|
186
|
+
return os;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
value::value(const ink::runtime::value& val)
|
|
190
|
+
: value()
|
|
191
|
+
{
|
|
192
|
+
using types = ink::runtime::value::Type;
|
|
193
|
+
switch (val.type) {
|
|
194
|
+
case types::Bool: set<value_type::boolean>(val.get<types::Bool>()); break;
|
|
195
|
+
case types::Uint32: set<value_type::uint32>(val.get<types::Uint32>()); break;
|
|
196
|
+
case types::Int32: set<value_type::int32>(val.get<types::Int32>()); break;
|
|
197
|
+
case types::String: set<value_type::string>(val.get<types::String>()); break;
|
|
198
|
+
case types::Float: set<value_type::float32>(val.get<types::Float>()); break;
|
|
199
|
+
case types::List:
|
|
200
|
+
set<value_type::list>(list_table::list{
|
|
201
|
+
static_cast<list_impl*>(val.get<types::List>())->get_lid()});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
bool value::set(const ink::runtime::value& val)
|
|
206
|
+
{
|
|
207
|
+
auto var = value(val);
|
|
208
|
+
if (type() == value_type::none || var.type() == type()) {
|
|
209
|
+
*this = var;
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
ink::runtime::value value::to_interface_value(list_table& table) const
|
|
216
|
+
{
|
|
217
|
+
using val = ink::runtime::value;
|
|
218
|
+
if (type() == value_type::boolean) {
|
|
219
|
+
return val(get<value_type::boolean>());
|
|
220
|
+
} else if (type() == value_type::uint32) {
|
|
221
|
+
return val(get<value_type::uint32>());
|
|
222
|
+
} else if (type() == value_type::int32) {
|
|
223
|
+
return val(get<value_type::int32>());
|
|
224
|
+
} else if (type() == value_type::string) {
|
|
225
|
+
return val(get<value_type::string>().str);
|
|
226
|
+
} else if (type() == value_type::float32) {
|
|
227
|
+
return val(get<value_type::float32>());
|
|
228
|
+
} else if (type() == value_type::list_flag) {
|
|
229
|
+
auto v = table.create();
|
|
230
|
+
v = table.add(v, get<value_type::list_flag>());
|
|
231
|
+
return val(table.handout_list(v));
|
|
232
|
+
} else if (type() == value_type::list) {
|
|
233
|
+
return val(table.handout_list(get<value_type::list>()));
|
|
234
|
+
}
|
|
235
|
+
inkFail("No valid type to convert to interface value!");
|
|
236
|
+
return val();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
size_t value::snap(unsigned char* data, const snapper& snapper) const
|
|
240
|
+
{
|
|
241
|
+
unsigned char* ptr = data;
|
|
242
|
+
bool should_write = data != nullptr;
|
|
243
|
+
ptr = snap_write(ptr, _type, should_write);
|
|
244
|
+
if (_type == value_type::string) {
|
|
245
|
+
unsigned char buf[max_value_size];
|
|
246
|
+
string_type* res = reinterpret_cast<string_type*>(buf);
|
|
247
|
+
auto str = get<value_type::string>();
|
|
248
|
+
res->allocated = str.allocated;
|
|
249
|
+
if (str.allocated) {
|
|
250
|
+
res->str = reinterpret_cast<const char*>(
|
|
251
|
+
static_cast<std::uintptr_t>(snapper.strings.get_id(str.str))
|
|
252
|
+
);
|
|
253
|
+
} else {
|
|
254
|
+
res->str = reinterpret_cast<const char*>(
|
|
255
|
+
static_cast<std::uintptr_t>(str.str - snapper.story_string_table)
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
ptr = snap_write(ptr, buf, should_write);
|
|
259
|
+
} else {
|
|
260
|
+
// TODO more space efficent?
|
|
261
|
+
ptr = snap_write(ptr, &bool_value, max_value_size, should_write);
|
|
262
|
+
}
|
|
263
|
+
return ptr - data;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const unsigned char* value::snap_load(const unsigned char* ptr, const loader& loader)
|
|
267
|
+
{
|
|
268
|
+
ptr = snap_read(ptr, _type);
|
|
269
|
+
ptr = snap_read(ptr, &bool_value, max_value_size);
|
|
270
|
+
if (_type == value_type::string) {
|
|
271
|
+
if (string_value.allocated) {
|
|
272
|
+
string_value.str = loader.string_table[(std::uintptr_t)(string_value.str)];
|
|
273
|
+
} else {
|
|
274
|
+
string_value.str = loader.story_string_table + (std::uintptr_t)(string_value.str);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return ptr;
|
|
278
|
+
}
|
|
279
|
+
} // namespace ink::runtime::internal
|