enclave 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/README.md +182 -0
- data/Rakefile +30 -0
- data/ext/enclave/enclave.c +390 -0
- data/ext/enclave/extconf.rb +33 -0
- data/ext/enclave/mruby/Makefile +63 -0
- data/ext/enclave/mruby/Rakefile +102 -0
- data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
- data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
- data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
- data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
- data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
- data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
- data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
- data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
- data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
- data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
- data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
- data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
- data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
- data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
- data/ext/enclave/mruby/build_config/RX630.rb +63 -0
- data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
- data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
- data/ext/enclave/mruby/build_config/bench.rb +11 -0
- data/ext/enclave/mruby/build_config/boxing.rb +19 -0
- data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
- data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
- data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
- data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
- data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
- data/ext/enclave/mruby/build_config/default.rb +83 -0
- data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
- data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
- data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
- data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
- data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
- data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
- data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
- data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
- data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
- data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
- data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
- data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
- data/ext/enclave/mruby/build_config/minimal.rb +4 -0
- data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
- data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
- data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
- data/ext/enclave/mruby/build_config/no-float.rb +17 -0
- data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
- data/ext/enclave/mruby/build_config/serenity.rb +26 -0
- data/ext/enclave/mruby/build_config.rb +9 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/include/mruby.h +1632 -0
- data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
- data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
- data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
- data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
- data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
- data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
- data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
- data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
- data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
- data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
- data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
- data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
- data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
- data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
- data/ext/enclave/mruby/mrblib/10error.rb +23 -0
- data/ext/enclave/mruby/mrblib/array.rb +102 -0
- data/ext/enclave/mruby/mrblib/compar.rb +102 -0
- data/ext/enclave/mruby/mrblib/enum.rb +358 -0
- data/ext/enclave/mruby/mrblib/hash.rb +276 -0
- data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
- data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
- data/ext/enclave/mruby/mrblib/range.rb +98 -0
- data/ext/enclave/mruby/mrblib/string.rb +173 -0
- data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
- data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
- data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
- data/ext/enclave/mruby/src/allocf.c +37 -0
- data/ext/enclave/mruby/src/array.c +2302 -0
- data/ext/enclave/mruby/src/backtrace.c +294 -0
- data/ext/enclave/mruby/src/cdump.c +498 -0
- data/ext/enclave/mruby/src/class.c +4394 -0
- data/ext/enclave/mruby/src/codedump.c +693 -0
- data/ext/enclave/mruby/src/debug.c +290 -0
- data/ext/enclave/mruby/src/dump.c +998 -0
- data/ext/enclave/mruby/src/enum.c +30 -0
- data/ext/enclave/mruby/src/error.c +937 -0
- data/ext/enclave/mruby/src/etc.c +421 -0
- data/ext/enclave/mruby/src/fmt_fp.c +372 -0
- data/ext/enclave/mruby/src/gc.c +1610 -0
- data/ext/enclave/mruby/src/hash.c +2355 -0
- data/ext/enclave/mruby/src/init.c +50 -0
- data/ext/enclave/mruby/src/kernel.c +718 -0
- data/ext/enclave/mruby/src/load.c +760 -0
- data/ext/enclave/mruby/src/mempool.c +225 -0
- data/ext/enclave/mruby/src/numeric.c +2420 -0
- data/ext/enclave/mruby/src/numops.c +112 -0
- data/ext/enclave/mruby/src/object.c +883 -0
- data/ext/enclave/mruby/src/print.c +136 -0
- data/ext/enclave/mruby/src/proc.c +572 -0
- data/ext/enclave/mruby/src/range.c +597 -0
- data/ext/enclave/mruby/src/readfloat.c +228 -0
- data/ext/enclave/mruby/src/readint.c +27 -0
- data/ext/enclave/mruby/src/readnum.c +43 -0
- data/ext/enclave/mruby/src/state.c +247 -0
- data/ext/enclave/mruby/src/string.c +3577 -0
- data/ext/enclave/mruby/src/symbol.c +1023 -0
- data/ext/enclave/mruby/src/value_array.h +28 -0
- data/ext/enclave/mruby/src/variable.c +1475 -0
- data/ext/enclave/mruby/src/version.c +17 -0
- data/ext/enclave/mruby/src/vm.c +3696 -0
- data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
- data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
- data/ext/enclave/mruby/tasks/bin.rake +23 -0
- data/ext/enclave/mruby/tasks/core.rake +12 -0
- data/ext/enclave/mruby/tasks/doc.rake +118 -0
- data/ext/enclave/mruby/tasks/install.rake +40 -0
- data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
- data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
- data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
- data/ext/enclave/mruby/tasks/presym.rake +57 -0
- data/ext/enclave/mruby/tasks/test.rake +84 -0
- data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
- data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
- data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
- data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
- data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
- data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
- data/ext/enclave/mruby/test/assert.rb +404 -0
- data/ext/enclave/mruby/test/bintest.rb +55 -0
- data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
- data/ext/enclave/mruby/test/t/array.rb +478 -0
- data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
- data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
- data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
- data/ext/enclave/mruby/test/t/class.rb +505 -0
- data/ext/enclave/mruby/test/t/codegen.rb +196 -0
- data/ext/enclave/mruby/test/t/comparable.rb +79 -0
- data/ext/enclave/mruby/test/t/ensure.rb +36 -0
- data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
- data/ext/enclave/mruby/test/t/exception.rb +425 -0
- data/ext/enclave/mruby/test/t/false.rb +31 -0
- data/ext/enclave/mruby/test/t/float.rb +296 -0
- data/ext/enclave/mruby/test/t/gc.rb +45 -0
- data/ext/enclave/mruby/test/t/hash.rb +976 -0
- data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
- data/ext/enclave/mruby/test/t/integer.rb +247 -0
- data/ext/enclave/mruby/test/t/iterations.rb +61 -0
- data/ext/enclave/mruby/test/t/kernel.rb +462 -0
- data/ext/enclave/mruby/test/t/lang.rb +74 -0
- data/ext/enclave/mruby/test/t/literals.rb +386 -0
- data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
- data/ext/enclave/mruby/test/t/methods.rb +138 -0
- data/ext/enclave/mruby/test/t/module.rb +931 -0
- data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
- data/ext/enclave/mruby/test/t/nil.rb +39 -0
- data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
- data/ext/enclave/mruby/test/t/numeric.rb +114 -0
- data/ext/enclave/mruby/test/t/object.rb +10 -0
- data/ext/enclave/mruby/test/t/proc.rb +198 -0
- data/ext/enclave/mruby/test/t/range.rb +194 -0
- data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
- data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
- data/ext/enclave/mruby/test/t/string.rb +981 -0
- data/ext/enclave/mruby/test/t/superclass.rb +46 -0
- data/ext/enclave/mruby/test/t/symbol.rb +30 -0
- data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
- data/ext/enclave/mruby/test/t/true.rb +31 -0
- data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/unicode.rb +39 -0
- data/ext/enclave/mruby/test/t/vformat.rb +57 -0
- data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
- data/ext/enclave/mruby/tools/lrama/MIT +21 -0
- data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
- data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
- data/ext/enclave/sandbox_build_config.rb +15 -0
- data/ext/enclave/sandbox_core.c +722 -0
- data/ext/enclave/sandbox_core.h +87 -0
- data/lib/enclave/result.rb +29 -0
- data/lib/enclave/tool.rb +38 -0
- data/lib/enclave/version.rb +3 -0
- data/lib/enclave.rb +73 -0
- metadata +819 -0
|
@@ -0,0 +1,1583 @@
|
|
|
1
|
+
#include <mruby.h>
|
|
2
|
+
#include <string.h>
|
|
3
|
+
#include <mruby/value.h>
|
|
4
|
+
#include <mruby/array.h>
|
|
5
|
+
#include <mruby/range.h>
|
|
6
|
+
#include <mruby/hash.h>
|
|
7
|
+
#include <mruby/data.h>
|
|
8
|
+
#include <mruby/class.h>
|
|
9
|
+
#include <mruby/internal.h>
|
|
10
|
+
#include <mruby/presym.h>
|
|
11
|
+
#include <mruby/khash.h>
|
|
12
|
+
#include <mruby/error.h>
|
|
13
|
+
|
|
14
|
+
/* khash set for temporary array operations */
|
|
15
|
+
static inline khint_t
|
|
16
|
+
ary_set_hash_func(mrb_state *mrb, mrb_value key)
|
|
17
|
+
{
|
|
18
|
+
return (khint_t)mrb_obj_hash_code(mrb, key);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static inline mrb_bool
|
|
22
|
+
ary_set_equal_func(mrb_state *mrb, mrb_value a, mrb_value b)
|
|
23
|
+
{
|
|
24
|
+
return mrb_eql(mrb, a, b);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
KHASH_DECLARE(ary_set, mrb_value, char, 0)
|
|
28
|
+
KHASH_DEFINE(ary_set, mrb_value, char, 0, ary_set_hash_func, ary_set_equal_func)
|
|
29
|
+
|
|
30
|
+
typedef khash_t(ary_set) ary_set_t;
|
|
31
|
+
|
|
32
|
+
/* Combination state structure for repeated_combination optimization */
|
|
33
|
+
struct mrb_combination_state {
|
|
34
|
+
mrb_int *indices;
|
|
35
|
+
mrb_int n;
|
|
36
|
+
mrb_int array_size;
|
|
37
|
+
mrb_bool permutation;
|
|
38
|
+
mrb_bool finished;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
static void
|
|
42
|
+
mrb_combination_state_free(mrb_state *mrb, void *ptr)
|
|
43
|
+
{
|
|
44
|
+
struct mrb_combination_state *state = (struct mrb_combination_state*)ptr;
|
|
45
|
+
if (state) {
|
|
46
|
+
if (state->indices) {
|
|
47
|
+
mrb_free(mrb, state->indices);
|
|
48
|
+
}
|
|
49
|
+
mrb_free(mrb, state);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static struct mrb_data_type mrb_combination_state_type = {
|
|
54
|
+
"CombinationState", mrb_combination_state_free
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* call-seq:
|
|
59
|
+
* ary.assoc(obj) -> new_ary or nil
|
|
60
|
+
*
|
|
61
|
+
* Searches through an array whose elements are also arrays
|
|
62
|
+
* comparing _obj_ with the first element of each contained array
|
|
63
|
+
* using obj.==.
|
|
64
|
+
* Returns the first contained array that matches (that
|
|
65
|
+
* is, the first associated array),
|
|
66
|
+
* or `nil` if no match is found.
|
|
67
|
+
* See also `Array#rassoc`.
|
|
68
|
+
*
|
|
69
|
+
* s1 = [ "colors", "red", "blue", "green" ]
|
|
70
|
+
* s2 = [ "letters", "a", "b", "c" ]
|
|
71
|
+
* s3 = "foo"
|
|
72
|
+
* a = [ s1, s2, s3 ]
|
|
73
|
+
* a.assoc("letters") #=> [ "letters", "a", "b", "c" ]
|
|
74
|
+
* a.assoc("foo") #=> nil
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
static mrb_value
|
|
78
|
+
ary_assoc(mrb_state *mrb, mrb_value ary)
|
|
79
|
+
{
|
|
80
|
+
mrb_value k = mrb_get_arg1(mrb);
|
|
81
|
+
|
|
82
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ary); i++) {
|
|
83
|
+
mrb_value v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
|
|
84
|
+
if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 &&
|
|
85
|
+
mrb_equal(mrb, RARRAY_PTR(v)[0], k))
|
|
86
|
+
return v;
|
|
87
|
+
}
|
|
88
|
+
return mrb_nil_value();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/*
|
|
92
|
+
* call-seq:
|
|
93
|
+
* ary.rassoc(obj) -> new_ary or nil
|
|
94
|
+
*
|
|
95
|
+
* Searches through the array whose elements are also arrays. Compares
|
|
96
|
+
* _obj_ with the second element of each contained array using
|
|
97
|
+
* `==`. Returns the first contained array that matches. See
|
|
98
|
+
* also `Array#assoc`.
|
|
99
|
+
*
|
|
100
|
+
* a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
|
|
101
|
+
* a.rassoc("two") #=> [2, "two"]
|
|
102
|
+
* a.rassoc("four") #=> nil
|
|
103
|
+
*/
|
|
104
|
+
|
|
105
|
+
static mrb_value
|
|
106
|
+
ary_rassoc(mrb_state *mrb, mrb_value ary)
|
|
107
|
+
{
|
|
108
|
+
mrb_value value = mrb_get_arg1(mrb);
|
|
109
|
+
|
|
110
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ary); i++) {
|
|
111
|
+
mrb_value v = RARRAY_PTR(ary)[i];
|
|
112
|
+
if (mrb_array_p(v) &&
|
|
113
|
+
RARRAY_LEN(v) > 1 &&
|
|
114
|
+
mrb_equal(mrb, RARRAY_PTR(v)[1], value))
|
|
115
|
+
return v;
|
|
116
|
+
}
|
|
117
|
+
return mrb_nil_value();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*
|
|
121
|
+
* call-seq:
|
|
122
|
+
* ary.at(index) -> obj or nil
|
|
123
|
+
*
|
|
124
|
+
* Returns the element at _index_. A
|
|
125
|
+
* negative index counts from the end of `self`. Returns `nil`
|
|
126
|
+
* if the index is out of range. See also `Array#[]`.
|
|
127
|
+
*
|
|
128
|
+
* a = [ "a", "b", "c", "d", "e" ]
|
|
129
|
+
* a.at(0) #=> "a"
|
|
130
|
+
* a.at(-1) #=> "e"
|
|
131
|
+
*/
|
|
132
|
+
|
|
133
|
+
static mrb_value
|
|
134
|
+
ary_at(mrb_state *mrb, mrb_value ary)
|
|
135
|
+
{
|
|
136
|
+
mrb_int pos = mrb_as_int(mrb, mrb_get_arg1(mrb));
|
|
137
|
+
|
|
138
|
+
return mrb_ary_entry(ary, pos);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Helper function for values_at - returns element at index n */
|
|
142
|
+
static mrb_value
|
|
143
|
+
ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
|
|
144
|
+
{
|
|
145
|
+
return mrb_ary_entry(ary, n);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/*
|
|
149
|
+
* call-seq:
|
|
150
|
+
* ary.values_at(selector, ...) -> new_ary
|
|
151
|
+
*
|
|
152
|
+
* Returns an array containing the elements in `self` corresponding to the
|
|
153
|
+
* given `selector`(s). The selectors may be either integer indices or ranges.
|
|
154
|
+
*
|
|
155
|
+
* a = %w{ a b c d e f }
|
|
156
|
+
* a.values_at(1, 3, 5) # => ["b", "d", "f"]
|
|
157
|
+
* a.values_at(1, 3, 5, 7) # => ["b", "d", "f", nil]
|
|
158
|
+
* a.values_at(-1, -2, -2, -7) # => ["f", "e", "e", nil]
|
|
159
|
+
* a.values_at(4..6, 3...6) # => ["e", "f", nil, "d", "e", "f"]
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
static mrb_value
|
|
163
|
+
ary_values_at(mrb_state *mrb, mrb_value self)
|
|
164
|
+
{
|
|
165
|
+
mrb_int argc = mrb_get_argc(mrb);
|
|
166
|
+
const mrb_value *argv = mrb_get_argv(mrb);
|
|
167
|
+
|
|
168
|
+
return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, ary_ref);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
mrb_value mrb_ary_delete_at(mrb_state *mrb, mrb_value self);
|
|
172
|
+
|
|
173
|
+
/*
|
|
174
|
+
* call-seq:
|
|
175
|
+
* ary.slice!(index) -> obj or nil
|
|
176
|
+
* ary.slice!(start, length) -> new_ary or nil
|
|
177
|
+
* ary.slice!(range) -> new_ary or nil
|
|
178
|
+
*
|
|
179
|
+
* Deletes the element(s) given by an `index` (optionally up to `length`
|
|
180
|
+
* elements) or by a `range`.
|
|
181
|
+
*
|
|
182
|
+
* Returns the deleted object (or objects), or `nil` if the `index` is out of
|
|
183
|
+
* range.
|
|
184
|
+
*
|
|
185
|
+
* a = [ "a", "b", "c" ]
|
|
186
|
+
* a.slice!(1) #=> "b"
|
|
187
|
+
* a #=> ["a", "c"]
|
|
188
|
+
* a.slice!(-1) #=> "c"
|
|
189
|
+
* a #=> ["a"]
|
|
190
|
+
* a.slice!(100) #=> nil
|
|
191
|
+
* a #=> ["a"]
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
static mrb_value
|
|
195
|
+
ary_slice_bang(mrb_state *mrb, mrb_value self)
|
|
196
|
+
{
|
|
197
|
+
struct RArray *a = mrb_ary_ptr(self);
|
|
198
|
+
mrb_int i, len;
|
|
199
|
+
|
|
200
|
+
mrb_ary_modify(mrb, a);
|
|
201
|
+
|
|
202
|
+
if (mrb_get_argc(mrb) == 1) {
|
|
203
|
+
mrb_value index = mrb_get_arg1(mrb);
|
|
204
|
+
|
|
205
|
+
if (mrb_type(index) == MRB_TT_RANGE) {
|
|
206
|
+
if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) != MRB_RANGE_OK) {
|
|
207
|
+
return mrb_nil_value();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return mrb_ary_delete_at(mrb, self);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
mrb_get_args(mrb, "ii", &i, &len);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
mrb_int alen = ARY_LEN(a);
|
|
219
|
+
if (i < 0) i += alen;
|
|
220
|
+
if (i < 0 || alen < i) return mrb_nil_value();
|
|
221
|
+
if (len < 0) return mrb_nil_value();
|
|
222
|
+
if (alen == i) return mrb_ary_new(mrb);
|
|
223
|
+
if (len > alen - i) len = alen - i;
|
|
224
|
+
|
|
225
|
+
mrb_value ary = mrb_ary_new_from_values(mrb, len, ARY_PTR(a) + i);
|
|
226
|
+
|
|
227
|
+
/* refresh pointer after mrb_ary_new_from_values */
|
|
228
|
+
a = mrb_ary_ptr(self);
|
|
229
|
+
|
|
230
|
+
for (int j = i; j < alen - len; j++) {
|
|
231
|
+
ARY_PTR(a)[j] = ARY_PTR(a)[j+len];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
mrb_ary_resize(mrb, self, alen - len);
|
|
235
|
+
return ary;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/*
|
|
239
|
+
* call-seq:
|
|
240
|
+
* ary.compact! -> ary or nil
|
|
241
|
+
*
|
|
242
|
+
* Removes `nil` elements from the array.
|
|
243
|
+
* Returns `nil` if no changes were made, otherwise returns
|
|
244
|
+
* *ary*.
|
|
245
|
+
*
|
|
246
|
+
* [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
|
|
247
|
+
* [ "a", "b", "c" ].compact! #=> nil
|
|
248
|
+
*/
|
|
249
|
+
static mrb_value
|
|
250
|
+
ary_compact_bang(mrb_state *mrb, mrb_value self)
|
|
251
|
+
{
|
|
252
|
+
struct RArray *a = mrb_ary_ptr(self);
|
|
253
|
+
mrb_int i, j = 0;
|
|
254
|
+
mrb_int len = ARY_LEN(a);
|
|
255
|
+
|
|
256
|
+
mrb_ary_modify(mrb, a);
|
|
257
|
+
/* a is still valid here, as mrb_ary_modify only modifies the RArray struct, not reallocates it */
|
|
258
|
+
/* Hoist pointer retrieval outside loop to avoid repeated conditionals */
|
|
259
|
+
mrb_value *ptr = RARRAY_PTR(self);
|
|
260
|
+
for (i = 0; i < len; i++) {
|
|
261
|
+
if (!mrb_nil_p(ptr[i])) {
|
|
262
|
+
if (i != j) ptr[j] = ptr[i];
|
|
263
|
+
j++;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (i == j) return mrb_nil_value();
|
|
267
|
+
ARY_SET_LEN(RARRAY(self), j);
|
|
268
|
+
return self;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/*
|
|
272
|
+
* call-seq:
|
|
273
|
+
* ary.compact -> new_ary
|
|
274
|
+
*
|
|
275
|
+
* Returns a copy of `self` with all `nil` elements removed.
|
|
276
|
+
*
|
|
277
|
+
* [ "a", nil, "b", nil, "c", nil ].compact
|
|
278
|
+
* #=> [ "a", "b", "c" ]
|
|
279
|
+
*/
|
|
280
|
+
|
|
281
|
+
static mrb_value
|
|
282
|
+
ary_compact(mrb_state *mrb, mrb_value self)
|
|
283
|
+
{
|
|
284
|
+
mrb_value ary = mrb_ary_dup(mrb, self);
|
|
285
|
+
ary_compact_bang(mrb, ary);
|
|
286
|
+
return ary;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
/*
|
|
291
|
+
* call-seq:
|
|
292
|
+
* ary.rotate(count=1) -> new_ary
|
|
293
|
+
*
|
|
294
|
+
* Returns a new array by rotating `self` so that the element at `count` is
|
|
295
|
+
* the first element of the new array.
|
|
296
|
+
*
|
|
297
|
+
* If `count` is negative then it rotates in the opposite direction, starting
|
|
298
|
+
* from the end of `self` where +-1+ is the last element.
|
|
299
|
+
*
|
|
300
|
+
* a = [ "a", "b", "c", "d" ]
|
|
301
|
+
* a.rotate #=> ["b", "c", "d", "a"]
|
|
302
|
+
* a #=> ["a", "b", "c", "d"]
|
|
303
|
+
* a.rotate(2) #=> ["c", "d", "a", "b"]
|
|
304
|
+
* a.rotate(-3) #=> ["b", "c", "d", "a"]
|
|
305
|
+
*/
|
|
306
|
+
static mrb_value
|
|
307
|
+
ary_rotate(mrb_state *mrb, mrb_value self)
|
|
308
|
+
{
|
|
309
|
+
mrb_int count=1;
|
|
310
|
+
mrb_get_args(mrb, "|i", &count);
|
|
311
|
+
|
|
312
|
+
mrb_value ary = mrb_ary_new(mrb);
|
|
313
|
+
mrb_int len = RARRAY_LEN(self);
|
|
314
|
+
mrb_int idx;
|
|
315
|
+
|
|
316
|
+
if (len <= 0) return ary;
|
|
317
|
+
if (count < 0) {
|
|
318
|
+
idx = len - (~count % len) - 1;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
idx = count % len;
|
|
322
|
+
}
|
|
323
|
+
/* Hoist pointer retrieval outside loop */
|
|
324
|
+
mrb_value *ptr = RARRAY_PTR(self);
|
|
325
|
+
for (mrb_int i = 0; i<len; i++) {
|
|
326
|
+
mrb_ary_push(mrb, ary, ptr[idx++]);
|
|
327
|
+
if (idx == len) idx = 0;
|
|
328
|
+
}
|
|
329
|
+
return ary;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/* Helper function to reverse array elements in-place between beg and end indices */
|
|
333
|
+
static void
|
|
334
|
+
rev(mrb_value *p, mrb_int beg, mrb_int end)
|
|
335
|
+
{
|
|
336
|
+
for (mrb_int i=beg,j=end-1; i<j; i++,j--) {
|
|
337
|
+
mrb_value v = p[i];
|
|
338
|
+
p[i] = p[j];
|
|
339
|
+
p[j] = v;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/*
|
|
344
|
+
* call-seq:
|
|
345
|
+
* ary.rotate!(count=1) -> ary
|
|
346
|
+
*
|
|
347
|
+
* Rotates `self` in place so that the element at `count` comes first, and
|
|
348
|
+
* returns `self`.
|
|
349
|
+
*
|
|
350
|
+
* If `count` is negative then it rotates in the opposite direction, starting
|
|
351
|
+
* from the end of the array where `-1` is the last element.
|
|
352
|
+
*
|
|
353
|
+
* a = [ "a", "b", "c", "d" ]
|
|
354
|
+
* a.rotate! #=> ["b", "c", "d", "a"]
|
|
355
|
+
* a #=> ["b", "c", "d", "a"]
|
|
356
|
+
* a.rotate!(2) #=> ["d", "a", "b", "c"]
|
|
357
|
+
* a.rotate!(-3) #=> ["a", "b", "c", "d"]
|
|
358
|
+
*/
|
|
359
|
+
static mrb_value
|
|
360
|
+
ary_rotate_bang(mrb_state *mrb, mrb_value self)
|
|
361
|
+
{
|
|
362
|
+
mrb_int count=1;
|
|
363
|
+
mrb_get_args(mrb, "|i", &count);
|
|
364
|
+
|
|
365
|
+
struct RArray *a = mrb_ary_ptr(self);
|
|
366
|
+
mrb_int len = ARY_LEN(a);
|
|
367
|
+
mrb_int idx;
|
|
368
|
+
|
|
369
|
+
mrb_ary_modify(mrb, a);
|
|
370
|
+
mrb_value *p = ARY_PTR(a);
|
|
371
|
+
if (len == 0 || count == 0) return self;
|
|
372
|
+
if (count == 1) {
|
|
373
|
+
mrb_value v = p[0];
|
|
374
|
+
for (mrb_int i=1; i<len; i++) {
|
|
375
|
+
p[i-1] = p[i];
|
|
376
|
+
}
|
|
377
|
+
p[len-1] = v;
|
|
378
|
+
return self;
|
|
379
|
+
}
|
|
380
|
+
if (count < 0) {
|
|
381
|
+
idx = len - (~count % len) - 1;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
idx = count % len;
|
|
385
|
+
}
|
|
386
|
+
/* e.g. [1,2,3,4,5].rotate!(2) -> [3,4,5,1,2] */
|
|
387
|
+
/* first, reverse the whole array */
|
|
388
|
+
/* [1,2,3,4,5] -> [5,4,3,2,1] */
|
|
389
|
+
rev(p, 0, len);
|
|
390
|
+
/* then, re-reverse part before idx */
|
|
391
|
+
/* [5,4,3,2,1] -> [3,4,5,2,1] */
|
|
392
|
+
/* ^idx ~~~~~ */
|
|
393
|
+
rev(p, 0, len-idx);
|
|
394
|
+
/* finally, re-reverse part after idx */
|
|
395
|
+
/* [3,4,5,2,1] -> [3,4,5,1,2] */
|
|
396
|
+
/* ^idx ~~~ */
|
|
397
|
+
rev(p, len-idx, len);
|
|
398
|
+
return self;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
#define SET_OP_HASH_THRESHOLD 32
|
|
402
|
+
|
|
403
|
+
/* Helper functions for temporary khash sets */
|
|
404
|
+
static void
|
|
405
|
+
ary_init_temp_set(mrb_state *mrb, ary_set_t *set, mrb_int capacity)
|
|
406
|
+
{
|
|
407
|
+
kh_init_data(ary_set, mrb, set, (khint_t)(capacity > 0 ? capacity : 8));
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
static void
|
|
411
|
+
ary_populate_temp_set(mrb_state *mrb, ary_set_t *set, mrb_value ary)
|
|
412
|
+
{
|
|
413
|
+
mrb_int len = RARRAY_LEN(ary);
|
|
414
|
+
for (mrb_int i = 0; i < len; i++) {
|
|
415
|
+
kh_put(ary_set, mrb, set, RARRAY_PTR(ary)[i]);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
static void
|
|
420
|
+
ary_destroy_temp_set(mrb_state *mrb, ary_set_t *set)
|
|
421
|
+
{
|
|
422
|
+
if (set) {
|
|
423
|
+
kh_destroy_data(ary_set, mrb, set);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
static mrb_int
|
|
429
|
+
ary_get_array_args(mrb_state *mrb, mrb_int argc, const mrb_value **argv_ptr)
|
|
430
|
+
{
|
|
431
|
+
mrb_int total_len = 0;
|
|
432
|
+
const mrb_value *argv = *argv_ptr;
|
|
433
|
+
mrb_value *converted_argv = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
|
|
434
|
+
|
|
435
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
436
|
+
mrb_value other = mrb_check_array_type(mrb, argv[i]);
|
|
437
|
+
if (mrb_nil_p(other)) {
|
|
438
|
+
mrb_raise(mrb, E_TYPE_ERROR, "can't convert passed argument to Array");
|
|
439
|
+
}
|
|
440
|
+
converted_argv[i] = other;
|
|
441
|
+
total_len += RARRAY_LEN(other);
|
|
442
|
+
}
|
|
443
|
+
*argv_ptr = converted_argv;
|
|
444
|
+
return total_len;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
struct ary_subtract_ctx {
|
|
448
|
+
ary_set_t *set;
|
|
449
|
+
mrb_value self;
|
|
450
|
+
mrb_value result;
|
|
451
|
+
const mrb_value *argv;
|
|
452
|
+
mrb_int argc;
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
static mrb_value
|
|
456
|
+
ary_subtract_body(mrb_state *mrb, void *data)
|
|
457
|
+
{
|
|
458
|
+
struct ary_subtract_ctx *ctx = (struct ary_subtract_ctx *)data;
|
|
459
|
+
|
|
460
|
+
for (mrb_int i = 0; i < ctx->argc; i++) {
|
|
461
|
+
ary_populate_temp_set(mrb, ctx->set, ctx->argv[i]);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ctx->self); i++) {
|
|
465
|
+
mrb_value p = RARRAY_PTR(ctx->self)[i];
|
|
466
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, p);
|
|
467
|
+
if (kh_is_end(ctx->set, k)) { /* key doesn't exist in any ary */
|
|
468
|
+
mrb_ary_push(mrb, ctx->result, p);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
return ctx->result;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
static mrb_value
|
|
476
|
+
ary_subtract_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
|
|
477
|
+
{
|
|
478
|
+
if (argc == 0) {
|
|
479
|
+
return mrb_ary_dup(mrb, self);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
mrb_int total_len = ary_get_array_args(mrb, argc, &argv);
|
|
483
|
+
|
|
484
|
+
mrb_value result = mrb_ary_new(mrb);
|
|
485
|
+
|
|
486
|
+
if (total_len > SET_OP_HASH_THRESHOLD) {
|
|
487
|
+
/* Create shared copies to protect elements during khash operations */
|
|
488
|
+
mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
|
|
489
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
490
|
+
argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
ary_set_t set_struct;
|
|
494
|
+
ary_set_t *set = &set_struct;
|
|
495
|
+
ary_init_temp_set(mrb, set, total_len);
|
|
496
|
+
|
|
497
|
+
struct ary_subtract_ctx ctx = { set, self, result, argv_copies, argc };
|
|
498
|
+
MRB_ENSURE(mrb, result, ary_subtract_body, &ctx) {
|
|
499
|
+
ary_destroy_temp_set(mrb, set);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
mrb_int self_len = RARRAY_LEN(self);
|
|
504
|
+
for (mrb_int i = 0; i < self_len; i++) {
|
|
505
|
+
mrb_value p = RARRAY_PTR(self)[i];
|
|
506
|
+
mrb_bool found = FALSE;
|
|
507
|
+
for (mrb_int j = 0; j < argc; j++) {
|
|
508
|
+
mrb_int len = RARRAY_LEN(argv[j]);
|
|
509
|
+
for (mrb_int k = 0; k < len; k++) {
|
|
510
|
+
if (mrb_equal(mrb, p, RARRAY_PTR(argv[j])[k])) {
|
|
511
|
+
found = TRUE;
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (found) break;
|
|
516
|
+
}
|
|
517
|
+
if (!found) {
|
|
518
|
+
mrb_ary_push(mrb, result, p);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/*
|
|
527
|
+
* call-seq:
|
|
528
|
+
* ary - other_ary -> new_ary
|
|
529
|
+
*
|
|
530
|
+
* Returns a new array that is a copy of the original array, with any items
|
|
531
|
+
* that also appear in `other_ary` removed.
|
|
532
|
+
*
|
|
533
|
+
* [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
|
|
534
|
+
*/
|
|
535
|
+
|
|
536
|
+
static mrb_value
|
|
537
|
+
ary_sub(mrb_state *mrb, mrb_value self)
|
|
538
|
+
{
|
|
539
|
+
mrb_value other;
|
|
540
|
+
mrb_get_args(mrb, "A", &other);
|
|
541
|
+
return ary_subtract_internal(mrb, self, 1, &other);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/*
|
|
545
|
+
* call-seq:
|
|
546
|
+
* ary.difference(other_ary, ...) -> new_ary
|
|
547
|
+
*
|
|
548
|
+
* Returns a new array that is a copy of the original array, removing all
|
|
549
|
+
* occurrences of any item that also appear in any of the `other_ary`s.
|
|
550
|
+
* The order is preserved from the original array.
|
|
551
|
+
*
|
|
552
|
+
* [1, 2, 3, 4, 5].difference([2, 4], [1, 5]) #=> [3]
|
|
553
|
+
*/
|
|
554
|
+
static mrb_value
|
|
555
|
+
ary_difference(mrb_state *mrb, mrb_value self)
|
|
556
|
+
{
|
|
557
|
+
const mrb_value *argv;
|
|
558
|
+
mrb_int argc;
|
|
559
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
560
|
+
return ary_subtract_internal(mrb, self, argc, argv);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
static void
|
|
565
|
+
add_uniq(mrb_state *mrb, mrb_value item, mrb_value result)
|
|
566
|
+
{
|
|
567
|
+
const mrb_int len = RARRAY_LEN(result);
|
|
568
|
+
for (mrb_int i = 0; i < len; i++) {
|
|
569
|
+
if (mrb_eql(mrb, item, RARRAY_PTR(result)[i])) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
mrb_ary_push(mrb, result, item);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
struct ary_union_ctx {
|
|
577
|
+
ary_set_t *set;
|
|
578
|
+
mrb_value self_copy;
|
|
579
|
+
mrb_value result;
|
|
580
|
+
const mrb_value *argv;
|
|
581
|
+
mrb_int argc;
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
static mrb_value
|
|
585
|
+
ary_union_body(mrb_state *mrb, void *data)
|
|
586
|
+
{
|
|
587
|
+
struct ary_union_ctx *ctx = (struct ary_union_ctx *)data;
|
|
588
|
+
|
|
589
|
+
/* Add unique elements from self */
|
|
590
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ctx->self_copy); i++) {
|
|
591
|
+
mrb_value elem = RARRAY_PTR(ctx->self_copy)[i];
|
|
592
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
|
|
593
|
+
if (kh_is_end(ctx->set, k)) {
|
|
594
|
+
kh_put(ary_set, mrb, ctx->set, elem);
|
|
595
|
+
mrb_ary_push(mrb, ctx->result, elem);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/* Add unique elements from others */
|
|
600
|
+
for (mrb_int i = 0; i < ctx->argc; i++) {
|
|
601
|
+
mrb_value other = ctx->argv[i];
|
|
602
|
+
for (mrb_int j = 0; j < RARRAY_LEN(other); j++) {
|
|
603
|
+
mrb_value elem = RARRAY_PTR(other)[j];
|
|
604
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
|
|
605
|
+
if (kh_is_end(ctx->set, k)) {
|
|
606
|
+
kh_put(ary_set, mrb, ctx->set, elem);
|
|
607
|
+
mrb_ary_push(mrb, ctx->result, elem);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
return ctx->result;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
static mrb_value
|
|
616
|
+
ary_union_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
|
|
617
|
+
{
|
|
618
|
+
mrb_int total_len = ary_get_array_args(mrb, argc, &argv) + RARRAY_LEN(self);
|
|
619
|
+
|
|
620
|
+
mrb_value result = mrb_ary_new(mrb);
|
|
621
|
+
|
|
622
|
+
if (total_len > SET_OP_HASH_THRESHOLD) {
|
|
623
|
+
/* Create shared copies to protect elements during khash operations */
|
|
624
|
+
mrb_value self_copy = mrb_ary_make_shared_copy(mrb, self);
|
|
625
|
+
mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
|
|
626
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
627
|
+
argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
ary_set_t set_struct;
|
|
631
|
+
ary_set_t *set = &set_struct;
|
|
632
|
+
ary_init_temp_set(mrb, set, total_len);
|
|
633
|
+
|
|
634
|
+
struct ary_union_ctx ctx = { set, self_copy, result, argv_copies, argc };
|
|
635
|
+
MRB_ENSURE(mrb, result, ary_union_body, &ctx) {
|
|
636
|
+
ary_destroy_temp_set(mrb, set);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
else {
|
|
640
|
+
/* Use linear search for small arrays */
|
|
641
|
+
/* Add unique elements from self */
|
|
642
|
+
mrb_int alen = RARRAY_LEN(self);
|
|
643
|
+
for (mrb_int i = 0; i < alen; i++) {
|
|
644
|
+
add_uniq(mrb, RARRAY_PTR(self)[i], result);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/* Add unique elements from others */
|
|
648
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
649
|
+
mrb_value other = argv[i];
|
|
650
|
+
mrb_int olen = RARRAY_LEN(other);
|
|
651
|
+
for (mrb_int j = 0; j < olen; j++) {
|
|
652
|
+
add_uniq(mrb, RARRAY_PTR(other)[j], result);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
return result;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/*
|
|
661
|
+
* call-seq:
|
|
662
|
+
* ary | other_ary -> new_ary
|
|
663
|
+
*
|
|
664
|
+
* Set Union---Returns a new array by joining this array with
|
|
665
|
+
* `other_ary`, removing duplicates.
|
|
666
|
+
*
|
|
667
|
+
* [ "a", "b", "c" ] | [ "c", "d", "a" ]
|
|
668
|
+
* #=> [ "a", "b", "c", "d" ]
|
|
669
|
+
*/
|
|
670
|
+
|
|
671
|
+
static mrb_value
|
|
672
|
+
ary_union(mrb_state *mrb, mrb_value self)
|
|
673
|
+
{
|
|
674
|
+
mrb_value other;
|
|
675
|
+
mrb_get_args(mrb, "A", &other);
|
|
676
|
+
return ary_union_internal(mrb, self, 1, &other);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/*
|
|
680
|
+
* call-seq:
|
|
681
|
+
* ary.union(other_ary,...) -> new_ary
|
|
682
|
+
*
|
|
683
|
+
* Set Union---Returns a new array by joining this array with
|
|
684
|
+
* `other_ary`s, removing duplicates.
|
|
685
|
+
*
|
|
686
|
+
* ["a", "b", "c"].union(["c", "d", "a"], ["a", "c", "e"])
|
|
687
|
+
* #=> ["a", "b", "c", "d", "e"]
|
|
688
|
+
*/
|
|
689
|
+
static mrb_value
|
|
690
|
+
ary_union_multi(mrb_state *mrb, mrb_value self)
|
|
691
|
+
{
|
|
692
|
+
const mrb_value *argv;
|
|
693
|
+
mrb_int argc;
|
|
694
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
695
|
+
return ary_union_internal(mrb, self, argc, argv);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
struct ary_intersection_ctx {
|
|
699
|
+
ary_set_t *set;
|
|
700
|
+
mrb_value self;
|
|
701
|
+
mrb_value result;
|
|
702
|
+
const mrb_value *argv;
|
|
703
|
+
mrb_int argc;
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
static mrb_value
|
|
707
|
+
ary_intersection_body(mrb_state *mrb, void *data)
|
|
708
|
+
{
|
|
709
|
+
struct ary_intersection_ctx *ctx = (struct ary_intersection_ctx *)data;
|
|
710
|
+
|
|
711
|
+
for (mrb_int i = 0; i < ctx->argc; i++) {
|
|
712
|
+
ary_populate_temp_set(mrb, ctx->set, ctx->argv[i]);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ctx->self); i++) {
|
|
716
|
+
mrb_value p = RARRAY_PTR(ctx->self)[i];
|
|
717
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, p);
|
|
718
|
+
if (!kh_is_end(ctx->set, k)) {
|
|
719
|
+
mrb_ary_push(mrb, ctx->result, p);
|
|
720
|
+
kh_del(ary_set, mrb, ctx->set, k);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return ctx->result;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
static mrb_value
|
|
728
|
+
ary_intersection_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
|
|
729
|
+
{
|
|
730
|
+
if (argc == 0) {
|
|
731
|
+
return mrb_ary_new(mrb);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
mrb_int total_len = ary_get_array_args(mrb, argc, &argv);
|
|
735
|
+
|
|
736
|
+
mrb_value result = mrb_ary_new(mrb);
|
|
737
|
+
|
|
738
|
+
if (total_len > SET_OP_HASH_THRESHOLD) {
|
|
739
|
+
/* Create shared copies to protect elements during khash operations */
|
|
740
|
+
mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
|
|
741
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
742
|
+
argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
ary_set_t set_struct;
|
|
746
|
+
ary_set_t *set = &set_struct;
|
|
747
|
+
ary_init_temp_set(mrb, set, total_len);
|
|
748
|
+
|
|
749
|
+
struct ary_intersection_ctx ctx = { set, self, result, argv_copies, argc };
|
|
750
|
+
MRB_ENSURE(mrb, result, ary_intersection_body, &ctx) {
|
|
751
|
+
ary_destroy_temp_set(mrb, set);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
mrb_int self_len = RARRAY_LEN(self);
|
|
756
|
+
for (mrb_int i = 0; i < self_len; i++) {
|
|
757
|
+
mrb_value p = RARRAY_PTR(self)[i];
|
|
758
|
+
mrb_bool found_in_all = TRUE;
|
|
759
|
+
|
|
760
|
+
for (mrb_int j = 0; j < argc; j++) {
|
|
761
|
+
mrb_bool found_in_current_other = FALSE;
|
|
762
|
+
mrb_int len = RARRAY_LEN(argv[j]);
|
|
763
|
+
for (mrb_int k = 0; k < len; k++) {
|
|
764
|
+
if (mrb_equal(mrb, p, RARRAY_PTR(argv[j])[k])) {
|
|
765
|
+
found_in_current_other = TRUE;
|
|
766
|
+
break;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
if (!found_in_current_other) {
|
|
770
|
+
found_in_all = FALSE;
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
if (found_in_all) {
|
|
776
|
+
mrb_bool already_added = FALSE;
|
|
777
|
+
mrb_int result_len = RARRAY_LEN(result);
|
|
778
|
+
for (mrb_int j = 0; j < result_len; j++) {
|
|
779
|
+
if (mrb_equal(mrb, p, RARRAY_PTR(result)[j])) {
|
|
780
|
+
already_added = TRUE;
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
if (!already_added) {
|
|
785
|
+
mrb_ary_push(mrb, result, p);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return result;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/*
|
|
794
|
+
* call-seq:
|
|
795
|
+
* ary & other_ary -> new_ary
|
|
796
|
+
*
|
|
797
|
+
* Set Intersection---Returns a new array
|
|
798
|
+
* containing elements common to the two arrays, with no duplicates.
|
|
799
|
+
*
|
|
800
|
+
* [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
|
|
801
|
+
*/
|
|
802
|
+
|
|
803
|
+
static mrb_value
|
|
804
|
+
ary_intersection(mrb_state *mrb, mrb_value self)
|
|
805
|
+
{
|
|
806
|
+
mrb_value other;
|
|
807
|
+
mrb_get_args(mrb, "A", &other);
|
|
808
|
+
return ary_intersection_internal(mrb, self, 1, &other);
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
/*
|
|
812
|
+
* call-seq:
|
|
813
|
+
* ary.intersection(other_ary,...) -> new_ary
|
|
814
|
+
*
|
|
815
|
+
* Set Intersection---Returns a new array containing elements common to
|
|
816
|
+
* this array and `other_ary`s, removing duplicates. The order is
|
|
817
|
+
* preserved from the original array.
|
|
818
|
+
*
|
|
819
|
+
* [1, 2, 3].intersection([3, 4, 1], [1, 3, 5]) #=> [1, 3]
|
|
820
|
+
*/
|
|
821
|
+
static mrb_value
|
|
822
|
+
ary_intersection_multi(mrb_state *mrb, mrb_value self)
|
|
823
|
+
{
|
|
824
|
+
const mrb_value *argv;
|
|
825
|
+
mrb_int argc;
|
|
826
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
827
|
+
return ary_intersection_internal(mrb, self, argc, argv);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/*
|
|
831
|
+
* call-seq:
|
|
832
|
+
* ary.intersect?(other_ary) -> true or false
|
|
833
|
+
*
|
|
834
|
+
* Returns `true` if the array and `other_ary` have at least one element in
|
|
835
|
+
* common, otherwise returns `false`.
|
|
836
|
+
*
|
|
837
|
+
* a = [ 1, 2, 3 ]
|
|
838
|
+
* b = [ 3, 4, 5 ]
|
|
839
|
+
* c = [ 5, 6, 7 ]
|
|
840
|
+
* a.intersect?(b) #=> true
|
|
841
|
+
* a.intersect?(c) #=> false
|
|
842
|
+
*/
|
|
843
|
+
|
|
844
|
+
struct ary_intersect_p_ctx {
|
|
845
|
+
ary_set_t *set;
|
|
846
|
+
mrb_value shorter_ary_copy;
|
|
847
|
+
mrb_value longer_ary;
|
|
848
|
+
mrb_bool *found;
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
static mrb_value
|
|
852
|
+
ary_intersect_p_body(mrb_state *mrb, void *data)
|
|
853
|
+
{
|
|
854
|
+
struct ary_intersect_p_ctx *ctx = (struct ary_intersect_p_ctx *)data;
|
|
855
|
+
|
|
856
|
+
ary_populate_temp_set(mrb, ctx->set, ctx->shorter_ary_copy);
|
|
857
|
+
|
|
858
|
+
for (mrb_int i = 0; i < RARRAY_LEN(ctx->longer_ary); i++) {
|
|
859
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, RARRAY_PTR(ctx->longer_ary)[i]);
|
|
860
|
+
if (!kh_is_end(ctx->set, k)) {
|
|
861
|
+
*ctx->found = TRUE;
|
|
862
|
+
break;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
return mrb_nil_value();
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
static mrb_value
|
|
870
|
+
ary_intersect_p(mrb_state *mrb, mrb_value self)
|
|
871
|
+
{
|
|
872
|
+
mrb_value other;
|
|
873
|
+
mrb_get_args(mrb, "A", &other);
|
|
874
|
+
|
|
875
|
+
mrb_value shorter_ary, longer_ary;
|
|
876
|
+
if (RARRAY_LEN(self) > RARRAY_LEN(other)) {
|
|
877
|
+
shorter_ary = other;
|
|
878
|
+
longer_ary = self;
|
|
879
|
+
}
|
|
880
|
+
else {
|
|
881
|
+
shorter_ary = self;
|
|
882
|
+
longer_ary = other;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
if (RARRAY_LEN(shorter_ary) == 0 || RARRAY_LEN(longer_ary) == 0) {
|
|
886
|
+
return mrb_false_value();
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
if (RARRAY_LEN(shorter_ary) > SET_OP_HASH_THRESHOLD) {
|
|
890
|
+
mrb_value shorter_ary_copy = mrb_ary_make_shared_copy(mrb, shorter_ary);
|
|
891
|
+
|
|
892
|
+
ary_set_t set_struct;
|
|
893
|
+
ary_set_t *set = &set_struct;
|
|
894
|
+
ary_init_temp_set(mrb, set, RARRAY_LEN(shorter_ary_copy));
|
|
895
|
+
|
|
896
|
+
mrb_bool found = FALSE;
|
|
897
|
+
|
|
898
|
+
struct ary_intersect_p_ctx ctx = { set, shorter_ary_copy, longer_ary, &found };
|
|
899
|
+
mrb_value result;
|
|
900
|
+
MRB_ENSURE(mrb, result, ary_intersect_p_body, &ctx) {
|
|
901
|
+
ary_destroy_temp_set(mrb, set);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
if (found) {
|
|
905
|
+
return mrb_true_value();
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
else {
|
|
909
|
+
for (mrb_int i = 0; i < RARRAY_LEN(longer_ary); i++) {
|
|
910
|
+
for (mrb_int j = 0; j < RARRAY_LEN(shorter_ary); j++) {
|
|
911
|
+
if (mrb_equal(mrb, RARRAY_PTR(longer_ary)[i], RARRAY_PTR(shorter_ary)[j])) {
|
|
912
|
+
return mrb_true_value();
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
return mrb_false_value();
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
/*
|
|
922
|
+
* Internal helper for Array#fill that handles all the complex
|
|
923
|
+
* argument parsing logic including ranges, negative indices, etc.
|
|
924
|
+
* Returns normalized [start, length] array for use by ary_fill_exec.
|
|
925
|
+
*/
|
|
926
|
+
|
|
927
|
+
static mrb_value
|
|
928
|
+
ary_fill_parse_arg(mrb_state *mrb, mrb_value self)
|
|
929
|
+
{
|
|
930
|
+
mrb_value arg0 = mrb_nil_value(), arg1 = mrb_nil_value(), arg2 = mrb_nil_value();
|
|
931
|
+
mrb_value block = mrb_nil_value();
|
|
932
|
+
mrb_int argc = mrb_get_args(mrb, "|ooo&", &arg0, &arg1, &arg2, &block);
|
|
933
|
+
|
|
934
|
+
struct RArray *ary = mrb_ary_ptr(self);
|
|
935
|
+
mrb_int ary_len = ARY_LEN(ary);
|
|
936
|
+
mrb_int start = 0, length = 0;
|
|
937
|
+
|
|
938
|
+
if (!mrb_nil_p(block)) {
|
|
939
|
+
if (argc == 0 || (argc >= 1 && mrb_nil_p(arg0))) {
|
|
940
|
+
/* fill { |index| block } */
|
|
941
|
+
start = 0;
|
|
942
|
+
length = ary_len;
|
|
943
|
+
}
|
|
944
|
+
else if (argc >= 1 && mrb_range_p(arg0)) {
|
|
945
|
+
/* fill(range) { |index| block } */
|
|
946
|
+
mrb_int range_beg, range_end;
|
|
947
|
+
|
|
948
|
+
if (mrb_range_beg_len(mrb, arg0, &range_beg, &range_end, ary_len, 1)) {
|
|
949
|
+
start = range_beg;
|
|
950
|
+
length = range_end;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
else if (argc >= 1 && !mrb_nil_p(arg0)) {
|
|
954
|
+
/* fill(start [, length]) { |index| block } */
|
|
955
|
+
start = mrb_int(mrb, arg0);
|
|
956
|
+
if (start < 0) start += ary_len;
|
|
957
|
+
if (start < 0) start = 0;
|
|
958
|
+
|
|
959
|
+
if (argc == 1 || mrb_nil_p(arg1)) {
|
|
960
|
+
length = ary_len - start;
|
|
961
|
+
}
|
|
962
|
+
else {
|
|
963
|
+
length = mrb_int(mrb, arg1);
|
|
964
|
+
if (length < 0) length = 0;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
else {
|
|
969
|
+
if (argc >= 1 && !mrb_nil_p(arg0)) {
|
|
970
|
+
if (argc == 1 || (argc >= 2 && mrb_nil_p(arg1) && mrb_nil_p(arg2))) {
|
|
971
|
+
/* fill(obj) */
|
|
972
|
+
start = 0;
|
|
973
|
+
length = ary_len;
|
|
974
|
+
}
|
|
975
|
+
else if (argc >= 2 && mrb_range_p(arg1)) {
|
|
976
|
+
/* fill(obj, range) */
|
|
977
|
+
mrb_int range_beg, range_end;
|
|
978
|
+
|
|
979
|
+
if (mrb_range_beg_len(mrb, arg1, &range_beg, &range_end, ary_len, 1)) {
|
|
980
|
+
start = range_beg;
|
|
981
|
+
length = range_end;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
else if (argc >= 2 && !mrb_nil_p(arg1)) {
|
|
985
|
+
/* fill(obj, start [, length]) */
|
|
986
|
+
start = mrb_int(mrb, arg1);
|
|
987
|
+
if (start < 0) start += ary_len;
|
|
988
|
+
if (start < 0) start = 0;
|
|
989
|
+
|
|
990
|
+
if (argc == 2 || mrb_nil_p(arg2)) {
|
|
991
|
+
length = ary_len - start;
|
|
992
|
+
}
|
|
993
|
+
else {
|
|
994
|
+
length = mrb_int(mrb, arg2);
|
|
995
|
+
if (length < 0) length = 0;
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
/* Return [start, length] array */
|
|
1002
|
+
mrb_value result = mrb_ary_new_capa(mrb, 2);
|
|
1003
|
+
mrb_ary_push(mrb, result, mrb_fixnum_value(start));
|
|
1004
|
+
mrb_ary_push(mrb, result, mrb_fixnum_value(length));
|
|
1005
|
+
return result;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
/*
|
|
1009
|
+
* Internal helper that fills a specific range of the array
|
|
1010
|
+
* with the given object. Handles array extension if necessary.
|
|
1011
|
+
* Used by Ruby-level Array#fill method.
|
|
1012
|
+
*/
|
|
1013
|
+
|
|
1014
|
+
static mrb_value
|
|
1015
|
+
ary_fill_exec(mrb_state *mrb, mrb_value self)
|
|
1016
|
+
{
|
|
1017
|
+
mrb_value obj;
|
|
1018
|
+
mrb_int start, length;
|
|
1019
|
+
|
|
1020
|
+
mrb_get_args(mrb, "iio", &start, &length, &obj);
|
|
1021
|
+
|
|
1022
|
+
if (start < 0) {
|
|
1023
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative start index");
|
|
1024
|
+
}
|
|
1025
|
+
if (length < 0) {
|
|
1026
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative length");
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
struct RArray *ary = mrb_ary_ptr(self);
|
|
1030
|
+
mrb_int ary_len = ARY_LEN(ary);
|
|
1031
|
+
|
|
1032
|
+
/* Extend array if necessary */
|
|
1033
|
+
if (start + length > ary_len) {
|
|
1034
|
+
mrb_ary_resize(mrb, self, start + length);
|
|
1035
|
+
ary = mrb_ary_ptr(self); /* refresh pointer after resize */
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
/* Ensure we don't go beyond array bounds */
|
|
1039
|
+
if (start >= ARY_LEN(ary) || length <= 0) return self;
|
|
1040
|
+
if (start + length > ARY_LEN(ary)) {
|
|
1041
|
+
length = ARY_LEN(ary) - start;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
/* Fill the array */
|
|
1045
|
+
mrb_value *ptr = ARY_PTR(ary) + start;
|
|
1046
|
+
for (mrb_int i = 0; i < length; i++) {
|
|
1047
|
+
ptr[i] = obj;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
return self;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/*
|
|
1054
|
+
* Internal helper for Array#uniq! without blocks.
|
|
1055
|
+
* Modifies array in-place, returns nil if no changes.
|
|
1056
|
+
*/
|
|
1057
|
+
struct ary_uniq_bang_ctx {
|
|
1058
|
+
ary_set_t *set;
|
|
1059
|
+
mrb_value self_copy;
|
|
1060
|
+
mrb_value self;
|
|
1061
|
+
mrb_int *write_pos;
|
|
1062
|
+
mrb_int len;
|
|
1063
|
+
};
|
|
1064
|
+
|
|
1065
|
+
static mrb_value
|
|
1066
|
+
ary_uniq_bang_body(mrb_state *mrb, void *data)
|
|
1067
|
+
{
|
|
1068
|
+
struct ary_uniq_bang_ctx *ctx = (struct ary_uniq_bang_ctx *)data;
|
|
1069
|
+
|
|
1070
|
+
ary_populate_temp_set(mrb, ctx->set, ctx->self_copy);
|
|
1071
|
+
|
|
1072
|
+
for (mrb_int read_pos = 0; read_pos < ctx->len; read_pos++) {
|
|
1073
|
+
mrb_value elem = RARRAY_PTR(ctx->self)[read_pos];
|
|
1074
|
+
khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
|
|
1075
|
+
if (!kh_is_end(ctx->set, k)) {
|
|
1076
|
+
if (*ctx->write_pos != read_pos) {
|
|
1077
|
+
RARRAY_PTR(ctx->self)[*ctx->write_pos] = elem;
|
|
1078
|
+
}
|
|
1079
|
+
(*ctx->write_pos)++;
|
|
1080
|
+
kh_del(ary_set, mrb, ctx->set, k);
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
return mrb_nil_value();
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
static mrb_value
|
|
1088
|
+
ary_uniq_bang(mrb_state *mrb, mrb_value self)
|
|
1089
|
+
{
|
|
1090
|
+
mrb_int len = RARRAY_LEN(self);
|
|
1091
|
+
|
|
1092
|
+
if (len <= 1) {
|
|
1093
|
+
return mrb_nil_value();
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
mrb_ary_modify(mrb, mrb_ary_ptr(self));
|
|
1097
|
+
mrb_int write_pos = 0;
|
|
1098
|
+
|
|
1099
|
+
if (len > SET_OP_HASH_THRESHOLD) {
|
|
1100
|
+
/* Create shared copy to protect elements during khash operations */
|
|
1101
|
+
mrb_value self_copy = mrb_ary_make_shared_copy(mrb, self);
|
|
1102
|
+
|
|
1103
|
+
ary_set_t set_struct;
|
|
1104
|
+
ary_set_t *set = &set_struct;
|
|
1105
|
+
ary_init_temp_set(mrb, set, len);
|
|
1106
|
+
|
|
1107
|
+
struct ary_uniq_bang_ctx ctx = { set, self_copy, self, &write_pos, len };
|
|
1108
|
+
mrb_value result;
|
|
1109
|
+
MRB_ENSURE(mrb, result, ary_uniq_bang_body, &ctx) {
|
|
1110
|
+
ary_destroy_temp_set(mrb, set);
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
for (mrb_int read_pos = 0; read_pos < len; read_pos++) {
|
|
1115
|
+
mrb_value elem = RARRAY_PTR(self)[read_pos];
|
|
1116
|
+
mrb_bool found = FALSE;
|
|
1117
|
+
for (mrb_int j = 0; j < write_pos; j++) {
|
|
1118
|
+
if (mrb_equal(mrb, elem, RARRAY_PTR(self)[j])) {
|
|
1119
|
+
found = TRUE;
|
|
1120
|
+
break;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
if (!found) {
|
|
1124
|
+
if (write_pos != read_pos) {
|
|
1125
|
+
RARRAY_PTR(self)[write_pos] = elem;
|
|
1126
|
+
}
|
|
1127
|
+
write_pos++;
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
if (write_pos == len) {
|
|
1133
|
+
return mrb_nil_value();
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
mrb_ary_resize(mrb, self, write_pos);
|
|
1137
|
+
return self;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
/*
|
|
1141
|
+
* Internal helper for Array#uniq without blocks.
|
|
1142
|
+
* Uses hash-based deduplication for large arrays,
|
|
1143
|
+
* linear search for small arrays.
|
|
1144
|
+
*/
|
|
1145
|
+
static mrb_value
|
|
1146
|
+
ary_uniq(mrb_state *mrb, mrb_value self)
|
|
1147
|
+
{
|
|
1148
|
+
mrb_value ary = mrb_ary_dup(mrb, self);
|
|
1149
|
+
ary_uniq_bang(mrb, ary);
|
|
1150
|
+
return ary;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/* Internal helper for flatten operations using iterative stack-based approach */
|
|
1154
|
+
static mrb_value
|
|
1155
|
+
flatten_internal(mrb_state *mrb, mrb_value self, mrb_int level, mrb_bool *modified)
|
|
1156
|
+
{
|
|
1157
|
+
*modified = FALSE;
|
|
1158
|
+
mrb_value result = mrb_ary_new(mrb);
|
|
1159
|
+
mrb_value stack = mrb_ary_new(mrb);
|
|
1160
|
+
mrb_ary_push(mrb, stack, self);
|
|
1161
|
+
mrb_ary_push(mrb, stack, mrb_fixnum_value(0)); // index
|
|
1162
|
+
mrb_ary_push(mrb, stack, mrb_fixnum_value(1)); // depth
|
|
1163
|
+
|
|
1164
|
+
while (RARRAY_LEN(stack) > 0) {
|
|
1165
|
+
mrb_int depth = mrb_fixnum(mrb_ary_pop(mrb, stack));
|
|
1166
|
+
mrb_int idx = mrb_fixnum(mrb_ary_pop(mrb, stack));
|
|
1167
|
+
mrb_value ary = mrb_ary_pop(mrb, stack);
|
|
1168
|
+
|
|
1169
|
+
while (idx < RARRAY_LEN(ary)) {
|
|
1170
|
+
mrb_value e = mrb_ary_entry(ary, idx);
|
|
1171
|
+
idx++;
|
|
1172
|
+
|
|
1173
|
+
if (mrb_array_p(e) && (level < 0 || depth <= level)) {
|
|
1174
|
+
*modified = TRUE;
|
|
1175
|
+
// Push current state back
|
|
1176
|
+
mrb_ary_push(mrb, stack, ary);
|
|
1177
|
+
mrb_ary_push(mrb, stack, mrb_fixnum_value(idx));
|
|
1178
|
+
mrb_ary_push(mrb, stack, mrb_fixnum_value(depth));
|
|
1179
|
+
|
|
1180
|
+
// Push new array to process
|
|
1181
|
+
ary = e;
|
|
1182
|
+
idx = 0;
|
|
1183
|
+
depth++;
|
|
1184
|
+
}
|
|
1185
|
+
else {
|
|
1186
|
+
mrb_ary_push(mrb, result, e);
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
return result;
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/*
|
|
1194
|
+
* call-seq:
|
|
1195
|
+
* ary.flatten -> new_ary
|
|
1196
|
+
* ary.flatten(level) -> new_ary
|
|
1197
|
+
*
|
|
1198
|
+
* Returns a new array that is a one-dimensional flattening of this
|
|
1199
|
+
* array (recursively). That is, for every element that is an array,
|
|
1200
|
+
* extract its elements into the new array. If the optional
|
|
1201
|
+
* `level` argument determines the level of recursion to flatten.
|
|
1202
|
+
*
|
|
1203
|
+
* s = [ 1, 2, 3 ] #=> [1, 2, 3]
|
|
1204
|
+
* t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]]
|
|
1205
|
+
* a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
|
|
1206
|
+
* a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
1207
|
+
* a = [ 1, 2, [3, [4, 5] ] ]
|
|
1208
|
+
* a.flatten(1) #=> [1, 2, 3, [4, 5]]
|
|
1209
|
+
*/
|
|
1210
|
+
static mrb_value
|
|
1211
|
+
ary_flatten(mrb_state *mrb, mrb_value self)
|
|
1212
|
+
{
|
|
1213
|
+
mrb_int level = -1;
|
|
1214
|
+
mrb_get_args(mrb, "|i", &level);
|
|
1215
|
+
mrb_bool modified; // dummy
|
|
1216
|
+
return flatten_internal(mrb, self, level, &modified);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/*
|
|
1220
|
+
* Internal helper for index normalization and bounds checking.
|
|
1221
|
+
* Returns normalized index if in bounds, nil if out of bounds.
|
|
1222
|
+
* Used by Ruby-level array methods.
|
|
1223
|
+
*/
|
|
1224
|
+
|
|
1225
|
+
static mrb_value
|
|
1226
|
+
ary_normalize_index(mrb_state *mrb, mrb_value self)
|
|
1227
|
+
{
|
|
1228
|
+
mrb_value index_val;
|
|
1229
|
+
mrb_get_args(mrb, "o", &index_val);
|
|
1230
|
+
|
|
1231
|
+
mrb_int index = mrb_as_int(mrb, index_val);
|
|
1232
|
+
struct RArray *ary = mrb_ary_ptr(self);
|
|
1233
|
+
mrb_int len = ARY_LEN(ary);
|
|
1234
|
+
|
|
1235
|
+
// Handle negative indices
|
|
1236
|
+
if (index < 0) {
|
|
1237
|
+
index += len;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
// Check bounds
|
|
1241
|
+
if (index >= 0 && index < len) {
|
|
1242
|
+
return mrb_fixnum_value(index);
|
|
1243
|
+
}
|
|
1244
|
+
else {
|
|
1245
|
+
return mrb_nil_value();
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
/*
|
|
1250
|
+
* Internal helper for Array#fetch without blocks.
|
|
1251
|
+
* Returns the element at index, or default if out of bounds.
|
|
1252
|
+
* Raises IndexError if out of bounds and default equals none.
|
|
1253
|
+
*/
|
|
1254
|
+
|
|
1255
|
+
static mrb_value
|
|
1256
|
+
ary_fetch(mrb_state *mrb, mrb_value self)
|
|
1257
|
+
{
|
|
1258
|
+
mrb_value index_val, default_val, none;
|
|
1259
|
+
mrb_get_args(mrb, "ooo", &index_val, &default_val, &none);
|
|
1260
|
+
|
|
1261
|
+
// Convert index to integer
|
|
1262
|
+
mrb_int index = mrb_as_int(mrb, index_val);
|
|
1263
|
+
mrb_int original_index = index; // Keep original for error message
|
|
1264
|
+
|
|
1265
|
+
struct RArray *ary = mrb_ary_ptr(self);
|
|
1266
|
+
mrb_int len = ARY_LEN(ary);
|
|
1267
|
+
|
|
1268
|
+
// Handle negative indices
|
|
1269
|
+
if (index < 0) {
|
|
1270
|
+
index += len;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
// Check bounds
|
|
1274
|
+
if (index < 0 || index >= len) {
|
|
1275
|
+
// Check if default is the NONE sentinel (means no default provided)
|
|
1276
|
+
if (mrb_obj_equal(mrb, default_val, none)) {
|
|
1277
|
+
// No default provided - raise IndexError
|
|
1278
|
+
mrb_raisef(mrb, E_INDEX_ERROR,
|
|
1279
|
+
"index %i outside of array bounds: %i...%i",
|
|
1280
|
+
original_index, -len, len);
|
|
1281
|
+
}
|
|
1282
|
+
return default_val;
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
// Return element at index
|
|
1286
|
+
return ARY_PTR(ary)[index];
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
/*
|
|
1290
|
+
* call-seq:
|
|
1291
|
+
* ary.flatten! -> ary or nil
|
|
1292
|
+
* ary.flatten!(level) -> array or nil
|
|
1293
|
+
*
|
|
1294
|
+
* Flattens `self` in place. Returns `nil` if no modifications were made
|
|
1295
|
+
* (i.e., *ary* contains no subarrays.) If the optional `level` argument
|
|
1296
|
+
* determines the level of recursion to flatten.
|
|
1297
|
+
*
|
|
1298
|
+
* a = [ 1, 2, [3, [4, 5] ] ]
|
|
1299
|
+
* a.flatten! #=> [1, 2, 3, 4, 5]
|
|
1300
|
+
* a.flatten! #=> nil
|
|
1301
|
+
* a #=> [1, 2, 3, 4, 5]
|
|
1302
|
+
* a = [ 1, 2, [3, [4, 5] ] ]
|
|
1303
|
+
* a.flatten!(1) #=> [1, 2, 3, [4, 5]]
|
|
1304
|
+
*/
|
|
1305
|
+
static mrb_value
|
|
1306
|
+
ary_flatten_bang(mrb_state *mrb, mrb_value self)
|
|
1307
|
+
{
|
|
1308
|
+
mrb_int level = -1;
|
|
1309
|
+
mrb_get_args(mrb, "|i", &level);
|
|
1310
|
+
|
|
1311
|
+
mrb_ary_modify(mrb, mrb_ary_ptr(self));
|
|
1312
|
+
mrb_bool modified;
|
|
1313
|
+
mrb_value result = flatten_internal(mrb, self, level, &modified);
|
|
1314
|
+
|
|
1315
|
+
if (!modified) {
|
|
1316
|
+
return mrb_nil_value();
|
|
1317
|
+
}
|
|
1318
|
+
mrb_ary_replace(mrb, self, result);
|
|
1319
|
+
return self;
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
/*
|
|
1323
|
+
* call-seq:
|
|
1324
|
+
* ary.insert(index, obj...) -> ary
|
|
1325
|
+
*
|
|
1326
|
+
* Inserts the given values before the element with the given index.
|
|
1327
|
+
*
|
|
1328
|
+
* Negative indices count backwards from the end of the array, where -1
|
|
1329
|
+
* is the last element. If a negative index is used, the elements are
|
|
1330
|
+
* inserted after that element.
|
|
1331
|
+
*
|
|
1332
|
+
* If the index is greater than the length of the array, the array is
|
|
1333
|
+
* extended with nil elements.
|
|
1334
|
+
*
|
|
1335
|
+
* a = %w{ a b c d }
|
|
1336
|
+
* a.insert(2, 99) #=> ["a", "b", 99, "c", "d"]
|
|
1337
|
+
* a.insert(-2, 1, 2, 3) #=> ["a", "b", 99, "c", 1, 2, 3, "d"]
|
|
1338
|
+
*/
|
|
1339
|
+
static mrb_value
|
|
1340
|
+
ary_insert(mrb_state *mrb, mrb_value self)
|
|
1341
|
+
{
|
|
1342
|
+
mrb_int idx;
|
|
1343
|
+
const mrb_value *argv;
|
|
1344
|
+
mrb_int argc;
|
|
1345
|
+
|
|
1346
|
+
mrb_get_args(mrb, "i*", &idx, &argv, &argc);
|
|
1347
|
+
|
|
1348
|
+
if (argc == 0) {
|
|
1349
|
+
return self;
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
mrb_int len = RARRAY_LEN(self);
|
|
1353
|
+
|
|
1354
|
+
if (idx < 0) {
|
|
1355
|
+
idx += len + 1;
|
|
1356
|
+
if (idx < 0) {
|
|
1357
|
+
mrb_raisef(mrb, E_INDEX_ERROR, "index %i outside of array bounds", idx - (len + 1));
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
mrb_ary_modify(mrb, mrb_ary_ptr(self));
|
|
1362
|
+
|
|
1363
|
+
mrb_int new_len = (idx > len ? idx : len) + argc;
|
|
1364
|
+
mrb_ary_resize(mrb, self, new_len);
|
|
1365
|
+
|
|
1366
|
+
if (idx < len) {
|
|
1367
|
+
memmove(RARRAY_PTR(self) + idx + argc, RARRAY_PTR(self) + idx, (len - idx) * sizeof(mrb_value));
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1371
|
+
mrb_ary_set(mrb, self, idx + i, argv[i]);
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
return self;
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
/*
|
|
1378
|
+
* Internal helper for Array#product to construct a group array.
|
|
1379
|
+
* Takes the base array (self), the array of other arrays (arys),
|
|
1380
|
+
* the current iteration index (current_i), and the desired length
|
|
1381
|
+
* of the group array (group_len).
|
|
1382
|
+
*/
|
|
1383
|
+
static mrb_value
|
|
1384
|
+
ary_product_group(mrb_state *mrb, mrb_value self_ary)
|
|
1385
|
+
{
|
|
1386
|
+
mrb_value arys_ary;
|
|
1387
|
+
mrb_int current_i, group_len;
|
|
1388
|
+
mrb_get_args(mrb, "Aii", &arys_ary, ¤t_i, &group_len);
|
|
1389
|
+
|
|
1390
|
+
mrb_value group = mrb_ary_new_capa(mrb, group_len);
|
|
1391
|
+
mrb_int j = RARRAY_LEN(arys_ary); // Corresponds to 'size' in Ruby
|
|
1392
|
+
mrb_int n = current_i;
|
|
1393
|
+
|
|
1394
|
+
while (j > 0) {
|
|
1395
|
+
j -= 1;
|
|
1396
|
+
mrb_value a = RARRAY_PTR(arys_ary)[j]; // arys[j]
|
|
1397
|
+
mrb_check_type(mrb, a, MRB_TT_ARRAY);
|
|
1398
|
+
mrb_int b = RARRAY_LEN(a); // a.size
|
|
1399
|
+
mrb_ary_set(mrb, group, j + 1, RARRAY_PTR(a)[n % b]);
|
|
1400
|
+
n /= b;
|
|
1401
|
+
}
|
|
1402
|
+
mrb_ary_set(mrb, group, 0, RARRAY_PTR(self_ary)[n]);
|
|
1403
|
+
|
|
1404
|
+
return group;
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
/*
|
|
1408
|
+
* call-seq:
|
|
1409
|
+
* ary.deconstruct -> ary
|
|
1410
|
+
*
|
|
1411
|
+
* Returns the array itself for pattern matching.
|
|
1412
|
+
*
|
|
1413
|
+
* This method is used by pattern matching to deconstruct arrays.
|
|
1414
|
+
* It simply returns the array itself, allowing pattern matching
|
|
1415
|
+
* to work with array elements.
|
|
1416
|
+
*
|
|
1417
|
+
* a = [1, 2, 3]
|
|
1418
|
+
* a.deconstruct #=> [1, 2, 3]
|
|
1419
|
+
*
|
|
1420
|
+
* Pattern matching usage:
|
|
1421
|
+
* case [1, 2, 3]
|
|
1422
|
+
* in [x, y, z]
|
|
1423
|
+
* # x=1, y=2, z=3
|
|
1424
|
+
* end
|
|
1425
|
+
*/
|
|
1426
|
+
static mrb_value
|
|
1427
|
+
ary_deconstruct(mrb_state *mrb, mrb_value ary)
|
|
1428
|
+
{
|
|
1429
|
+
return ary;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
/*
|
|
1434
|
+
* Internal method to initialize combination state.
|
|
1435
|
+
* Returns opaque state object for use by __combination_next.
|
|
1436
|
+
*/
|
|
1437
|
+
static mrb_value
|
|
1438
|
+
ary_combination_init(mrb_state *mrb, mrb_value self)
|
|
1439
|
+
{
|
|
1440
|
+
mrb_int n;
|
|
1441
|
+
mrb_bool permutation;
|
|
1442
|
+
|
|
1443
|
+
mrb_get_args(mrb, "ib", &n, &permutation);
|
|
1444
|
+
#if MRB_INT_MAX > SIZE_MAX
|
|
1445
|
+
if (n > SIZE_MAX) {
|
|
1446
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "number too large");
|
|
1447
|
+
}
|
|
1448
|
+
#endif
|
|
1449
|
+
|
|
1450
|
+
struct RData *d;
|
|
1451
|
+
struct mrb_combination_state *state;
|
|
1452
|
+
Data_Make_Struct(mrb, mrb->object_class, struct mrb_combination_state,
|
|
1453
|
+
&mrb_combination_state_type, state, d);
|
|
1454
|
+
|
|
1455
|
+
state->n = n;
|
|
1456
|
+
state->array_size = RARRAY_LEN(self);
|
|
1457
|
+
state->permutation = permutation;
|
|
1458
|
+
state->finished = (n <= 0 && n != 0);
|
|
1459
|
+
|
|
1460
|
+
if (n > 0) {
|
|
1461
|
+
state->indices = (mrb_int*)mrb_calloc(mrb, n, sizeof(mrb_int));
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
return mrb_obj_value(d);
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
/*
|
|
1468
|
+
* Internal method to get next combination as index array.
|
|
1469
|
+
* Returns array of indices or nil when iteration is complete.
|
|
1470
|
+
*/
|
|
1471
|
+
static mrb_value
|
|
1472
|
+
ary_combination_next(mrb_state *mrb, mrb_value self)
|
|
1473
|
+
{
|
|
1474
|
+
mrb_value state_obj;
|
|
1475
|
+
mrb_get_args(mrb, "o", &state_obj);
|
|
1476
|
+
|
|
1477
|
+
struct mrb_combination_state *state;
|
|
1478
|
+
|
|
1479
|
+
/* Validate state object type and get data */
|
|
1480
|
+
state = (struct mrb_combination_state*)mrb_data_check_and_get(mrb, state_obj, &mrb_combination_state_type);
|
|
1481
|
+
if (!state) {
|
|
1482
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid combination state");
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
/* Check if iteration is complete */
|
|
1486
|
+
if (state->finished) return mrb_nil_value();
|
|
1487
|
+
|
|
1488
|
+
/* Validate array hasn't been modified during iteration */
|
|
1489
|
+
if (RARRAY_LEN(self) != state->array_size) {
|
|
1490
|
+
mrb_raise(mrb, E_RUNTIME_ERROR, "array modified during iteration");
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
/* Edge case: empty array */
|
|
1494
|
+
if (state->array_size == 0) {
|
|
1495
|
+
state->finished = TRUE;
|
|
1496
|
+
return mrb_nil_value();
|
|
1497
|
+
}
|
|
1498
|
+
|
|
1499
|
+
/* Validate current indices are still in bounds */
|
|
1500
|
+
for (mrb_int i = 0; i < state->n; i++) {
|
|
1501
|
+
if (state->indices[i] >= state->array_size) {
|
|
1502
|
+
state->finished = TRUE;
|
|
1503
|
+
return mrb_nil_value();
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
/* Build current combination indices */
|
|
1508
|
+
mrb_value result = mrb_ary_new_capa(mrb, state->n);
|
|
1509
|
+
for (mrb_int i = 0; i < state->n; i++) {
|
|
1510
|
+
mrb_ary_push(mrb, result, mrb_fixnum_value(state->indices[i]));
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
mrb_int pos = state->n - 1;
|
|
1514
|
+
|
|
1515
|
+
while (pos >= 0) {
|
|
1516
|
+
state->indices[pos]++;
|
|
1517
|
+
if (state->indices[pos] < state->array_size) break;
|
|
1518
|
+
pos--;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
if (pos < 0) {
|
|
1522
|
+
state->finished = TRUE;
|
|
1523
|
+
}
|
|
1524
|
+
else {
|
|
1525
|
+
/* Reset dependent indices */
|
|
1526
|
+
for (mrb_int i = pos + 1; i < state->n; i++) {
|
|
1527
|
+
if (state->permutation) {
|
|
1528
|
+
state->indices[i] = 0;
|
|
1529
|
+
}
|
|
1530
|
+
else {
|
|
1531
|
+
state->indices[i] = state->indices[i - 1];
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
return result;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
/* ---------------------------*/
|
|
1540
|
+
static const mrb_mt_entry array_ext_rom_entries[] = {
|
|
1541
|
+
MRB_MT_ENTRY(ary_assoc, MRB_SYM(assoc), MRB_ARGS_REQ(1)),
|
|
1542
|
+
MRB_MT_ENTRY(ary_at, MRB_SYM(at), MRB_ARGS_REQ(1)),
|
|
1543
|
+
MRB_MT_ENTRY(ary_rassoc, MRB_SYM(rassoc), MRB_ARGS_REQ(1)),
|
|
1544
|
+
MRB_MT_ENTRY(ary_values_at, MRB_SYM(values_at), MRB_ARGS_ANY()),
|
|
1545
|
+
MRB_MT_ENTRY(ary_slice_bang, MRB_SYM_B(slice), MRB_ARGS_ARG(1,1)),
|
|
1546
|
+
MRB_MT_ENTRY(ary_compact, MRB_SYM(compact), MRB_ARGS_NONE()),
|
|
1547
|
+
MRB_MT_ENTRY(ary_compact_bang, MRB_SYM_B(compact), MRB_ARGS_NONE()),
|
|
1548
|
+
MRB_MT_ENTRY(ary_rotate, MRB_SYM(rotate), MRB_ARGS_OPT(1)),
|
|
1549
|
+
MRB_MT_ENTRY(ary_rotate_bang, MRB_SYM_B(rotate), MRB_ARGS_OPT(1)),
|
|
1550
|
+
MRB_MT_ENTRY(ary_sub, MRB_OPSYM(sub), MRB_ARGS_REQ(1)),
|
|
1551
|
+
MRB_MT_ENTRY(ary_difference, MRB_SYM(difference), MRB_ARGS_ANY()),
|
|
1552
|
+
MRB_MT_ENTRY(ary_union, MRB_OPSYM(or), MRB_ARGS_REQ(1)),
|
|
1553
|
+
MRB_MT_ENTRY(ary_union_multi, MRB_SYM(union), MRB_ARGS_ANY()),
|
|
1554
|
+
MRB_MT_ENTRY(ary_intersection, MRB_OPSYM(and), MRB_ARGS_REQ(1)),
|
|
1555
|
+
MRB_MT_ENTRY(ary_intersection_multi, MRB_SYM(intersection), MRB_ARGS_ANY()),
|
|
1556
|
+
MRB_MT_ENTRY(ary_intersect_p, MRB_SYM_Q(intersect), MRB_ARGS_REQ(1)),
|
|
1557
|
+
MRB_MT_ENTRY(ary_fill_parse_arg, MRB_SYM(__fill_parse_arg), MRB_ARGS_ARG(0,4)),
|
|
1558
|
+
MRB_MT_ENTRY(ary_fill_exec, MRB_SYM(__fill_exec), MRB_ARGS_REQ(3)),
|
|
1559
|
+
MRB_MT_ENTRY(ary_uniq, MRB_SYM(__uniq), MRB_ARGS_NONE()),
|
|
1560
|
+
MRB_MT_ENTRY(ary_uniq_bang, MRB_SYM_B(__uniq), MRB_ARGS_NONE()),
|
|
1561
|
+
MRB_MT_ENTRY(ary_flatten, MRB_SYM(flatten), MRB_ARGS_OPT(1)),
|
|
1562
|
+
MRB_MT_ENTRY(ary_flatten_bang, MRB_SYM_B(flatten), MRB_ARGS_OPT(1)),
|
|
1563
|
+
MRB_MT_ENTRY(ary_normalize_index, MRB_SYM(__normalize_index), MRB_ARGS_REQ(1)),
|
|
1564
|
+
MRB_MT_ENTRY(ary_fetch, MRB_SYM(__fetch), MRB_ARGS_REQ(3)),
|
|
1565
|
+
MRB_MT_ENTRY(ary_insert, MRB_SYM(insert), MRB_ARGS_ARG(1,-1)),
|
|
1566
|
+
MRB_MT_ENTRY(ary_deconstruct, MRB_SYM(deconstruct), MRB_ARGS_NONE()),
|
|
1567
|
+
MRB_MT_ENTRY(ary_product_group, MRB_SYM(__product_group), MRB_ARGS_REQ(3)),
|
|
1568
|
+
MRB_MT_ENTRY(ary_combination_init, MRB_SYM(__combination_init), MRB_ARGS_REQ(2)),
|
|
1569
|
+
MRB_MT_ENTRY(ary_combination_next, MRB_SYM(__combination_next), MRB_ARGS_REQ(1)),
|
|
1570
|
+
};
|
|
1571
|
+
|
|
1572
|
+
void
|
|
1573
|
+
mrb_mruby_array_ext_gem_init(mrb_state* mrb)
|
|
1574
|
+
{
|
|
1575
|
+
struct RClass * a = mrb->array_class;
|
|
1576
|
+
|
|
1577
|
+
MRB_MT_INIT_ROM(mrb, a, array_ext_rom_entries);
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
void
|
|
1581
|
+
mrb_mruby_array_ext_gem_final(mrb_state* mrb)
|
|
1582
|
+
{
|
|
1583
|
+
}
|