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.
Files changed (273) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +1 -0
  4. data/Gemfile +10 -0
  5. data/Gemfile.lock +84 -0
  6. data/LICENSE +7 -0
  7. data/README.md +3 -0
  8. data/Rakefile +16 -0
  9. data/bin/console +15 -0
  10. data/bin/setup +10 -0
  11. data/bin/tapioca +29 -0
  12. data/ext/inkcpp_rb/extconf.rb +19 -0
  13. data/ext/inkcpp_rb/inkcpp/.clang-format +99 -0
  14. data/ext/inkcpp_rb/inkcpp/.github/FUNDING.yml +1 -0
  15. data/ext/inkcpp_rb/inkcpp/.github/workflows/build.yml +344 -0
  16. data/ext/inkcpp_rb/inkcpp/.github/workflows/release.yml +49 -0
  17. data/ext/inkcpp_rb/inkcpp/.gitignore +25 -0
  18. data/ext/inkcpp_rb/inkcpp/.gitmodules +9 -0
  19. data/ext/inkcpp_rb/inkcpp/CMakeLists.txt +170 -0
  20. data/ext/inkcpp_rb/inkcpp/CODE_OF_CONDUCT.md +76 -0
  21. data/ext/inkcpp_rb/inkcpp/CONTRIBUTING.md +55 -0
  22. data/ext/inkcpp_rb/inkcpp/Config.cmake.in +2 -0
  23. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/CMakeLists.txt +13 -0
  24. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.c +38 -0
  25. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.cpp +40 -0
  26. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink +8 -0
  27. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink.json +1 -0
  28. data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example.zip +0 -0
  29. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/InkCPP_DEMO.zip +0 -0
  30. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/CreateThread.png +0 -0
  31. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/HandleChoice.png +0 -0
  32. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ListElementOf.png +0 -0
  33. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalRuntime.png +0 -0
  34. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalThread.png +0 -0
  35. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ObseverChange.png +0 -0
  36. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/TagListGetValue.png +0 -0
  37. data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/YieldResume.png +0 -0
  38. data/ext/inkcpp_rb/inkcpp/Doxyfile +2825 -0
  39. data/ext/inkcpp_rb/inkcpp/LICENSE.txt +22 -0
  40. data/ext/inkcpp_rb/inkcpp/Minimal.runsettings +8 -0
  41. data/ext/inkcpp_rb/inkcpp/README.md +192 -0
  42. data/ext/inkcpp_rb/inkcpp/inkcpp/CMakeLists.txt +67 -0
  43. data/ext/inkcpp_rb/inkcpp/inkcpp/array.h +481 -0
  44. data/ext/inkcpp_rb/inkcpp/inkcpp/avl_array.h +833 -0
  45. data/ext/inkcpp_rb/inkcpp/inkcpp/casting.h +93 -0
  46. data/ext/inkcpp_rb/inkcpp/inkcpp/choice.cpp +54 -0
  47. data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.cpp +124 -0
  48. data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.h +406 -0
  49. data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.cpp +52 -0
  50. data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.h +34 -0
  51. data/ext/inkcpp_rb/inkcpp/inkcpp/executioner.h +179 -0
  52. data/ext/inkcpp_rb/inkcpp/inkcpp/functional.cpp +86 -0
  53. data/ext/inkcpp_rb/inkcpp/inkcpp/functions.cpp +54 -0
  54. data/ext/inkcpp_rb/inkcpp/inkcpp/functions.h +40 -0
  55. data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.cpp +289 -0
  56. data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.h +149 -0
  57. data/ext/inkcpp_rb/inkcpp/inkcpp/header.cpp +44 -0
  58. data/ext/inkcpp_rb/inkcpp/inkcpp/include/choice.h +106 -0
  59. data/ext/inkcpp_rb/inkcpp/inkcpp/include/functional.h +327 -0
  60. data/ext/inkcpp_rb/inkcpp/inkcpp/include/globals.h +196 -0
  61. data/ext/inkcpp_rb/inkcpp/inkcpp/include/list.h +187 -0
  62. data/ext/inkcpp_rb/inkcpp/inkcpp/include/runner.h +291 -0
  63. data/ext/inkcpp_rb/inkcpp/inkcpp/include/snapshot.h +61 -0
  64. data/ext/inkcpp_rb/inkcpp/inkcpp/include/story.h +219 -0
  65. data/ext/inkcpp_rb/inkcpp/inkcpp/include/story_ptr.h +233 -0
  66. data/ext/inkcpp_rb/inkcpp/inkcpp/include/traits.h +270 -0
  67. data/ext/inkcpp_rb/inkcpp/inkcpp/include/types.h +169 -0
  68. data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.cpp +79 -0
  69. data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.h +39 -0
  70. data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.cpp +276 -0
  71. data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.h +356 -0
  72. data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.cpp +841 -0
  73. data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.h +450 -0
  74. data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.cpp +40 -0
  75. data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.h +529 -0
  76. data/ext/inkcpp_rb/inkcpp/inkcpp/operation_bases.h +164 -0
  77. data/ext/inkcpp_rb/inkcpp/inkcpp/operations.h +100 -0
  78. data/ext/inkcpp_rb/inkcpp/inkcpp/output.cpp +528 -0
  79. data/ext/inkcpp_rb/inkcpp/inkcpp/output.h +153 -0
  80. data/ext/inkcpp_rb/inkcpp/inkcpp/platform.h +22 -0
  81. data/ext/inkcpp_rb/inkcpp/inkcpp/random.h +38 -0
  82. data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.cpp +1396 -0
  83. data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.h +336 -0
  84. data/ext/inkcpp_rb/inkcpp/inkcpp/simple_restorable_stack.h +335 -0
  85. data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.cpp +182 -0
  86. data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.h +91 -0
  87. data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_interface.h +57 -0
  88. data/ext/inkcpp_rb/inkcpp/inkcpp/stack.cpp +618 -0
  89. data/ext/inkcpp_rb/inkcpp/inkcpp/stack.h +243 -0
  90. data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.cpp +361 -0
  91. data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.h +92 -0
  92. data/ext/inkcpp_rb/inkcpp/inkcpp/story_ptr.cpp +75 -0
  93. data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.cpp +125 -0
  94. data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.h +67 -0
  95. data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.cpp +149 -0
  96. data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.h +47 -0
  97. data/ext/inkcpp_rb/inkcpp/inkcpp/string_utils.h +207 -0
  98. data/ext/inkcpp_rb/inkcpp/inkcpp/system.cpp +39 -0
  99. data/ext/inkcpp_rb/inkcpp/inkcpp/tuple.hpp +151 -0
  100. data/ext/inkcpp_rb/inkcpp/inkcpp/value.cpp +279 -0
  101. data/ext/inkcpp_rb/inkcpp/inkcpp/value.h +666 -0
  102. data/ext/inkcpp_rb/inkcpp/inkcpp_c/CMakeLists.txt +62 -0
  103. data/ext/inkcpp_rb/inkcpp/inkcpp_c/include/inkcpp.h +393 -0
  104. data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp.cpp +344 -0
  105. data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp_c.pc.in +10 -0
  106. data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/ExternalFunction.c +56 -0
  107. data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Globals.c +98 -0
  108. data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Lists.c +73 -0
  109. data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Observer.c +36 -0
  110. data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Snapshot.c +65 -0
  111. data/ext/inkcpp_rb/inkcpp/inkcpp_cl/CMakeLists.txt +49 -0
  112. data/ext/inkcpp_rb/inkcpp/inkcpp_cl/inkcpp_cl.cpp +215 -0
  113. data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.cpp +209 -0
  114. data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.h +8 -0
  115. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/CMakeLists.txt +37 -0
  116. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.cpp +446 -0
  117. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.h +70 -0
  118. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.cpp +166 -0
  119. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.h +79 -0
  120. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/command.cpp +107 -0
  121. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/compiler.cpp +96 -0
  122. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.cpp +62 -0
  123. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.h +104 -0
  124. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compilation_results.h +22 -0
  125. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compiler.h +44 -0
  126. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json.hpp +24596 -0
  127. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.cpp +411 -0
  128. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.h +62 -0
  129. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.cpp +47 -0
  130. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.h +70 -0
  131. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.cpp +107 -0
  132. data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.h +55 -0
  133. data/ext/inkcpp_rb/inkcpp/inkcpp_py/CMakeLists.txt +19 -0
  134. data/ext/inkcpp_rb/inkcpp/inkcpp_py/example.py +78 -0
  135. data/ext/inkcpp_rb/inkcpp/inkcpp_py/src/module.cpp +317 -0
  136. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/conftest.py +53 -0
  137. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_ExternalFunctions.py +35 -0
  138. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Globals.py +40 -0
  139. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Lists.py +43 -0
  140. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Observer.py +27 -0
  141. data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Snapshot.py +57 -0
  142. data/ext/inkcpp_rb/inkcpp/inkcpp_py/unreal_example.ink +71 -0
  143. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Array.cpp +115 -0
  144. data/ext/inkcpp_rb/inkcpp/inkcpp_test/CMakeLists.txt +117 -0
  145. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Callstack.cpp +392 -0
  146. data/ext/inkcpp_rb/inkcpp/inkcpp_test/EmptyStringForDivert.cpp +36 -0
  147. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ExternalFunctionsExecuteProperly.cpp +34 -0
  148. data/ext/inkcpp_rb/inkcpp/inkcpp_test/FallbackFunction.cpp +77 -0
  149. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Globals.cpp +73 -0
  150. data/ext/inkcpp_rb/inkcpp/inkcpp_test/InkyJson.cpp +34 -0
  151. data/ext/inkcpp_rb/inkcpp/inkcpp_test/LabelCondition.cpp +60 -0
  152. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Lists.cpp +144 -0
  153. data/ext/inkcpp_rb/inkcpp/inkcpp_test/LookaheadSafe.cpp +46 -0
  154. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Main.cpp +7 -0
  155. data/ext/inkcpp_rb/inkcpp/inkcpp_test/MoveTo.cpp +95 -0
  156. data/ext/inkcpp_rb/inkcpp/inkcpp_test/NewLines.cpp +76 -0
  157. data/ext/inkcpp_rb/inkcpp/inkcpp_test/NoEarlyTags.cpp +33 -0
  158. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Observer.cpp +245 -0
  159. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Pointer.cpp +191 -0
  160. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Restorable.cpp +294 -0
  161. data/ext/inkcpp_rb/inkcpp/inkcpp_test/SpaceAfterBracketChoice.cpp +45 -0
  162. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Stack.cpp +224 -0
  163. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Tags.cpp +131 -0
  164. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ThirdTierChoiceAfterBrackets.cpp +38 -0
  165. data/ext/inkcpp_rb/inkcpp/inkcpp_test/UTF8.cpp +56 -0
  166. data/ext/inkcpp_rb/inkcpp/inkcpp_test/Value.cpp +210 -0
  167. data/ext/inkcpp_rb/inkcpp/inkcpp_test/catch.hpp +17970 -0
  168. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/AHF.ink +7 -0
  169. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ChoiceBracketStory.ink +7 -0
  170. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/EmptyStringForDivert.ink +13 -0
  171. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ExternalFunctionsExecuteProperly.ink +11 -0
  172. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/FallBack.ink +15 -0
  173. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/GlobalStory.ink +9 -0
  174. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LabelConditionStory.ink +5 -0
  175. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LinesStory.ink +42 -0
  176. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListLogicStory.ink +40 -0
  177. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListStory.ink +8 -0
  178. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LookaheadSafe.ink +14 -0
  179. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/MoveTo.ink +36 -0
  180. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/NoEarlyTags.ink +19 -0
  181. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ObserverStory.ink +8 -0
  182. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/SimpleStoryFlow.ink +65 -0
  183. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TagsStory.ink +22 -0
  184. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TheIntercept.ink +1686 -0
  185. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ThirdTierChoiceAfterBracketsStory.ink +13 -0
  186. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF-8-demo.txt +212 -0
  187. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF8Story.ink +218 -0
  188. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inklecate.json +154 -0
  189. data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inky.json +160 -0
  190. data/ext/inkcpp_rb/inkcpp/notes/ArchitectureNotes.md +54 -0
  191. data/ext/inkcpp_rb/inkcpp/notes/ListNotes.md +69 -0
  192. data/ext/inkcpp_rb/inkcpp/notes/OperationNotes.md +35 -0
  193. data/ext/inkcpp_rb/inkcpp/notes/TagsNotes.md +24 -0
  194. data/ext/inkcpp_rb/inkcpp/notes/WhitespaceNotes.md +28 -0
  195. data/ext/inkcpp_rb/inkcpp/proofing/README.md +3 -0
  196. data/ext/inkcpp_rb/inkcpp/proofing/inkcpp_runtime_driver +12 -0
  197. data/ext/inkcpp_rb/inkcpp/pyproject.toml +63 -0
  198. data/ext/inkcpp_rb/inkcpp/setup.py +166 -0
  199. data/ext/inkcpp_rb/inkcpp/shared/CMakeLists.txt +14 -0
  200. data/ext/inkcpp_rb/inkcpp/shared/private/command.h +172 -0
  201. data/ext/inkcpp_rb/inkcpp/shared/private/header.h +46 -0
  202. data/ext/inkcpp_rb/inkcpp/shared/public/config.h +53 -0
  203. data/ext/inkcpp_rb/inkcpp/shared/public/system.h +307 -0
  204. data/ext/inkcpp_rb/inkcpp/shared/public/version.h +14 -0
  205. data/ext/inkcpp_rb/inkcpp/tests/TestAllSequenceTypes.ink +59 -0
  206. data/ext/inkcpp_rb/inkcpp/tests/TestArithmetic.ink +17 -0
  207. data/ext/inkcpp_rb/inkcpp/tests/TestBasicStringLiterals.ink +8 -0
  208. data/ext/inkcpp_rb/inkcpp/tests/TestBasicTunnel.ink +10 -0
  209. data/ext/inkcpp_rb/inkcpp/tests/TestBlanksInInlineSequences.ink +51 -0
  210. data/ext/inkcpp_rb/inkcpp/tests/TestCallStackEvaluation.ink +15 -0
  211. data/ext/inkcpp_rb/inkcpp/tests/TestChoiceCount.ink +15 -0
  212. data/ext/inkcpp_rb/inkcpp/tests/TestChoiceDivertsToDone.ink +6 -0
  213. data/ext/inkcpp_rb/inkcpp/tests/TestChoiceWithBracketsOnly.ink +9 -0
  214. data/ext/inkcpp_rb/inkcpp/tests/TestCompareDivertTargets.ink +26 -0
  215. data/ext/inkcpp_rb/inkcpp/tests/TestComplexTunnels.ink +22 -0
  216. data/ext/inkcpp_rb/inkcpp/tests/TestConditionalChoiceInWeave.ink +19 -0
  217. data/ext/inkcpp_rb/inkcpp/tests/TestTunnelOnwardsAfterTunnel.ink +17 -0
  218. data/ext/inkcpp_rb/inkcpp/unreal/CMakeLists.txt +51 -0
  219. data/ext/inkcpp_rb/inkcpp/unreal/UE_example.ink +92 -0
  220. data/ext/inkcpp_rb/inkcpp/unreal/blueprint_filter.js +377 -0
  221. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Resources/Icon128.png +0 -0
  222. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkAsset.cpp +47 -0
  223. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkChoice.cpp +40 -0
  224. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkList.cpp +86 -0
  225. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkRuntime.cpp +265 -0
  226. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkThread.cpp +239 -0
  227. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkVar.cpp +143 -0
  228. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/TagList.cpp +95 -0
  229. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/inkcpp.cpp +13 -0
  230. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkAsset.h +50 -0
  231. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkChoice.h +58 -0
  232. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkDelegates.h +139 -0
  233. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkList.h +102 -0
  234. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkRuntime.h +177 -0
  235. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkSnapshot.h +30 -0
  236. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkThread.h +215 -0
  237. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkVar.h +245 -0
  238. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/TagList.h +77 -0
  239. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/inkcpp.h +217 -0
  240. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/inkcpp.Build.cs +62 -0
  241. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.cpp +237 -0
  242. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.h +43 -0
  243. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inkcpp_editor.cpp +13 -0
  244. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inklecate_cmd.cpp.in +24 -0
  245. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Public/inkcpp_editor.h +9 -0
  246. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/inkcpp_editor.Build.cs +61 -0
  247. data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/inkcpp.uplugin +44 -0
  248. data/ext/inkcpp_rb/inkcpp/unreal/render.css +1 -0
  249. data/ext/inkcpp_rb/inkcpp_rb.cpp +321 -0
  250. data/inkcpp_rb.gemspec +54 -0
  251. data/rbi/inkcpp_rb.rbi +211 -0
  252. data/sorbet/config +4 -0
  253. data/sorbet/rbi/annotations/.gitattributes +1 -0
  254. data/sorbet/rbi/annotations/minitest.rbi +119 -0
  255. data/sorbet/rbi/gems/.gitattributes +1 -0
  256. data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
  257. data/sorbet/rbi/gems/erubi@1.13.1.rbi +155 -0
  258. data/sorbet/rbi/gems/minitest@5.25.4.rbi +1547 -0
  259. data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
  260. data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
  261. data/sorbet/rbi/gems/prism@1.3.0.rbi +40040 -0
  262. data/sorbet/rbi/gems/rake-compiler@1.2.8.rbi +9 -0
  263. data/sorbet/rbi/gems/rake@13.2.1.rbi +3033 -0
  264. data/sorbet/rbi/gems/rbi@0.2.2.rbi +4527 -0
  265. data/sorbet/rbi/gems/rice@4.3.3.rbi +44 -0
  266. data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
  267. data/sorbet/rbi/gems/tapioca@0.16.7.rbi +3611 -0
  268. data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
  269. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
  270. data/sorbet/rbi/gems/yard@0.9.37.rbi +18379 -0
  271. data/sorbet/tapioca/config.yml +13 -0
  272. data/sorbet/tapioca/require.rb +4 -0
  273. metadata +400 -0
