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,160 @@
|
|
|
1
|
+
{
|
|
2
|
+
"inkVersion": 21,
|
|
3
|
+
"root": [
|
|
4
|
+
[
|
|
5
|
+
{
|
|
6
|
+
"->": "start"
|
|
7
|
+
},
|
|
8
|
+
[
|
|
9
|
+
"done",
|
|
10
|
+
{
|
|
11
|
+
"#f": 5,
|
|
12
|
+
"#n": "g-0"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
null
|
|
16
|
+
],
|
|
17
|
+
"done",
|
|
18
|
+
{
|
|
19
|
+
"start": [
|
|
20
|
+
[
|
|
21
|
+
"^Once upon a time...",
|
|
22
|
+
"\n",
|
|
23
|
+
[
|
|
24
|
+
"ev",
|
|
25
|
+
{
|
|
26
|
+
"^->": "start.0.2.$r1"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"temp=": "$r"
|
|
30
|
+
},
|
|
31
|
+
"str",
|
|
32
|
+
{
|
|
33
|
+
"->": ".^.s"
|
|
34
|
+
},
|
|
35
|
+
[
|
|
36
|
+
{
|
|
37
|
+
"#n": "$r1"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"/str",
|
|
41
|
+
"/ev",
|
|
42
|
+
{
|
|
43
|
+
"*": ".^.^.c-0",
|
|
44
|
+
"flg": 18
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"s": [
|
|
48
|
+
"^There were two choices.",
|
|
49
|
+
{
|
|
50
|
+
"->": "$r",
|
|
51
|
+
"var": true
|
|
52
|
+
},
|
|
53
|
+
null
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"ev",
|
|
59
|
+
{
|
|
60
|
+
"^->": "start.0.3.$r1"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"temp=": "$r"
|
|
64
|
+
},
|
|
65
|
+
"str",
|
|
66
|
+
{
|
|
67
|
+
"->": ".^.s"
|
|
68
|
+
},
|
|
69
|
+
[
|
|
70
|
+
{
|
|
71
|
+
"#n": "$r1"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"/str",
|
|
75
|
+
"/ev",
|
|
76
|
+
{
|
|
77
|
+
"*": ".^.^.c-1",
|
|
78
|
+
"flg": 18
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"s": [
|
|
82
|
+
"^There were four lines of content.",
|
|
83
|
+
{
|
|
84
|
+
"->": "$r",
|
|
85
|
+
"var": true
|
|
86
|
+
},
|
|
87
|
+
null
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
{
|
|
92
|
+
"c-0": [
|
|
93
|
+
"ev",
|
|
94
|
+
{
|
|
95
|
+
"^->": "start.0.c-0.$r2"
|
|
96
|
+
},
|
|
97
|
+
"/ev",
|
|
98
|
+
{
|
|
99
|
+
"temp=": "$r"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"->": ".^.^.2.s"
|
|
103
|
+
},
|
|
104
|
+
[
|
|
105
|
+
{
|
|
106
|
+
"#n": "$r2"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"\n",
|
|
110
|
+
{
|
|
111
|
+
"->": ".^.^.g-0"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"#f": 5
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"c-1": [
|
|
118
|
+
"ev",
|
|
119
|
+
{
|
|
120
|
+
"^->": "start.0.c-1.$r2"
|
|
121
|
+
},
|
|
122
|
+
"/ev",
|
|
123
|
+
{
|
|
124
|
+
"temp=": "$r"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"->": ".^.^.3.s"
|
|
128
|
+
},
|
|
129
|
+
[
|
|
130
|
+
{
|
|
131
|
+
"#n": "$r2"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"\n",
|
|
135
|
+
{
|
|
136
|
+
"->": ".^.^.g-0"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"#f": 5
|
|
140
|
+
}
|
|
141
|
+
],
|
|
142
|
+
"g-0": [
|
|
143
|
+
"^They lived happily ever after.",
|
|
144
|
+
"\n",
|
|
145
|
+
"end",
|
|
146
|
+
{
|
|
147
|
+
"#f": 5
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
{
|
|
153
|
+
"#f": 1
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
"#f": 1
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"listDefs": {}
|
|
160
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Container Metadata
|
|
2
|
+
|
|
3
|
+
Even though the inkcpp binary compiler flattens the hierarchical JSON structure into a flat sequence of commands with diverts, we still need to maintain some metadata about the container structure so we can properly record visit counts.
|
|
4
|
+
|
|
5
|
+
## Container Instructions Layout
|
|
6
|
+
|
|
7
|
+
Only containers which have visit or turn tracking flags are recorded in any way. All other containers may as well no longer exist.
|
|
8
|
+
|
|
9
|
+
The first command at the start of any container is a {{START_CONTAINER_MARKER}}.
|
|
10
|
+
|
|
11
|
+
Inline child container are written in-place as the interpreter should enter them normally when it reaches them.
|
|
12
|
+
|
|
13
|
+
Named containers specified in a container's meta-data are compiled in order after we finish writing out all commands for the parent container.
|
|
14
|
+
* Before writing any of them, we write a {{DIVERT}} command which jumps to {{END_CONTAINER_MARKER}} for the parent below. This way we don't wander into these child containers when we run out of content in our own container.
|
|
15
|
+
* After writing each named child, we write a similar {{DIVERT}} as above. This way, when any of these containers finish, the interpreter does not wander into their siblings.
|
|
16
|
+
* Both these diverts are written with a special {{DIVERT_IS_FALLTHROUGH}} flag. Its important will be clear later.
|
|
17
|
+
|
|
18
|
+
After writing all these named children, the last command, a {{END_CONTAINER_MARKER}} is written.
|
|
19
|
+
|
|
20
|
+
## Container Start/End Instruction
|
|
21
|
+
|
|
22
|
+
{{START_CONTAINER_MARKER}} and {{END_CONTAINER_MARKER}} both have a {{container_t}} argument to uniquely identify the container starting or ending. These numbers have no relation to the original container names. They are assigned sequentially starting from 0 to each container which requires tracking.
|
|
23
|
+
|
|
24
|
+
The {{START}} command pushes that container ID onto the current container stack. {{END}} pops them.
|
|
25
|
+
|
|
26
|
+
TODO: Notes on implied DONE and the done IP cache.
|
|
27
|
+
|
|
28
|
+
## Container Map
|
|
29
|
+
|
|
30
|
+
A "container map" is included in the ink binary metadata before any instructions. It's an array in the following format:
|
|
31
|
+
|
|
32
|
+
32-bit instruction offset (offset_t)
|
|
33
|
+
32-bit container id (container_t)
|
|
34
|
+
|
|
35
|
+
The array is terminated with a 0xFFFFFFFF.
|
|
36
|
+
|
|
37
|
+
Each container has two entries in the array: one for its start and one for its end. There is no distinction between start and end in the array.
|
|
38
|
+
|
|
39
|
+
The "start" offset points to the instruction just after the {{START_CONTAINER_MARKER}} command. If you were to jump to it, you'd avoid hitting the {{START_CONTAINER_MARKER}} next step.
|
|
40
|
+
|
|
41
|
+
The "end" offset points to the instruction just after the {{END_CONTAINER_MARKER}} instruction. If you were to jump to it, you'd avoid hitting the {{END_CONTAINER_MARKER}} next step.
|
|
42
|
+
|
|
43
|
+
The container map is used for handling visit counts that result from an interpreter jump (caused by a {{DIVERT}} or selecting a choice). In normal execution, the {{START_CONTAINER_MARKER}} and {{END_CONTAINER_MARKER}} are pushing/popping container indicies and updating visit counts. If we jump, we're passing over all these commands. We need a way of both updating the visit counts (for each new container we enter) and updating our own container stack so the interpreter knows where it is in the container hierarchy.
|
|
44
|
+
|
|
45
|
+
### Jump Algorithm
|
|
46
|
+
|
|
47
|
+
1. Determine if we are jumping forward (dest > ip) or backward (ip < dest)
|
|
48
|
+
2. Linear search the container map, starting from the beginning for a forward jump or the end for a backward jump
|
|
49
|
+
* Find the entry just "before" the current pointer.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
### Special: "Falling Through" Diverts
|
|
53
|
+
|
|
54
|
+
TODO: Can we simplify jump algorithm here? Are there certain guarantees?
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
[##](##) general construction:
|
|
2
|
+
|
|
3
|
+
+ A list is a bit vector!
|
|
4
|
+
+ Further we will call each bit vector which represents a list a _flag_.
|
|
5
|
+
+ Each flag is tide to a number, which is equal to the position in the bit vector, which we will call _flag value_
|
|
6
|
+
+ Each flag has a string representation, further be called _key_.
|
|
7
|
+
+ Each multi list is associated to zero ore more list types
|
|
8
|
+
+ when adding a new element the list type of that element get added to associated lists
|
|
9
|
+
+ when removing the last element of an list type then the type get removed from associated lists
|
|
10
|
+
+ __except:__ the list of associated types will be empty, than nothing happen
|
|
11
|
+
+ -> only an empty initialized list has no d list
|
|
12
|
+
+ each list key will be an element variable at global scope -> no two keys can have the same name
|
|
13
|
+
+ a list_type is a variable defined with `LIST` therefore mentioned in the `declList` section of the InkJson
|
|
14
|
+
|
|
15
|
+
## List operators
|
|
16
|
+
|
|
17
|
+
+ `+(list lh,list rh)` lh = lh ∪ rh
|
|
18
|
+
+ `+(list, fag)` add the element to the list
|
|
19
|
+
+ `L^(list lh, flag rh)` (interesection) creates an empty list or a list with rh set if it's part of lh
|
|
20
|
+
+ `L^(list lh, list rh)` (interesection) = lh ∩ rh
|
|
21
|
+
+ `-(list lh, list rh)` remove elements lh = lh / (lh ∩ rh)
|
|
22
|
+
+ `-(list lh, flag rh)` removes element from list
|
|
23
|
+
+ `+(list l, int i)` l << i (bits get shifted out)
|
|
24
|
+
+ `-(list l, int i)` l >> i (bits get shifted out)
|
|
25
|
+
+ `LIST_COUNT(list l)` returns the number of flags sets
|
|
26
|
+
+ `LIST_MIN(list l)` returns the flag with the lowest numerical representation which is set
|
|
27
|
+
+ `LIST_MAX(list l)` return the flag with the highest numerical representation which is set
|
|
28
|
+
+ `lrnd(list l)` return a random flag which is set
|
|
29
|
+
+ for the user it is `LIST_RANDOM`, but in InkJson it is called `lrnd`
|
|
30
|
+
+ `LIST_ALL(list l)` returns a list which all elements of associated list of l
|
|
31
|
+
+ `LIST_INVERT(list l)` returns a list which each flag is toggeld of all associated lists
|
|
32
|
+
+ `<(list lh, list rh)` return true if `LIST_MAX(lh) < LIST_MIN(rh)`
|
|
33
|
+
+ `>(list lh, list rh)` returns true if `LIST_MIN(lh) > LIST_MAX(rh)`
|
|
34
|
+
+ `==(list lh, list rh)` returns true if the setted flags of both are equal
|
|
35
|
+
+ `!=(list lh, list rh)` return true if `lh == rh` returns false
|
|
36
|
+
+ `>=(list lh, list rh)` returns true if `LIST_MAX(lh) >= LIST_MAX(rh) && LIST_MIN(lh) >= LIST_MIN(rh)`
|
|
37
|
+
+ `<=(list lh, list rh)` returns true if `LIST_MAX(lh) <= LIST_MAX(rh) && LIST_MIN(lh) <= LIST_MIN(rh)`
|
|
38
|
+
+ `?(list lh, entry rh)` returns true if rh is element of lh
|
|
39
|
+
+ `?(list lh, list rh)` returns true if every flag of rh is set in lh
|
|
40
|
+
+ `!?(list lh, entry rh)` returns `not ?(lh,rh)`
|
|
41
|
+
+ `!?(list lh, list rh)` returns `not ? (lh,rh)`
|
|
42
|
+
|
|
43
|
+
## Datatype
|
|
44
|
+
|
|
45
|
+
+ Each list has a id(`listId`), this mapping is arbitrary. To allow usage as array index we start with 0 an increased it for each list_type
|
|
46
|
+
+ A flag is identified by `flagId`, it's correspond to the flag value. (flagId - min flagId of that list = flag value)
|
|
47
|
+
|
|
48
|
+
### list_element
|
|
49
|
+
|
|
50
|
+
`uint32_t` with bit[0-15] are the listId and bit[16-31] the flag value.
|
|
51
|
+
|
|
52
|
+
### list
|
|
53
|
+
|
|
54
|
+
`uint32_t` position in list_table
|
|
55
|
+
|
|
56
|
+
### list_table
|
|
57
|
+
|
|
58
|
+
Datatype to manage lists (similar to string_table)
|
|
59
|
+
|
|
60
|
+
It contains:
|
|
61
|
+
|
|
62
|
+
+ a reference to the string_table
|
|
63
|
+
+ A array `keys` which maps each flagId to an key, who lives in string_table
|
|
64
|
+
+ A array `flag_start` which maps each listId to an offset, which leads to value 0 for that list in the entry bitmap.
|
|
65
|
+
+ A array `fids` which maps each listId to the flagId for the value 0 of that list (used to get key from keys).
|
|
66
|
+
+ A array of entries, each entry contains:
|
|
67
|
+
+ a bitmap, where 1 represent that the list is associated to the corresponding list
|
|
68
|
+
+ a bitmap, where 1 represent that the list contains the flag
|
|
69
|
+
+ the two bitmaps are WORD align for better memory access
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Operations are everything which works only on the evaluation stack!
|
|
2
|
+
(eg. ADD, NOT, EQUAL, etc.)
|
|
3
|
+
|
|
4
|
+
To use them include `executioner.h`, this will take care of including the other
|
|
5
|
+
needed header in the correct order.
|
|
6
|
+
|
|
7
|
+
The `executioner` need to instantiation time all resources needed for all
|
|
8
|
+
supported operations (a string_table for now).
|
|
9
|
+
|
|
10
|
+
Then you can execute a command with the call operator of the `executioner`.
|
|
11
|
+
`void operator()(Command, eval_stack&)`
|
|
12
|
+
|
|
13
|
+
The executioner then iterates through a compile time created and optimization
|
|
14
|
+
list of all types. To determine how many arguments needed
|
|
15
|
+
(with `size_t command_num_args(Command)`) and then finds the matching operator
|
|
16
|
+
for the value type.
|
|
17
|
+
|
|
18
|
+
Type casting is solved with a cast matrix, where each entry is defined with:
|
|
19
|
+
`template<> constexpr value_type cast<value_type,value_type> = value_type`
|
|
20
|
+
`template<> constexpr value_type cast<t1,t2> = resulting_type`
|
|
21
|
+
|
|
22
|
+
! At the moment we must ensure that `(int)(t1) < (int)(t2)`!
|
|
23
|
+
|
|
24
|
+
The gain:
|
|
25
|
+
|
|
26
|
+
* Operation handling can be separated in different files
|
|
27
|
+
(`numeric_operations.h, string_operations.h`). The value class only knows what
|
|
28
|
+
data it contains, and not how to handle it => adding new types or operators
|
|
29
|
+
is know possible without changing many `switch cases`.
|
|
30
|
+
* Values are acquired with `get<value_type>()` witch allows changing type
|
|
31
|
+
without breaking unnoticed code.
|
|
32
|
+
* Not one huge file.
|
|
33
|
+
* The `executioner` knows the resources for the operations
|
|
34
|
+
=> no need to pass a string_table to each add.
|
|
35
|
+
* everything is without virtualisation => no/negligible runtime overhead.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Tags are accessible via runner functions:
|
|
2
|
+
|
|
3
|
+
- `bool has_tags()` are there any tags now?
|
|
4
|
+
- `size_t num_tags()` how many tags are there right now?
|
|
5
|
+
- `const char* get_tag(size_t i)` get string value of tag
|
|
6
|
+
|
|
7
|
+
Tags are acquired until a choice appears. After choosing the acquired tags will
|
|
8
|
+
be cleared.
|
|
9
|
+
```
|
|
10
|
+
# Tag1
|
|
11
|
+
# Tag 2
|
|
12
|
+
Some Text # Tag3
|
|
13
|
+
* A # Tag 4
|
|
14
|
+
* B # Tag 5
|
|
15
|
+
- out # Tag6
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Will produce:
|
|
19
|
+
> Some Text: Tag1, Tag2, Tag3
|
|
20
|
+
> * A
|
|
21
|
+
> * B
|
|
22
|
+
> <1
|
|
23
|
+
> A
|
|
24
|
+
> out: Tag4, Tag6
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
In which I figure out what in the nine fucks ink is doing to whitespace so I can emulate it.
|
|
2
|
+
|
|
3
|
+
There seem to be _numerous_ places in which ink deals with whitespace so I will just document each here and try to figure out what they're doing and why.
|
|
4
|
+
|
|
5
|
+
# Push To Output Stream
|
|
6
|
+
|
|
7
|
+
Ink processes whitespace in strings as they are added to the output stream. See _PushToOutputStream_ and _PushToOutputStreamIndividual_ in StoryState.cs.
|
|
8
|
+
|
|
9
|
+
## PushToOutputStream
|
|
10
|
+
|
|
11
|
+
Calls _TrySplittingHeadTailWhitespace_ on incoming strings in case they contain newlines. I'm not really sure *how* this could happen since newlines are split off by the Ink compiler already. How could a newline possibly be in an incoming string? I guess maybe if it's stored in a variable? Seems like quite the edge case.
|
|
12
|
+
|
|
13
|
+
DECISION: NOT IMPLEMENTING. Will review if the case comes up.
|
|
14
|
+
|
|
15
|
+
After running this split, the split strings are sent to _PushToOutputStreamIndividual_.
|
|
16
|
+
|
|
17
|
+
## PushToOutputStreamIndividual
|
|
18
|
+
|
|
19
|
+
Lots going on here.
|
|
20
|
+
|
|
21
|
+
First, if the incoming element is glue, trim newlines from the output stream.
|
|
22
|
+
|
|
23
|
+
ALREADY IMPLEMENTED. See *basic_stream::append(const data&)*.
|
|
24
|
+
|
|
25
|
+
Otherwise, for text:
|
|
26
|
+
|
|
27
|
+
1. We trim whitespace at the _beginning_ and _ending_ of function calls (not tunnels). This is made more complicated by glue.
|
|
28
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
import shutil
|
|
6
|
+
|
|
7
|
+
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
8
|
+
PATH = os.path.join(ROOT, 'deps', 'inkcpp', 'inkcpp_cl')
|
|
9
|
+
ARGS = ["inkcpp_cl", "--ommit-choice-tags", "-p"] + sys.argv[1:]
|
|
10
|
+
os.execv(PATH, ARGS)
|
|
11
|
+
sleep(2)
|
|
12
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "inkcpp-py"
|
|
3
|
+
readme = "README.md"
|
|
4
|
+
license = { file = "LICENSE.txt" }
|
|
5
|
+
keywords = ["ink", "inkpp", "inklecate"]
|
|
6
|
+
dynamic = ["version", "description", "authors", "requires-python"]
|
|
7
|
+
|
|
8
|
+
[project.urls]
|
|
9
|
+
Repository = "https://github.com/JBenda/inkcpp.git"
|
|
10
|
+
Issues = "https://github.com/JBenda/inkcpp/issues"
|
|
11
|
+
|
|
12
|
+
[build-system]
|
|
13
|
+
requires = [
|
|
14
|
+
"setuptools>=42",
|
|
15
|
+
"wheel",
|
|
16
|
+
"ninja",
|
|
17
|
+
"cmake>=3.16",
|
|
18
|
+
]
|
|
19
|
+
build-backend = "setuptools.build_meta"
|
|
20
|
+
|
|
21
|
+
[tool.mypy]
|
|
22
|
+
files = "setup.py"
|
|
23
|
+
python_version = "3.7"
|
|
24
|
+
strict = true
|
|
25
|
+
show_error_codes = true
|
|
26
|
+
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
|
|
27
|
+
warn_unreachable = true
|
|
28
|
+
|
|
29
|
+
[[tool.mypy.overrides]]
|
|
30
|
+
module = ["ninja"]
|
|
31
|
+
ignore_missing_imports = true
|
|
32
|
+
|
|
33
|
+
[tool.pytest.ini_options]
|
|
34
|
+
# minversion = "6.0"
|
|
35
|
+
# addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
|
|
36
|
+
# xfail_strict = true
|
|
37
|
+
# filterwarnings = [
|
|
38
|
+
# "error",
|
|
39
|
+
# "ignore:(ast.Str|Attribute s|ast.NameConstant|ast.Num) is deprecated:DeprecationWarning:_pytest",
|
|
40
|
+
# ]
|
|
41
|
+
testpaths = ["inkcpp_py/tests"]
|
|
42
|
+
addopts = [
|
|
43
|
+
"--import-mode=importlib",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
# [tool.cibuildwheel]
|
|
47
|
+
# test-command = "pytest {project}/tests"
|
|
48
|
+
# test-extras = ["test"]
|
|
49
|
+
# test-skip = ["*universal2:arm64"]
|
|
50
|
+
# Setuptools bug causes collision between pypy and cpython artifacts
|
|
51
|
+
# before-build = "rm -rf {project}/build"
|
|
52
|
+
|
|
53
|
+
[tool.ruff]
|
|
54
|
+
target-version = "py37"
|
|
55
|
+
|
|
56
|
+
[tool.ruff.lint]
|
|
57
|
+
extend-select = [
|
|
58
|
+
"B", # flake8-bugbear
|
|
59
|
+
"I", # isort
|
|
60
|
+
"PGH", # pygrep-hooks
|
|
61
|
+
"RUF", # Ruff-specific
|
|
62
|
+
"UP", # pyupgrade
|
|
63
|
+
]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# based on https://github.com/pybind/cmake_example/blob/master/setup.py
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
import sys
|
|
6
|
+
import subprocess
|
|
7
|
+
import glob
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from setuptools import Extension, setup
|
|
11
|
+
from setuptools.command.build_ext import build_ext
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# echo "[\n$(find shared/** inkcpp/** inkcpp_compiler/** inkcpp_py/** -not -path '*/.*' | tr '\n' ' ' | sed -e 's/[^ ]\+/"\0"/g' -e 's/[[:blank:]]*$//' -e 's/ /,\n/g')\n]"
|
|
15
|
+
# + "CMakeLists.txt"
|
|
16
|
+
|
|
17
|
+
# Convert distutils Windows platform specifiers to CMake -A arguments
|
|
18
|
+
PLAT_TO_CMAKE = {
|
|
19
|
+
"win32": "Win32",
|
|
20
|
+
"win-amd64": "x64",
|
|
21
|
+
"win-arm32": "ARM",
|
|
22
|
+
"win-arm64": "ARM64",
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
def src_files(dir):
|
|
26
|
+
dir = os.fsencode(dir)
|
|
27
|
+
files = []
|
|
28
|
+
for file in os.listdir(dir):
|
|
29
|
+
if file[0] == '.':
|
|
30
|
+
continue
|
|
31
|
+
file = os.path.join(dir, file)
|
|
32
|
+
if os.path.isdir(file):
|
|
33
|
+
files += src_files(file)
|
|
34
|
+
else:
|
|
35
|
+
files.append(file.decode("utf-8"))
|
|
36
|
+
return files
|
|
37
|
+
|
|
38
|
+
def glob_src_files():
|
|
39
|
+
files = []
|
|
40
|
+
dirs = ['./inkcpp', './inkcpp_compiler', './inkcpp_py', './shared']
|
|
41
|
+
for dir in dirs:
|
|
42
|
+
files += src_files(dir)
|
|
43
|
+
return files
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class CMakeExtension(Extension):
|
|
47
|
+
def __init__(self, name: str, sourcedir: str = "") -> None:
|
|
48
|
+
src_files = glob_src_files()
|
|
49
|
+
# src_files = json.load(open('inkcpp_py/sources.json'))
|
|
50
|
+
src_files += ["CMakeLists.txt", "Config.cmake.in"]
|
|
51
|
+
super().__init__(name, sources=src_files)
|
|
52
|
+
self.sourcedir = os.fspath(Path(sourcedir).resolve())
|
|
53
|
+
|
|
54
|
+
class CMakeBuild(build_ext):
|
|
55
|
+
def build_extension(self, ext: CMakeExtension) -> None:
|
|
56
|
+
# Must be in this form due to bug in .resolve() only fixed in Python 3.10+
|
|
57
|
+
ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name)
|
|
58
|
+
extdir = ext_fullpath.parent.resolve()
|
|
59
|
+
|
|
60
|
+
# Using this requires trailing slash for auto-detection & inclusion of
|
|
61
|
+
# auxiliary "native" libs
|
|
62
|
+
|
|
63
|
+
debug = int(os.environ.get("DEBUG", 0)) if self.debug is None else self.debug
|
|
64
|
+
cfg = "Debug" if debug else "Release"
|
|
65
|
+
|
|
66
|
+
# CMake lets you override the generator - we need to check this.
|
|
67
|
+
# Can be set with Conda-Build, for example.
|
|
68
|
+
cmake_generator = os.environ.get("CMAKE_GENERATOR", "")
|
|
69
|
+
|
|
70
|
+
# Set Python_EXECUTABLE instead if you use PYBIND11_FINDPYTHON
|
|
71
|
+
# EXAMPLE_VERSION_INFO shows you how to pass a value into the C++ code
|
|
72
|
+
# from Python.
|
|
73
|
+
cmake_args = [
|
|
74
|
+
f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}{os.sep}",
|
|
75
|
+
f"-DPYTHON_EXECUTABLE={sys.executable}",
|
|
76
|
+
f"-DCMAKE_BUILD_TYPE={cfg}", # not used on MSVC, but no harm
|
|
77
|
+
f"-DINKCPP_PY=ON",
|
|
78
|
+
f"-DWHEEL_BUILD=ON",
|
|
79
|
+
]
|
|
80
|
+
build_args = [
|
|
81
|
+
f"--target=inkcpp_py",
|
|
82
|
+
]
|
|
83
|
+
# Adding CMake arguments set as environment variable
|
|
84
|
+
# (needed e.g. to build for ARM OSx on conda-forge)
|
|
85
|
+
if "CMAKE_ARGS" in os.environ:
|
|
86
|
+
cmake_args += [item for item in os.environ["CMAKE_ARGS"].split(" ") if item]
|
|
87
|
+
|
|
88
|
+
if self.compiler.compiler_type != "msvc":
|
|
89
|
+
# Using Ninja-build since it a) is available as a wheel and b)
|
|
90
|
+
# multithreads automatically. MSVC would require all variables be
|
|
91
|
+
# exported for Ninja to pick it up, which is a little tricky to do.
|
|
92
|
+
# Users can override the generator with CMAKE_GENERATOR in CMake
|
|
93
|
+
# 3.15+.
|
|
94
|
+
if not cmake_generator or cmake_generator == "Ninja":
|
|
95
|
+
try:
|
|
96
|
+
import ninja
|
|
97
|
+
|
|
98
|
+
ninja_executable_path = Path(ninja.BIN_DIR) / "ninja"
|
|
99
|
+
cmake_args += [
|
|
100
|
+
"-GNinja",
|
|
101
|
+
f"-DCMAKE_MAKE_PROGRAM:FILEPATH={ninja_executable_path}",
|
|
102
|
+
]
|
|
103
|
+
except ImportError:
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
else:
|
|
107
|
+
# Single config generators are handled "normally"
|
|
108
|
+
single_config = any(x in cmake_generator for x in {"NMake", "Ninja"})
|
|
109
|
+
|
|
110
|
+
# CMake allows an arch-in-generator style for backward compatibility
|
|
111
|
+
contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"})
|
|
112
|
+
|
|
113
|
+
# Specify the arch if using MSVC generator, but only if it doesn't
|
|
114
|
+
# contain a backward-compatibility arch spec already in the
|
|
115
|
+
# generator name.
|
|
116
|
+
if not single_config and not contains_arch:
|
|
117
|
+
cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]]
|
|
118
|
+
|
|
119
|
+
# Multi-config generators have a different way to specify configs
|
|
120
|
+
if not single_config:
|
|
121
|
+
cmake_args += [
|
|
122
|
+
f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{cfg.upper()}={extdir}"
|
|
123
|
+
]
|
|
124
|
+
build_args += ["--config", cfg]
|
|
125
|
+
|
|
126
|
+
if sys.platform.startswith("darwin"):
|
|
127
|
+
# Cross-compile support for macOS - respect ARCHFLAGS if set
|
|
128
|
+
archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", ""))
|
|
129
|
+
if archs:
|
|
130
|
+
cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))]
|
|
131
|
+
|
|
132
|
+
# Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level
|
|
133
|
+
# across all generators.
|
|
134
|
+
if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ:
|
|
135
|
+
# self.parallel is a Python 3 only way to set parallel jobs by hand
|
|
136
|
+
# using -j in the build_ext call, not supported by pip or PyPA-build.
|
|
137
|
+
if hasattr(self, "parallel") and self.parallel:
|
|
138
|
+
# CMake 3.12+ only.
|
|
139
|
+
build_args += [f"-j{self.parallel}"]
|
|
140
|
+
|
|
141
|
+
build_temp = Path(self.build_temp) / ext.name
|
|
142
|
+
if not build_temp.exists():
|
|
143
|
+
build_temp.mkdir(parents=True)
|
|
144
|
+
|
|
145
|
+
print([f for f in os.listdir(ext.sourcedir)])
|
|
146
|
+
print("'{}'".format(ext.sourcedir), cmake_args)
|
|
147
|
+
subprocess.run(
|
|
148
|
+
["cmake", ext.sourcedir, *cmake_args], cwd=build_temp, check=True
|
|
149
|
+
)
|
|
150
|
+
subprocess.run(
|
|
151
|
+
["cmake", "--build", ".", *build_args], cwd=build_temp, check=True
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
setup(
|
|
155
|
+
name="inkcpp-py",
|
|
156
|
+
version="0.1.6",
|
|
157
|
+
author="Julian Benda",
|
|
158
|
+
author_email="julian.benda@ovgu.de",
|
|
159
|
+
description="Python bindings for InkCPP a Inkle runtime written in C++",
|
|
160
|
+
long_description="For all issues and ideas please visit the repository at https://github.com/JBenda/inkcpp",
|
|
161
|
+
zip_safe=False,
|
|
162
|
+
ext_modules=[CMakeExtension("inkcpp_py")],
|
|
163
|
+
cmdclass={"build_ext": CMakeBuild},
|
|
164
|
+
python_requires=">=3.7",
|
|
165
|
+
py_modules=[],
|
|
166
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
add_library(inkcpp_shared INTERFACE)
|
|
2
|
+
|
|
3
|
+
target_include_directories(inkcpp_shared
|
|
4
|
+
INTERFACE
|
|
5
|
+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/public>
|
|
6
|
+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/private>
|
|
7
|
+
$<INSTALL_INTERFACE:inkcpp>
|
|
8
|
+
)
|
|
9
|
+
FILE(GLOB PUBLIC_HEADERS "public/*")
|
|
10
|
+
set_target_properties(inkcpp_shared PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")
|
|
11
|
+
|
|
12
|
+
# Unreal installation
|
|
13
|
+
install(DIRECTORY "public/" DESTINATION "inkcpp/Source/shared/Public" COMPONENT unreal EXCLUDE_FROM_ALL)
|
|
14
|
+
install(DIRECTORY "private/" DESTINATION "inkcpp/Source/shared/Private/" COMPONENT unreal EXCLUDE_FROM_ALL)
|