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,100 @@
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
+ /// Define base constructs to specify by operation headers.
10
+
11
+ #include "command.h"
12
+ #include "stack.h"
13
+ #include "value.h"
14
+
15
+ namespace ink::runtime::internal
16
+ {
17
+
18
+ namespace casting
19
+ {
20
+ // default cast to none (invalid cast)
21
+ template<value_type t1, value_type t2>
22
+ struct cast {
23
+ static constexpr value_type value = value_type::none;
24
+ };
25
+
26
+ // no cast for same type
27
+ template<value_type t>
28
+ struct cast<t, t> {
29
+ static constexpr value_type value = t;
30
+ };
31
+ } // namespace casting
32
+
33
+ /**
34
+ * @brief Determines the number of arguments needed for an command.
35
+ */
36
+ constexpr size_t command_num_args(Command cmd)
37
+ {
38
+ if (cmd >= Command::TERNARY_OPERATORS_START && cmd <= Command::TERNARY_OPERATORS_END) {
39
+ return 3;
40
+ } else if (cmd >= Command::BINARY_OPERATORS_START && cmd <= Command::BINARY_OPERATORS_END) {
41
+ return 2;
42
+ } else if (cmd >= Command::UNARY_OPERATORS_START && cmd <= Command::UNARY_OPERATORS_END) {
43
+ return 1;
44
+ } else {
45
+ return 0;
46
+ }
47
+ }
48
+
49
+ /**
50
+ * @brief Operation definition.
51
+ * A class which contains a call operator to execute the operation needed
52
+ * for the command type combination.
53
+ * @tparam cmd Command which should be executed
54
+ * @tparam ty type on which the command should be executed
55
+ */
56
+ template<Command cmd, value_type ty, typename enable = void>
57
+ class operation
58
+ {
59
+ public:
60
+ static constexpr bool enabled = false;
61
+
62
+ template<typename T>
63
+ operation(const T& t)
64
+ {
65
+ }
66
+
67
+ /**
68
+ * @brief execute operation.
69
+ * @param stack were the result(s) get pushed
70
+ * @param vs array of values, first one = first argument etc
71
+ */
72
+ void operator()(basic_eval_stack& stack, value* vs) { inkFail("operation not implemented!"); }
73
+ };
74
+ } // namespace ink::runtime::internal
75
+
76
+ // include header here to ensure correct order
77
+
78
+ #include "operation_bases.h"
79
+ #include "numeric_operations.h"
80
+ #include "string_operations.h"
81
+ #include "list_operations.h"
82
+ #include "container_operations.h"
83
+ #include "casting.h"
84
+
85
+ template<typename... T>
86
+ ink::runtime::internal::value
87
+ ink::runtime::internal::value::redefine(const value& oth, T&... env) const
88
+ {
89
+ if (type() != oth.type() && (type() == value_type::list_flag || type() == value_type::list)
90
+ && (oth.type() == value_type::list_flag || oth.type() == value_type::list)) {
91
+ /// @todo could break origin
92
+ if (oth.type() == value_type::list) {
93
+ return value{}.set<value_type::list>(oth.get<value_type::list>());
94
+ } else {
95
+ return value{}.set<value_type::list_flag>(oth.get<value_type::list_flag>());
96
+ }
97
+ }
98
+ inkAssert(type() == oth.type(), "try to redefine value of other type");
99
+ return redefine<value_type::OP_BEGIN, T...>(oth, {&env...});
100
+ }
@@ -0,0 +1,528 @@
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 "output.h"
8
+ #include "string_table.h"
9
+ #include "list_table.h"
10
+ #include <system.h>
11
+ #include "string_utils.h"
12
+
13
+ #ifdef INK_ENABLE_STL
14
+ # include <iomanip>
15
+ #endif
16
+
17
+ namespace ink::runtime::internal
18
+ {
19
+ basic_stream::basic_stream(value* buffer, size_t len)
20
+ : _data(buffer)
21
+ , _max(len)
22
+ , _size(0)
23
+ , _save(~0)
24
+ {
25
+ }
26
+
27
+ void basic_stream::append(const value& in)
28
+ {
29
+ // newline after glue -> no newline
30
+ // newline after glue
31
+ // SPECIAL: Incoming newline
32
+ if (in.type() == value_type::newline && _size > 1) {
33
+ // If the end of the stream is a function start marker, we actually
34
+ // want to ignore this. Function start trimming.
35
+ if (_data[_size - 1].type() == value_type::func_start)
36
+ return;
37
+ size_t i = _size - 1;
38
+ while (true) {
39
+ value& d = _data[i];
40
+ // ignore additional newlines after newline or glue
41
+ if (d.type() == value_type::newline || d.type() == value_type::glue) {
42
+ return;
43
+ } else if (d.type() == value_type::string && ink::internal::is_whitespace(d.get<value_type::string>())) {
44
+ } else if (d.type() == value_type::func_start || d.type() == value_type::func_end) {
45
+ } else {
46
+ break;
47
+ }
48
+ if (i == 0) {
49
+ return;
50
+ }
51
+ --i;
52
+ }
53
+ }
54
+
55
+ // Ignore leading newlines
56
+ if (in.type() == value_type::newline && _size == 0)
57
+ return;
58
+
59
+ // Add to data stream
60
+ inkAssert(_size < _max, "Output stream overflow");
61
+ _data[_size++] = in;
62
+
63
+ // Special: Incoming glue. Trim whitespace/newlines prior
64
+ // This also applies when a function ends to trim trailing whitespace.
65
+ if ((in.type() == value_type::glue || in.type() == value_type::func_end) && _size > 1) {
66
+ // Run backwards
67
+ size_t i = _size - 2;
68
+ int func_end_cnt = 0;
69
+ while (true) {
70
+ value& d = _data[i];
71
+
72
+ // Nullify newlines
73
+ if (d.type() == value_type::newline) {
74
+ d = value{};
75
+ }
76
+
77
+ // Nullify whitespace
78
+ else if (d.type() == value_type::string && ::ink::internal::is_whitespace(d.get<value_type::string>()))
79
+ d = value{};
80
+ else if (d.type() == value_type::func_end) {
81
+ ++func_end_cnt;
82
+ } else if (d.type() == value_type::func_start && func_end_cnt > 0) {
83
+ --func_end_cnt;
84
+ }
85
+
86
+ // If it's not a newline or whitespace, stop
87
+ else
88
+ break;
89
+
90
+ // If we've hit the end, break
91
+ if (i == 0)
92
+ break;
93
+
94
+ // Move on to next element
95
+ i--;
96
+ }
97
+ }
98
+ }
99
+
100
+ void basic_stream::append(const value* in, unsigned int length)
101
+ {
102
+ // TODO: Better way to bulk while still executing glue checks?
103
+ for (size_t i = 0; i < length; i++)
104
+ append(in[i]);
105
+ }
106
+
107
+ template<typename T>
108
+ inline void write_char(T& output, char c)
109
+ {
110
+ static_assert(always_false<T>::value, "Invalid output type");
111
+ }
112
+
113
+ template<>
114
+ inline void write_char(char*& output, char c)
115
+ {
116
+ (*output++) = c;
117
+ }
118
+
119
+ #ifdef INK_ENABLE_STL
120
+ template<>
121
+ inline void write_char(std::stringstream& output, char c)
122
+ {
123
+ output.put(c);
124
+ }
125
+ #endif
126
+
127
+ inline bool get_next(const value* list, size_t i, size_t size, const value** next)
128
+ {
129
+ while (i + 1 < size) {
130
+ *next = &list[i + 1];
131
+ value_type type = (*next)->type();
132
+ if ((*next)->printable()) {
133
+ return true;
134
+ }
135
+ i++;
136
+ }
137
+
138
+ return false;
139
+ }
140
+
141
+ template<typename T>
142
+ void basic_stream::copy_string(const char* str, size_t& dataIter, T& output)
143
+ {
144
+ while (*str != 0) {
145
+ write_char(output, *str++);
146
+ }
147
+ }
148
+
149
+ #ifdef INK_ENABLE_STL
150
+ std::string basic_stream::get()
151
+ {
152
+ size_t start = find_start();
153
+
154
+ // Move up from marker
155
+ bool hasGlue = false, lastNewline = false;
156
+ std::stringstream str;
157
+ for (size_t i = start; i < _size; i++) {
158
+ if (should_skip(i, hasGlue, lastNewline))
159
+ continue;
160
+ if (_data[i].printable()) {
161
+ _data[i].write(str, _lists_table);
162
+ }
163
+ }
164
+
165
+ // Reset stream size to where we last held the marker
166
+ _size = start;
167
+
168
+ // Return processed string
169
+ // remove mulitple accourencies of ' '
170
+ std::string result = str.str();
171
+ if (! result.empty()) {
172
+ auto end = clean_string<true, false>(result.begin(), result.end());
173
+ if (result.begin() == end) {
174
+ result.resize(0);
175
+ } else {
176
+ _last_char = *(end - 1);
177
+ result.resize(end - result.begin() - (_last_char == ' ' ? 1 : 0));
178
+ }
179
+ }
180
+ return result;
181
+ }
182
+ #endif
183
+ #ifdef INK_ENABLE_UNREAL
184
+ FString basic_stream::get()
185
+ {
186
+ UE_LOG(
187
+ InkCpp, Warning,
188
+ TEXT("Basic stream::get is not implemented correctly and should not be used implemented "
189
+ "correctly!")
190
+ );
191
+ FString str;
192
+ return str;
193
+ }
194
+ #endif
195
+
196
+ int basic_stream::queued() const
197
+ {
198
+ size_t start = find_start();
199
+ return _size - start;
200
+ }
201
+
202
+ const value& basic_stream::peek() const
203
+ {
204
+ inkAssert(_size > 0, "Attempting to peek empty stream!");
205
+ return _data[_size - 1];
206
+ }
207
+
208
+ void basic_stream::discard(size_t length)
209
+ {
210
+ // discard elements
211
+ _size -= length;
212
+ if (_size < 0)
213
+ _size = 0;
214
+ }
215
+
216
+ void basic_stream::get(value* ptr, size_t length)
217
+ {
218
+ // Find start
219
+ size_t start = find_start();
220
+
221
+ const value* end = ptr + length;
222
+ // inkAssert(_size - start < length, "Insufficient space in data array to store stream
223
+ // contents!");
224
+
225
+ // Move up from marker
226
+ bool hasGlue = false, lastNewline = false;
227
+ for (size_t i = start; i < _size; i++) {
228
+ if (should_skip(i, hasGlue, lastNewline))
229
+ continue;
230
+
231
+ // Make sure we can fit the next element
232
+ inkAssert(ptr < end, "Insufficient space in data array to store stream contents!");
233
+
234
+ // Copy any value elements
235
+ if (_data[i].printable()) {
236
+ *(ptr++) = _data[i];
237
+ }
238
+ }
239
+
240
+ // Reset stream size to where we last held the marker
241
+ _size = start;
242
+ }
243
+
244
+ bool basic_stream::has_marker() const { return entries_since_marker() >= 0; }
245
+
246
+ int basic_stream::entries_since_marker() const
247
+ {
248
+ // TODO: Cache?
249
+ for (size_t i = 0; i < _size; i++) {
250
+ if (_data[i].type() == value_type::marker)
251
+ return i;
252
+ }
253
+
254
+ return -1;
255
+ }
256
+
257
+ bool basic_stream::ends_with(value_type type) const
258
+ {
259
+ if (_size == 0)
260
+ return false;
261
+
262
+ return _data[_size - 1].type() == type;
263
+ }
264
+
265
+ bool basic_stream::saved_ends_with(value_type type) const
266
+ {
267
+ inkAssert(_save != ~0, "Stream is not saved!");
268
+
269
+ if (_save == 0)
270
+ return false;
271
+
272
+ return _data[_save - 1].type() == type;
273
+ }
274
+
275
+ void basic_stream::save()
276
+ {
277
+ inkAssert(_save == ~0, "Can not save over existing save point!");
278
+
279
+ // Save the current size
280
+ _save = _size;
281
+ }
282
+
283
+ void basic_stream::restore()
284
+ {
285
+ inkAssert(_save != ~0, "No save point to restore!");
286
+
287
+ // Restore size to saved position
288
+ _size = _save;
289
+ _save = ~0;
290
+ }
291
+
292
+ void basic_stream::forget()
293
+ {
294
+ inkAssert(_save != ~0, "No save point to forget!");
295
+
296
+ // Just null the save point and continue as normal
297
+ _save = ~0;
298
+ }
299
+
300
+ template char* basic_stream::get_alloc<true>(string_table& strings, list_table& lists);
301
+ template char* basic_stream::get_alloc<false>(string_table& strings, list_table& lists);
302
+
303
+ template<bool RemoveTail>
304
+ char* basic_stream::get_alloc(string_table& strings, list_table& lists)
305
+ {
306
+ size_t start = find_start();
307
+
308
+ // Two passes. First for length
309
+ size_t length = 0;
310
+ bool hasGlue = false, lastNewline = false;
311
+ for (size_t i = start; i < _size; i++) {
312
+ if (should_skip(i, hasGlue, lastNewline))
313
+ continue;
314
+ ++length; // potenzial space to sperate
315
+ if (_data[i].printable()) {
316
+ switch (_data[i].type()) {
317
+ case value_type::list: length += lists.stringLen(_data[i].get<value_type::list>()); break;
318
+ case value_type::list_flag:
319
+ length += lists.stringLen(_data[i].get<value_type::list_flag>());
320
+ break;
321
+ default: length += value_length(_data[i]);
322
+ }
323
+ }
324
+ }
325
+
326
+ // Allocate
327
+ char* buffer = strings.create(length + 1);
328
+ char* end = buffer + length + 1;
329
+ char* ptr = buffer;
330
+ hasGlue = false;
331
+ lastNewline = false;
332
+ for (size_t i = start; i < _size; i++) {
333
+ if (should_skip(i, hasGlue, lastNewline))
334
+ continue;
335
+ if (! _data[i].printable()) {
336
+ continue;
337
+ }
338
+ switch (_data[i].type()) {
339
+ case value_type::int32:
340
+ case value_type::float32:
341
+ case value_type::uint32:
342
+ // Convert to string and advance
343
+ toStr(ptr, end - ptr, _data[i]);
344
+ while (*ptr != 0)
345
+ ptr++;
346
+
347
+ break;
348
+ case value_type::string: {
349
+ // Copy string and advance
350
+ const char* value = _data[i].get<value_type::string>();
351
+ copy_string(value, i, ptr);
352
+ } break;
353
+ case value_type::newline:
354
+ *ptr = '\n';
355
+ ptr++;
356
+ break;
357
+ case value_type::list: ptr = lists.toString(ptr, _data[i].get<value_type::list>()); break;
358
+ case value_type::list_flag:
359
+ ptr = lists.toString(ptr, _data[i].get<value_type::list>());
360
+ break;
361
+ default: inkFail("cant convert expression to string!");
362
+ }
363
+ }
364
+
365
+ // Make sure last character is a null
366
+ *ptr = 0;
367
+
368
+ // Reset stream size to where we last held the marker
369
+ _size = start;
370
+
371
+ // Return processed string
372
+ end = clean_string<true, false>(buffer, buffer + c_str_len(buffer));
373
+ *end = 0;
374
+ if (end != buffer) {
375
+ _last_char = end[-1];
376
+ if constexpr (RemoveTail) {
377
+ if (_last_char == ' ') {
378
+ end[-1] = 0;
379
+ }
380
+ }
381
+ } else {
382
+ _last_char = 'e';
383
+ }
384
+
385
+ return buffer;
386
+ }
387
+
388
+ size_t basic_stream::find_start() const
389
+ {
390
+ // Find marker (or start)
391
+ size_t start = _size;
392
+ while (start > 0) {
393
+ start--;
394
+ if (_data[start].type() == value_type::marker)
395
+ break;
396
+ }
397
+
398
+ // Make sure we're not violating a save point
399
+ if (_save != ~0 && start < _save) {
400
+ // TODO: check if we don't reset save correct
401
+ // at some point we can modifiy the output even behind save (probally discard?) and push a new
402
+ // element -> invalid save point
403
+ inkAssert(false, "Trying to access output stream prior to save point!");
404
+ }
405
+
406
+ return start;
407
+ }
408
+
409
+ bool basic_stream::should_skip(size_t iter, bool& hasGlue, bool& lastNewline) const
410
+ {
411
+ if (_data[iter].printable() && _data[iter].type() != value_type::newline
412
+ && _data[iter].type() != value_type::string) {
413
+ lastNewline = false;
414
+ hasGlue = false;
415
+ } else {
416
+ switch (_data[iter].type()) {
417
+ case value_type::newline:
418
+ if (lastNewline)
419
+ return true;
420
+ if (hasGlue)
421
+ return true;
422
+ lastNewline = true;
423
+ break;
424
+ case value_type::glue: hasGlue = true; break;
425
+ case value_type::string: {
426
+ lastNewline = false;
427
+ // an empty string don't count as glued I095
428
+ for (const char* i = _data[iter].get<value_type::string>(); *i; ++i) {
429
+ // isspace only supports characters in [0, UCHAR_MAX]
430
+ if (! isspace(static_cast<unsigned char>(*i))) {
431
+ hasGlue = false;
432
+ break;
433
+ }
434
+ }
435
+ } break;
436
+ default: break;
437
+ }
438
+ }
439
+
440
+ return false;
441
+ }
442
+
443
+ bool basic_stream::text_past_save() const
444
+ {
445
+ // Check if there is text past the save
446
+ for (size_t i = _save; i < _size; i++) {
447
+ const value& d = _data[i];
448
+ if (d.type() == value_type::string) {
449
+ // TODO: Cache what counts as whitespace?
450
+ if (! ink::internal::is_whitespace(d.get<value_type::string>(), false))
451
+ return true;
452
+ } else if (d.printable()) {
453
+ return true;
454
+ } else if (d.type() == value_type::null) {
455
+ return true;
456
+ }
457
+ }
458
+
459
+ // No text
460
+ return false;
461
+ }
462
+
463
+ void basic_stream::clear()
464
+ {
465
+ _save = ~0;
466
+ _size = 0;
467
+ }
468
+
469
+ void basic_stream::mark_used(string_table& strings, list_table& lists) const
470
+ {
471
+ // Find all allocated strings and mark them as used
472
+ for (size_t i = 0; i < _size; i++) {
473
+ if (_data[i].type() == value_type::string) {
474
+ string_type str = _data[i].get<value_type::string>();
475
+ if (str.allocated) {
476
+ strings.mark_used(str.str);
477
+ }
478
+ } else if (_data[i].type() == value_type::list) {
479
+ lists.mark_used(_data[i].get<value_type::list>());
480
+ }
481
+ }
482
+ }
483
+
484
+ #ifdef INK_ENABLE_STL
485
+ std::ostream& operator<<(std::ostream& out, basic_stream& in)
486
+ {
487
+ out << in.get();
488
+ return out;
489
+ }
490
+
491
+ basic_stream& operator>>(basic_stream& in, std::string& out)
492
+ {
493
+ out = in.get();
494
+ return in;
495
+ }
496
+ #endif
497
+ #ifdef INK_ENABLE_UNREAL
498
+ basic_stream& operator>>(basic_stream& in, FString& out)
499
+ {
500
+ out = in.get();
501
+ return in;
502
+ }
503
+ #endif
504
+
505
+ size_t basic_stream::snap(unsigned char* data, const snapper& snapper) const
506
+ {
507
+ unsigned char* ptr = data;
508
+ ptr = snap_write(ptr, _last_char, data != nullptr);
509
+ ptr = snap_write(ptr, _size, data != nullptr);
510
+ ptr = snap_write(ptr, _save, data != nullptr);
511
+ for (auto itr = _data; itr != _data + _size; ++itr) {
512
+ ptr += itr->snap(data ? ptr : nullptr, snapper);
513
+ }
514
+ return ptr - data;
515
+ }
516
+
517
+ const unsigned char* basic_stream::snap_load(const unsigned char* ptr, const loader& loader)
518
+ {
519
+ ptr = snap_read(ptr, _last_char);
520
+ ptr = snap_read(ptr, _size);
521
+ ptr = snap_read(ptr, _save);
522
+ inkAssert(_max >= _size, "output is to small to hold stored data");
523
+ for (auto itr = _data; itr != _data + _size; ++itr) {
524
+ ptr = itr->snap_load(ptr, loader);
525
+ }
526
+ return ptr;
527
+ }
528
+ } // namespace ink::runtime::internal