@@ -0,0 +1,833 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright
3
+ // \author (c) Marco Paland (info@paland.com)
4
+ // 2017, PALANDesign Hannover, Germany
5
+ //
6
+ // \license The MIT License (MIT)
7
+ //
8
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ // of this software and associated documentation files (the "Software"), to deal
10
+ // in the Software without restriction, including without limitation the rights
11
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ // copies of the Software, and to permit persons to whom the Software is
13
+ // furnished to do so, subject to the following conditions:
14
+ //
15
+ // The above copyright notice and this permission notice shall be included in
16
+ // all copies or substantial portions of the Software.
17
+ //
18
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ // THE SOFTWARE.
25
+ //
26
+ // \brief avl_array class
27
+ // This is an AVL tree implementation using an array as data structure.
28
+ // avl_array combines the insert/delete and find advantages (log n) of an AVL tree
29
+ // with a static allocated arrays and minimal storage overhead.
30
+ // If memory is critical the 'Fast' template parameter can be set to false which
31
+ // removes the parent member of every node. This saves sizeof(size_type) * Size bytes,
32
+ // but slowes down the insert and delete operation by factor 10 due to 'parent search'.
33
+ // The find opeartion is not affected cause finding doesn't need a parent.
34
+ //
35
+ // usage:
36
+ // #include "avl_array.h"
37
+ // avl_array<int, int, int, 1024> avl;
38
+ // avl.insert(1, 1);
39
+ //
40
+ ///////////////////////////////////////////////////////////////////////////////
41
+
42
+ #ifndef _AVL_ARRAY_H_
43
+ #define _AVL_ARRAY_H_
44
+
45
+ #include "system.h"
46
+
47
+ #include <cstdint>
48
+
49
+
50
+ /**
51
+ * \param Key The key type. The type (class) must provide a 'less than' and 'equal to' operator
52
+ * \param T The Data type
53
+ * \param size_type Container size type
54
+ * \param Size Container size
55
+ * \param Fast If true every node stores an extra parent index. This increases memory but speed up insert/erase by factor 10
56
+ */
57
+ template<typename Key, typename T, typename size_type, const size_type Size, const bool Fast = true>
58
+ class avl_array
59
+ {
60
+ // child index pointer class
61
+ typedef struct tag_child_type {
62
+ size_type left;
63
+ size_type right;
64
+ } child_type;
65
+
66
+ // node storage, due to possible structure packing effects, single arrays are used instead of a 'node' structure
67
+ Key key_[Size]; // node key
68
+ T val_[Size]; // node value
69
+ std::int8_t balance_[Size]; // subtree balance
70
+ child_type child_[Size]; // node childs
71
+ size_type size_; // actual size
72
+ size_type root_; // root node
73
+ size_type parent_[Fast ? Size : 1]; // node parent, use one element if not needed (zero sized array is not allowed)
74
+
75
+ // invalid index (like 'nullptr' in a pointer implementation)
76
+ static const size_type INVALID_IDX = Size;
77
+
78
+ // iterator class
79
+ template<bool Const>
80
+ class tag_avl_array_iterator
81
+ {
82
+ template<bool Con, typename T1, typename T2>
83
+ using if_t = ink::runtime::internal::if_t<Con, T1, T2>;
84
+ if_t<Const, const avl_array*, avl_array*>
85
+ instance_; // array instance
86
+ size_type idx_; // actual node
87
+
88
+ friend avl_array; // avl_array may access index pointer
89
+
90
+ public:
91
+
92
+ // ctor
93
+ tag_avl_array_iterator(if_t<Const, const avl_array*,avl_array*> instance = nullptr, size_type idx = 0U)
94
+ : instance_(instance)
95
+ , idx_(idx)
96
+ { }
97
+
98
+ template<bool C = Const, typename = ink::runtime::internal::enable_if_t<C>>
99
+ tag_avl_array_iterator(const tag_avl_array_iterator<false>& itr)
100
+ : instance_(itr.instance_)
101
+ , idx_(itr.idx_)
102
+ {}
103
+
104
+ inline tag_avl_array_iterator& operator=(const tag_avl_array_iterator& other)
105
+ {
106
+ instance_ = other.instance_;
107
+ idx_ = other.idx_;
108
+ return *this;
109
+ }
110
+
111
+ inline bool operator==(const tag_avl_array_iterator& rhs) const
112
+ { return idx_ == rhs.idx_; }
113
+
114
+ inline bool operator!=(const tag_avl_array_iterator& rhs) const
115
+ { return !(*this == rhs); }
116
+
117
+ // dereference - access value
118
+ inline if_t<Const, const T&, T&> operator*() const
119
+ { return val(); }
120
+
121
+ // access value
122
+ inline if_t<Const, const T&, T&> val() const
123
+ { return instance_->val_[idx_]; }
124
+
125
+ // access key
126
+ inline const Key& key() const
127
+ { return instance_->key_[idx_]; }
128
+
129
+ // returns unique number for each entry
130
+ // the numbers are unique as long no operation are executed
131
+ // on the avl
132
+ inline size_t temp_identifier() const { return instance_->size() - idx_ - 1; }
133
+
134
+ // preincrement
135
+ tag_avl_array_iterator& operator++()
136
+ {
137
+ // end reached?
138
+ if (idx_ >= Size) {
139
+ return *this;
140
+ }
141
+ // take left most child of right child, if not existent, take parent
142
+ size_type i = instance_->child_[idx_].right;
143
+ if (i != instance_->INVALID_IDX) {
144
+ // successor is the furthest left node of right subtree
145
+ for (; i != instance_->INVALID_IDX; i = instance_->child_[i].left) {
146
+ idx_ = i;
147
+ }
148
+ }
149
+ else {
150
+ // have already processed the left subtree, and
151
+ // there is no right subtree. move up the tree,
152
+ // looking for a parent for which nodePtr is a left child,
153
+ // stopping if the parent becomes NULL. a non-NULL parent
154
+ // is the successor. if parent is NULL, the original node
155
+ // was the last node inorder, and its successor
156
+ // is the end of the list
157
+ i = instance_->get_parent(idx_);
158
+ while ((i != instance_->INVALID_IDX) && (idx_ == instance_->child_[i].right)) {
159
+ idx_ = i;
160
+ i = instance_->get_parent(idx_);
161
+ }
162
+ idx_ = i;
163
+ }
164
+ return *this;
165
+ }
166
+
167
+ // postincrement
168
+ inline tag_avl_array_iterator operator++(int)
169
+ {
170
+ tag_avl_array_iterator _copy = *this;
171
+ ++(*this);
172
+ return _copy;
173
+ }
174
+ };
175
+
176
+
177
+ public:
178
+
179
+ typedef T value_type;
180
+ typedef T* pointer;
181
+ typedef const T* const_pointer;
182
+ typedef T& reference;
183
+ typedef const T& const_reference;
184
+ typedef Key key_type;
185
+ typedef tag_avl_array_iterator<false> iterator;
186
+ typedef tag_avl_array_iterator<true> const_iterator;
187
+
188
+
189
+ // ctor
190
+ avl_array()
191
+ : size_(0U)
192
+ , root_(Size)
193
+ { }
194
+
195
+
196
+ // iterators
197
+ inline iterator begin()
198
+ {
199
+ size_type i = INVALID_IDX;
200
+ if (root_ != INVALID_IDX) {
201
+ // find smallest element, it's the farthest node left from root
202
+ for (i = root_; child_[i].left != INVALID_IDX; i = child_[i].left);
203
+ }
204
+ return iterator(this, i);
205
+ }
206
+
207
+ inline const_iterator begin() const
208
+ {
209
+ return const_iterator(const_cast<avl_array&>(*this).begin());
210
+ }
211
+
212
+ inline iterator end()
213
+ { return iterator(this, INVALID_IDX); }
214
+
215
+ inline const_iterator end() const
216
+ {
217
+ return const_iterator(this, INVALID_IDX);
218
+ }
219
+
220
+
221
+ // capacity
222
+ inline size_type size() const
223
+ { return size_; }
224
+
225
+ inline bool empty() const
226
+ { return size_ == static_cast<size_type>(0); }
227
+
228
+ inline size_type max_size() const
229
+ { return Size; }
230
+
231
+
232
+ /**
233
+ * Clear the container
234
+ */
235
+ inline void clear()
236
+ {
237
+ size_ = 0U;
238
+ root_ = INVALID_IDX;
239
+ }
240
+
241
+
242
+ /**
243
+ * Insert or update an element
244
+ * \param key The key to insert. If the key already exists, it is updated
245
+ * \param val Value to insert or update
246
+ * \return True if the key was successfully inserted or updated, false if container is full
247
+ */
248
+ bool insert(const key_type& key, const value_type& val)
249
+ {
250
+ if (root_ == INVALID_IDX) {
251
+ key_[size_] = key;
252
+ val_[size_] = val;
253
+ balance_[size_] = 0;
254
+ child_[size_] = { INVALID_IDX, INVALID_IDX };
255
+ set_parent(size_, INVALID_IDX);
256
+ root_ = size_++;
257
+ return true;
258
+ }
259
+
260
+ for (size_type i = root_; i != INVALID_IDX; i = (key < key_[i]) ? child_[i].left : child_[i].right) {
261
+ if (key < key_[i]) {
262
+ if (child_[i].left == INVALID_IDX) {
263
+ if (size_ >= max_size()) {
264
+ // container is full
265
+ return false;
266
+ }
267
+ key_[size_] = key;
268
+ val_[size_] = val;
269
+ balance_[size_] = 0;
270
+ child_[size_] = { INVALID_IDX, INVALID_IDX };
271
+ set_parent(size_, i);
272
+ child_[i].left = size_++;
273
+ insert_balance(i, 1);
274
+ return true;
275
+ }
276
+ }
277
+ else if (key_[i] == key) {
278
+ // found same key, update node
279
+ val_[i] = val;
280
+ return true;
281
+ }
282
+ else {
283
+ if (child_[i].right == INVALID_IDX) {
284
+ if (size_ >= max_size()) {
285
+ // container is full
286
+ return false;
287
+ }
288
+ key_[size_] = key;
289
+ val_[size_] = val;
290
+ balance_[size_] = 0;
291
+ child_[size_] = { INVALID_IDX, INVALID_IDX };
292
+ set_parent(size_, i);
293
+ child_[i].right = size_++;
294
+ insert_balance(i, -1);
295
+ return true;
296
+ }
297
+ }
298
+ }
299
+ // node doesn't fit (should not happen) - discard it anyway
300
+ return false;
301
+ }
302
+
303
+
304
+ /**
305
+ * Find an element
306
+ * \param key The key to find
307
+ * \param val If key is found, the value of the element is set
308
+ * \return True if key was found
309
+ */
310
+ inline bool find(const key_type& key, value_type& val) const
311
+ {
312
+ for (size_type i = root_; i != INVALID_IDX;) {
313
+ if (key < key_[i]) {
314
+ i = child_[i].left;
315
+ }
316
+ else if (key == key_[i]) {
317
+ // found key
318
+ val = val_[i];
319
+ return true;
320
+ }
321
+ else {
322
+ i = child_[i].right;
323
+ }
324
+ }
325
+ // key not found
326
+ return false;
327
+ }
328
+
329
+
330
+ /**
331
+ * Find an element and return an iterator as result
332
+ * \param key The key to find
333
+ * \return Iterator if key was found, else end() is returned
334
+ */
335
+ inline iterator find(const key_type& key)
336
+ {
337
+ for (size_type i = root_; i != INVALID_IDX;) {
338
+ if (key < key_[i]) {
339
+ i = child_[i].left;
340
+ } else if (key == key_[i]) {
341
+ // found key
342
+ return iterator(this, i);
343
+ }
344
+ else {
345
+ i = child_[i].right;
346
+ }
347
+ }
348
+ // key not found, return end() iterator
349
+ return end();
350
+ }
351
+
352
+ inline const_iterator find(const key_type& key) const
353
+ {
354
+ return const_iterator(const_cast<avl_array&>(*this).find(key));
355
+ }
356
+
357
+
358
+ /**
359
+ * Count elements with a specific key
360
+ * Searches the container for elements with a key equivalent to key and returns the number of matches.
361
+ * Because all elements are unique, the function can only return 1 (if the element is found) or zero (otherwise).
362
+ * \param key The key to find/count
363
+ * \return 0 if key was not found, 1 if key was found
364
+ */
365
+ inline size_type count(const key_type& key)
366
+ {
367
+ return find(key) != end() ? 1U : 0U;
368
+ }
369
+
370
+
371
+ /**
372
+ * Remove element by key
373
+ * \param key The key of the element to remove
374
+ * \return True if the element ws removed, false if key was not found
375
+ */
376
+ inline bool erase(const key_type& key)
377
+ {
378
+ return erase(find(key));
379
+ }
380
+
381
+
382
+ /**
383
+ * Remove element by iterator position
384
+ * THIS ERASE OPERATION INVALIDATES ALL ITERATORS!
385
+ * \param position The iterator position of the element to remove
386
+ * \return True if the element was successfully removed, false if error
387
+ */
388
+ bool erase(iterator position)
389
+ {
390
+ if (empty() || (position == end())) {
391
+ return false;
392
+ }
393
+
394
+ const size_type node = position.idx_;
395
+ const size_type left = child_[node].left;
396
+ const size_type right = child_[node].right;
397
+
398
+ if (left == INVALID_IDX) {
399
+ if (right == INVALID_IDX) {
400
+ if (node == root_) {
401
+ root_ = INVALID_IDX;
402
+ }
403
+ else {
404
+ const size_type parent = get_parent(node);
405
+ if (child_[parent].left == node) {
406
+ child_[parent].left = INVALID_IDX;
407
+ delete_balance(parent, -1);
408
+ }
409
+ else {
410
+ child_[parent].right = INVALID_IDX;
411
+ delete_balance(parent, 1);
412
+ }
413
+ }
414
+ }
415
+ else {
416
+ const size_type parent = get_parent(node);
417
+ child_[parent].left == node ? child_[parent].left = right : child_[parent].right = right;
418
+
419
+ set_parent(right, parent);
420
+
421
+ delete_balance(right, 0);
422
+ }
423
+ }
424
+ else if (right == INVALID_IDX) {
425
+ const size_type parent = get_parent(node);
426
+ child_[parent].left == node ? child_[parent].left = left : child_[parent].right = left;
427
+
428
+ set_parent(left, parent);
429
+
430
+ delete_balance(left, 0);
431
+ }
432
+ else {
433
+ size_type successor = right;
434
+ if (child_[successor].left == INVALID_IDX) {
435
+ const size_type parent = get_parent(node);
436
+ child_[successor].left = left;
437
+ balance_[successor] = balance_[node];
438
+ set_parent(successor, parent);
439
+ set_parent(left, successor);
440
+
441
+ if (node == root_) {
442
+ root_ = successor;
443
+ }
444
+ else {
445
+ if (child_[parent].left == node) {
446
+ child_[parent].left = successor;
447
+ }
448
+ else {
449
+ child_[parent].right = successor;
450
+ }
451
+ }
452
+ delete_balance(successor, 1);
453
+ }
454
+ else {
455
+ while (child_[successor].left != INVALID_IDX) {
456
+ successor = child_[successor].left;
457
+ }
458
+
459
+ const size_type parent = get_parent(node);
460
+ const size_type successor_parent = get_parent(successor);
461
+ const size_type successor_right = child_[successor].right;
462
+
463
+ if (child_[successor_parent].left == successor) {
464
+ child_[successor_parent].left = successor_right;
465
+ }
466
+ else {
467
+ child_[successor_parent].right = successor_right;
468
+ }
469
+
470
+ set_parent(successor_right, successor_parent);
471
+ set_parent(successor, parent);
472
+ set_parent(right, successor);
473
+ set_parent(left, successor);
474
+ child_[successor].left = left;
475
+ child_[successor].right = right;
476
+ balance_[successor] = balance_[node];
477
+
478
+ if (node == root_) {
479
+ root_ = successor;
480
+ }
481
+ else {
482
+ if (child_[parent].left == node) {
483
+ child_[parent].left = successor;
484
+ }
485
+ else {
486
+ child_[parent].right = successor;
487
+ }
488
+ }
489
+ delete_balance(successor_parent, -1);
490
+ }
491
+ }
492
+ size_--;
493
+
494
+ // relocate the node at the end to the deleted node, if it's not the deleted one
495
+ if (node != size_) {
496
+ if (root_ == size_) {
497
+ root_ = node;
498
+ }
499
+ else {
500
+ const size_type parent = get_parent(size_);
501
+ if (parent != INVALID_IDX) { // should never be invalid, but anyway for security
502
+ child_[parent].left == size_ ? child_[parent].left = node : child_[parent].right = node;
503
+ }
504
+ }
505
+
506
+ // correct childs parent
507
+ set_parent(child_[size_].left, node);
508
+ set_parent(child_[size_].right, node);
509
+
510
+ // move content
511
+ replace(node, size_);
512
+ }
513
+
514
+ return true;
515
+ }
516
+
517
+
518
+ /**
519
+ * Integrity (self) test
520
+ * \return True if the tree intergity is correct, false if error (should not happen normally)
521
+ */
522
+ bool test() const
523
+ {
524
+ // check root
525
+ if (empty() && (root_ != INVALID_IDX)) {
526
+ // invalid root
527
+ return false;
528
+ }
529
+ if (size() && root_ >= size()) {
530
+ // root out of bounds
531
+ return false;
532
+ }
533
+
534
+ // check tree
535
+ for (size_type i = 0U; i < size(); ++i)
536
+ {
537
+ if ((child_[i].left != INVALID_IDX) && (!(key_[child_[i].left] < key_[i]) || (key_[child_[i].left] == key_[i]))) {
538
+ // wrong key order to the left
539
+ return false;
540
+ }
541
+ if ((child_[i].right != INVALID_IDX) && ((key_[child_[i].right] < key_[i]) || (key_[child_[i].right] == key_[i]))) {
542
+ // wrong key order to the right
543
+ return false;
544
+ }
545
+ const size_type parent = get_parent(i);
546
+ if ((i != root_) && (parent == INVALID_IDX)) {
547
+ // no parent
548
+ return false;
549
+ }
550
+ if ((i == root_) && (parent != INVALID_IDX)) {
551
+ // invalid root parent
552
+ return false;
553
+ }
554
+ }
555
+ // check passed
556
+ return true;
557
+ }
558
+
559
+
560
+ /////////////////////////////////////////////////////////////////////////////
561
+ // Helper functions
562
+ private:
563
+
564
+ // find parent element
565
+ inline size_type get_parent(size_type node) const
566
+ {
567
+ if (Fast) {
568
+ return parent_[node];
569
+ }
570
+ else {
571
+ const Key key_node = key_[node];
572
+ for (size_type i = root_; i != INVALID_IDX; i = (key_node < key_[i]) ? child_[i].left : child_[i].right) {
573
+ if ((child_[i].left == node) || (child_[i].right == node)) {
574
+ // found parent
575
+ return i;
576
+ }
577
+ }
578
+ // parent not found
579
+ return INVALID_IDX;
580
+ }
581
+ }
582
+
583
+
584
+ // set parent element (only in Fast version)
585
+ inline void set_parent(size_type node, size_type parent)
586
+ {
587
+ if (Fast) {
588
+ if (node != INVALID_IDX) {
589
+ parent_[node] = parent;
590
+ }
591
+ }
592
+ }
593
+
594
+
595
+ inline void replace(size_type target, size_type source)
596
+ {
597
+ key_[target] = key_[source];
598
+ val_[target] = val_[source];
599
+ balance_[target] = balance_[source];
600
+ child_[target] = child_[source];
601
+ set_parent(target, get_parent(source));
602
+ }
603
+
604
+
605
+ void insert_balance(size_type node, std::int8_t balance)
606
+ {
607
+ while (node != INVALID_IDX) {
608
+ balance = (balance_[node] += balance);
609
+
610
+ if (balance == 0) {
611
+ return;
612
+ }
613
+ else if (balance == 2) {
614
+ if (balance_[child_[node].left] == 1) {
615
+ rotate_right(node);
616
+ }
617
+ else {
618
+ rotate_left_right(node);
619
+ }
620
+ return;
621
+ }
622
+ else if (balance == -2) {
623
+ if (balance_[child_[node].right] == -1) {
624
+ rotate_left(node);
625
+ }
626
+ else {
627
+ rotate_right_left(node);
628
+ }
629
+ return;
630
+ }
631
+
632
+ const size_type parent = get_parent(node);
633
+ if (parent != INVALID_IDX) {
634
+ balance = child_[parent].left == node ? 1 : -1;
635
+ }
636
+ node = parent;
637
+ }
638
+ }
639
+
640
+
641
+ void delete_balance(size_type node, std::int8_t balance)
642
+ {
643
+ while (node != INVALID_IDX) {
644
+ balance = (balance_[node] += balance);
645
+
646
+ if (balance == -2) {
647
+ if (balance_[child_[node].right] <= 0) {
648
+ node = rotate_left(node);
649
+ if (balance_[node] == 1) {
650
+ return;
651
+ }
652
+ }
653
+ else {
654
+ node = rotate_right_left(node);
655
+ }
656
+ }
657
+ else if (balance == 2) {
658
+ if (balance_[child_[node].left] >= 0) {
659
+ node = rotate_right(node);
660
+ if (balance_[node] == -1) {
661
+ return;
662
+ }
663
+ }
664
+ else {
665
+ node = rotate_left_right(node);
666
+ }
667
+ }
668
+ else if (balance != 0) {
669
+ return;
670
+ }
671
+
672
+ if (node != INVALID_IDX) {
673
+ const size_type parent = get_parent(node);
674
+ if (parent != INVALID_IDX) {
675
+ balance = child_[parent].left == node ? -1 : 1;
676
+ }
677
+ node = parent;
678
+ }
679
+ }
680
+ }
681
+
682
+
683
+ size_type rotate_left(size_type node)
684
+ {
685
+ const size_type right = child_[node].right;
686
+ const size_type right_left = child_[right].left;
687
+ const size_type parent = get_parent(node);
688
+
689
+ set_parent(right, parent);
690
+ set_parent(node, right);
691
+ set_parent(right_left, node);
692
+ child_[right].left = node;
693
+ child_[node].right = right_left;
694
+
695
+ if (node == root_) {
696
+ root_ = right;
697
+ }
698
+ else if (child_[parent].right == node) {
699
+ child_[parent].right = right;
700
+ }
701
+ else {
702
+ child_[parent].left = right;
703
+ }
704
+
705
+ balance_[right]++;
706
+ balance_[node] = -balance_[right];
707
+
708
+ return right;
709
+ }
710
+
711
+
712
+ size_type rotate_right(size_type node)
713
+ {
714
+ const size_type left = child_[node].left;
715
+ const size_type left_right = child_[left].right;
716
+ const size_type parent = get_parent(node);
717
+
718
+ set_parent(left, parent);
719
+ set_parent(node, left);
720
+ set_parent(left_right, node);
721
+ child_[left].right = node;
722
+ child_[node].left = left_right;
723
+
724
+ if (node == root_) {
725
+ root_ = left;
726
+ }
727
+ else if (child_[parent].left == node) {
728
+ child_[parent].left = left;
729
+ }
730
+ else {
731
+ child_[parent].right = left;
732
+ }
733
+
734
+ balance_[left]--;
735
+ balance_[node] = -balance_[left];
736
+
737
+ return left;
738
+ }
739
+
740
+
741
+ size_type rotate_left_right(size_type node)
742
+ {
743
+ const size_type left = child_[node].left;
744
+ const size_type left_right = child_[left].right;
745
+ const size_type left_right_right = child_[left_right].right;
746
+ const size_type left_right_left = child_[left_right].left;
747
+ const size_type parent = get_parent(node);
748
+
749
+ set_parent(left_right, parent);
750
+ set_parent(left, left_right);
751
+ set_parent(node, left_right);
752
+ set_parent(left_right_right, node);
753
+ set_parent(left_right_left, left);
754
+ child_[node].left = left_right_right;
755
+ child_[left].right = left_right_left;
756
+ child_[left_right].left = left;
757
+ child_[left_right].right = node;
758
+
759
+ if (node == root_) {
760
+ root_ = left_right;
761
+ }
762
+ else if (child_[parent].left == node) {
763
+ child_[parent].left = left_right;
764
+ }
765
+ else {
766
+ child_[parent].right = left_right;
767
+ }
768
+
769
+ if (balance_[left_right] == 0) {
770
+ balance_[node] = 0;
771
+ balance_[left] = 0;
772
+ }
773
+ else if (balance_[left_right] == -1) {
774
+ balance_[node] = 0;
775
+ balance_[left] = 1;
776
+ }
777
+ else {
778
+ balance_[node] = -1;
779
+ balance_[left] = 0;
780
+ }
781
+ balance_[left_right] = 0;
782
+
783
+ return left_right;
784
+ }
785
+
786
+
787
+ size_type rotate_right_left(size_type node)
788
+ {
789
+ const size_type right = child_[node].right;
790
+ const size_type right_left = child_[right].left;
791
+ const size_type right_left_left = child_[right_left].left;
792
+ const size_type right_left_right = child_[right_left].right;
793
+ const size_type parent = get_parent(node);
794
+
795
+ set_parent(right_left, parent);
796
+ set_parent(right, right_left);
797
+ set_parent(node, right_left);
798
+ set_parent(right_left_left, node);
799
+ set_parent(right_left_right, right);
800
+ child_[node].right = right_left_left;
801
+ child_[right].left = right_left_right;
802
+ child_[right_left].right = right;
803
+ child_[right_left].left = node;
804
+
805
+ if (node == root_) {
806
+ root_ = right_left;
807
+ }
808
+ else if (child_[parent].right == node) {
809
+ child_[parent].right = right_left;
810
+ }
811
+ else {
812
+ child_[parent].left = right_left;
813
+ }
814
+
815
+ if (balance_[right_left] == 0) {
816
+ balance_[node] = 0;
817
+ balance_[right] = 0;
818
+ }
819
+ else if (balance_[right_left] == 1) {
820
+ balance_[node] = 0;
821
+ balance_[right] = -1;
822
+ }
823
+ else {
824
+ balance_[node] = 1;
825
+ balance_[right] = 0;
826
+ }
827
+ balance_[right_left] = 0;
828
+
829
+ return right_left;
830
+ }
831
+ };
832
+
833
+ #endif // _AVL_ARRAY_H_