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,1535 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** set.c - Set class
|
|
3
|
+
**
|
|
4
|
+
** See Copyright Notice in mruby.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include <mruby.h>
|
|
8
|
+
#include <mruby/array.h>
|
|
9
|
+
#include <mruby/class.h>
|
|
10
|
+
#include <mruby/hash.h>
|
|
11
|
+
#include <mruby/string.h>
|
|
12
|
+
#include <mruby/variable.h>
|
|
13
|
+
#include <mruby/proc.h>
|
|
14
|
+
#include <mruby/data.h>
|
|
15
|
+
#include <mruby/internal.h>
|
|
16
|
+
#include <mruby/presym.h>
|
|
17
|
+
#include <mruby/error.h>
|
|
18
|
+
#include <mruby/khash.h>
|
|
19
|
+
|
|
20
|
+
/* Use khash.h for set implementation - set mode (no values, only keys) */
|
|
21
|
+
KHASH_DECLARE(set_val, mrb_value, char, FALSE) /* FALSE = set mode */
|
|
22
|
+
|
|
23
|
+
/* Helper for protected hash computation */
|
|
24
|
+
static mrb_value
|
|
25
|
+
kset_hash_body(mrb_state *mrb, void *data)
|
|
26
|
+
{
|
|
27
|
+
mrb_value *key = (mrb_value*)data;
|
|
28
|
+
return mrb_int_value(mrb, mrb_obj_hash_code(mrb, *key));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Helper for protected equality check */
|
|
32
|
+
struct kset_eql_data {
|
|
33
|
+
mrb_value a;
|
|
34
|
+
mrb_value b;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
static mrb_value
|
|
38
|
+
kset_eql_body(mrb_state *mrb, void *data)
|
|
39
|
+
{
|
|
40
|
+
struct kset_eql_data *d = (struct kset_eql_data*)data;
|
|
41
|
+
return mrb_bool_value(mrb_eql(mrb, d->a, d->b));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Hash and equality functions for mrb_value keys */
|
|
45
|
+
/* These use mrb_protect_error to catch exceptions and prevent leaks in khash rebuild */
|
|
46
|
+
static inline khint_t
|
|
47
|
+
kset_hash_value(mrb_state *mrb, mrb_value key)
|
|
48
|
+
{
|
|
49
|
+
mrb_bool error;
|
|
50
|
+
mrb_value result = mrb_protect_error(mrb, kset_hash_body, &key, &error);
|
|
51
|
+
if (error) {
|
|
52
|
+
mrb->exc = mrb_obj_ptr(result); /* Store exception to raise later */
|
|
53
|
+
return 0; /* Return default hash value */
|
|
54
|
+
}
|
|
55
|
+
return (khint_t)mrb_integer(result);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static inline mrb_bool
|
|
59
|
+
kset_equal_value(mrb_state *mrb, mrb_value a, mrb_value b)
|
|
60
|
+
{
|
|
61
|
+
struct kset_eql_data data = { a, b };
|
|
62
|
+
mrb_bool error;
|
|
63
|
+
mrb_value result = mrb_protect_error(mrb, kset_eql_body, &data, &error);
|
|
64
|
+
if (error) {
|
|
65
|
+
mrb->exc = mrb_obj_ptr(result); /* Store exception to raise later */
|
|
66
|
+
return FALSE; /* Return not-equal */
|
|
67
|
+
}
|
|
68
|
+
return mrb_test(result);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
KHASH_DEFINE(set_val, mrb_value, char, FALSE, kset_hash_value, kset_equal_value)
|
|
72
|
+
|
|
73
|
+
#define KSET_INITIAL_SIZE 4
|
|
74
|
+
#define GOLDEN_RATIO_PRIME 0x9e3779b97f4a7c15ULL
|
|
75
|
+
|
|
76
|
+
/* Compatibility layer and type definitions */
|
|
77
|
+
typedef kh_set_val_t kset_t;
|
|
78
|
+
typedef khint_t kset_iter_t;
|
|
79
|
+
|
|
80
|
+
/* API Aliases to khash.h */
|
|
81
|
+
#define kset_init(mrb) kh_init(set_val, mrb)
|
|
82
|
+
#define kset_init_data(mrb, s, sz) kh_init_data(set_val, mrb, s, sz)
|
|
83
|
+
#define kset_destroy_data(mrb, s) kh_destroy_data(set_val, mrb, s)
|
|
84
|
+
#define kset_clear(mrb, s) kh_clear(set_val, mrb, s)
|
|
85
|
+
#define kset_resize(mrb, s, sz) kh_resize(set_val, mrb, s, sz)
|
|
86
|
+
#define kset_put(mrb, s, k) kh_put(set_val, mrb, s, k)
|
|
87
|
+
#define kset_put2(mrb, s, k, r) kh_put2(set_val, mrb, s, k, r)
|
|
88
|
+
#define kset_get(mrb, s, k) kh_get(set_val, mrb, s, k)
|
|
89
|
+
#define kset_del(mrb, s, k) kh_del(set_val, mrb, s, k)
|
|
90
|
+
#define kset_exist(s, k) kh_exist(set_val, s, k)
|
|
91
|
+
#define kset_key(s, k) kh_key(set_val, s, k)
|
|
92
|
+
#define kset_size(s) kh_size(s)
|
|
93
|
+
#define kset_end(s) kh_end(s)
|
|
94
|
+
#define kset_is_end(s, k) kh_is_end(s, k)
|
|
95
|
+
|
|
96
|
+
#define KSET_FOREACH(s, k) KHASH_FOREACH(set_val, s, k)
|
|
97
|
+
|
|
98
|
+
/* Helper macros for set state checking */
|
|
99
|
+
#define kset_is_uninitialized(s) ((s)->data == NULL)
|
|
100
|
+
#define kset_is_empty(s) (kset_is_uninitialized(s) || kset_size(s) == 0)
|
|
101
|
+
|
|
102
|
+
/* Embedded set structure in RSet - exactly 3 pointers */
|
|
103
|
+
struct RSet {
|
|
104
|
+
MRB_OBJECT_HEADER;
|
|
105
|
+
kset_t set; /* Embedded directly, not a pointer */
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
mrb_static_assert_object_size(struct RSet);
|
|
109
|
+
|
|
110
|
+
#define mrb_set_ptr(o) ((struct RSet*)mrb_obj_ptr(o))
|
|
111
|
+
|
|
112
|
+
/* Get pointer to embedded set */
|
|
113
|
+
static kset_t*
|
|
114
|
+
set_get_kset(mrb_state *mrb, mrb_value self)
|
|
115
|
+
{
|
|
116
|
+
mrb_check_type(mrb, self, MRB_TT_SET);
|
|
117
|
+
return &mrb_set_ptr(self)->set;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Get RSet pointer from embedded kset_t pointer */
|
|
121
|
+
#define kset_to_rset(kset) ((struct RBasic*)((char*)(kset) - offsetof(struct RSet, set)))
|
|
122
|
+
|
|
123
|
+
/* Copy all elements from src to dst (merge operation) */
|
|
124
|
+
static void
|
|
125
|
+
kset_copy_merge(mrb_state *mrb, kset_t *dst, kset_t *src)
|
|
126
|
+
{
|
|
127
|
+
if (!kset_is_empty(src)) {
|
|
128
|
+
struct RBasic *dst_obj = kset_to_rset(dst);
|
|
129
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
130
|
+
KSET_FOREACH(src, k) {
|
|
131
|
+
mrb_value key = kset_key(src, k);
|
|
132
|
+
kset_put(mrb, dst, key);
|
|
133
|
+
mrb_field_write_barrier_value(mrb, dst_obj, key);
|
|
134
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Helper function to ensure set is initialized */
|
|
140
|
+
static void
|
|
141
|
+
set_ensure_initialized(mrb_state *mrb, kset_t *set)
|
|
142
|
+
{
|
|
143
|
+
if (kset_is_uninitialized(set)) {
|
|
144
|
+
mrb_raise(mrb, E_RUNTIME_ERROR, "uninitialized Set");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Mark function for Set instances */
|
|
149
|
+
size_t
|
|
150
|
+
mrb_gc_mark_set(mrb_state *mrb, struct RBasic *obj)
|
|
151
|
+
{
|
|
152
|
+
struct RSet *s = (struct RSet*)obj;
|
|
153
|
+
kset_t *set = &s->set;
|
|
154
|
+
if (kset_is_empty(set)) return 0;
|
|
155
|
+
|
|
156
|
+
KSET_FOREACH(set, k) {
|
|
157
|
+
mrb_gc_mark_value(mrb, kset_key(set, k));
|
|
158
|
+
}
|
|
159
|
+
return set->size;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
void
|
|
163
|
+
mrb_gc_free_set(mrb_state *mrb, struct RBasic *obj)
|
|
164
|
+
{
|
|
165
|
+
struct RSet *s = (struct RSet*)obj;
|
|
166
|
+
kset_destroy_data(mrb, &s->set);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
size_t
|
|
170
|
+
mrb_set_memsize(mrb_value set)
|
|
171
|
+
{
|
|
172
|
+
size_t size = sizeof(struct RSet);
|
|
173
|
+
struct RSet *s = mrb_set_ptr(set);
|
|
174
|
+
kset_t *kset = &s->set;
|
|
175
|
+
if (kset->data) {
|
|
176
|
+
/* New khash layout: keys + flags in single allocation */
|
|
177
|
+
size += sizeof(mrb_value) * kset->n_buckets; /* keys */
|
|
178
|
+
size += kset->n_buckets / 4; /* flags */
|
|
179
|
+
}
|
|
180
|
+
return size;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* Helper function to check if a value is a Set and return a boolean result */
|
|
184
|
+
static mrb_bool
|
|
185
|
+
set_is_set(mrb_value obj)
|
|
186
|
+
{
|
|
187
|
+
return mrb_type(obj) == MRB_TT_SET;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* Helper function to check if a value is a Set and raise an error if not */
|
|
191
|
+
static void
|
|
192
|
+
set_check_type(mrb_state *mrb, mrb_value obj)
|
|
193
|
+
{
|
|
194
|
+
if (!set_is_set(obj)) {
|
|
195
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "value must be a set");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static mrb_value
|
|
200
|
+
set_init(mrb_state *mrb, mrb_value self)
|
|
201
|
+
{
|
|
202
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
203
|
+
if (!kset_is_uninitialized(set)) {
|
|
204
|
+
mrb_raise(mrb, E_RUNTIME_ERROR, "already initialized set");
|
|
205
|
+
}
|
|
206
|
+
kset_init_data(mrb, set, KSET_INITIAL_SIZE);
|
|
207
|
+
return self;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* call-seq:
|
|
212
|
+
* set.initialize_copy(orig)
|
|
213
|
+
* Copy constructor.
|
|
214
|
+
*/
|
|
215
|
+
static mrb_value
|
|
216
|
+
set_init_copy(mrb_state *mrb, mrb_value self)
|
|
217
|
+
{
|
|
218
|
+
mrb_value orig = mrb_get_arg1(mrb);
|
|
219
|
+
|
|
220
|
+
if (mrb_type(orig) != MRB_TT_SET) {
|
|
221
|
+
mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take a Set object");
|
|
222
|
+
}
|
|
223
|
+
if (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig)) {
|
|
224
|
+
mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
kset_t *orig_set = set_get_kset(mrb, orig);
|
|
228
|
+
set_ensure_initialized(mrb, orig_set);
|
|
229
|
+
|
|
230
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
231
|
+
/* Free existing data if already initialized (for replace semantics) */
|
|
232
|
+
if (!kset_is_uninitialized(self_set)) {
|
|
233
|
+
kset_destroy_data(mrb, self_set);
|
|
234
|
+
}
|
|
235
|
+
kset_init_data(mrb, self_set, kset_size(orig_set));
|
|
236
|
+
kh_replace(set_val, mrb, self_set, orig_set);
|
|
237
|
+
|
|
238
|
+
return self;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/*
|
|
242
|
+
* call-seq:
|
|
243
|
+
* set.size -> integer
|
|
244
|
+
* set.length -> integer
|
|
245
|
+
*
|
|
246
|
+
* Returns the number of elements.
|
|
247
|
+
*/
|
|
248
|
+
static mrb_value
|
|
249
|
+
set_size(mrb_state *mrb, mrb_value self)
|
|
250
|
+
{
|
|
251
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
252
|
+
if (kset_is_empty(set)) return mrb_fixnum_value(0);
|
|
253
|
+
return mrb_fixnum_value(kset_size(set));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/*
|
|
257
|
+
* call-seq:
|
|
258
|
+
* set.empty? -> true or false
|
|
259
|
+
*
|
|
260
|
+
* Returns true if the set contains no elements.
|
|
261
|
+
*/
|
|
262
|
+
static mrb_value
|
|
263
|
+
set_empty_p(mrb_state *mrb, mrb_value self)
|
|
264
|
+
{
|
|
265
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
266
|
+
return mrb_bool_value(kset_is_empty(set));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/*
|
|
270
|
+
* call-seq:
|
|
271
|
+
* set.clear -> self
|
|
272
|
+
*
|
|
273
|
+
* Removes all elements and returns self.
|
|
274
|
+
*/
|
|
275
|
+
static mrb_value
|
|
276
|
+
set_clear(mrb_state *mrb, mrb_value self)
|
|
277
|
+
{
|
|
278
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
279
|
+
if (!kset_is_empty(set)) {
|
|
280
|
+
kset_clear(mrb, set);
|
|
281
|
+
}
|
|
282
|
+
return self;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* call-seq:
|
|
287
|
+
* set.to_a -> array
|
|
288
|
+
*
|
|
289
|
+
* Converts the set to an array.
|
|
290
|
+
*/
|
|
291
|
+
static mrb_value
|
|
292
|
+
set_to_a(mrb_state *mrb, mrb_value self)
|
|
293
|
+
{
|
|
294
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
295
|
+
|
|
296
|
+
if (kset_is_empty(set)) return mrb_ary_new(mrb);
|
|
297
|
+
|
|
298
|
+
mrb_value ary = mrb_ary_new_capa(mrb, kset_size(set));
|
|
299
|
+
|
|
300
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
301
|
+
KSET_FOREACH(set, k) {
|
|
302
|
+
mrb_ary_push(mrb, ary, kset_key(set, k));
|
|
303
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return ary;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/*
|
|
310
|
+
* call-seq:
|
|
311
|
+
* set.include?(object) -> true or false
|
|
312
|
+
* set.member?(object) -> true or false
|
|
313
|
+
* set === object -> true or false
|
|
314
|
+
*
|
|
315
|
+
* Returns true if the set contains the given object.
|
|
316
|
+
*/
|
|
317
|
+
static mrb_value
|
|
318
|
+
set_include_p(mrb_state *mrb, mrb_value self)
|
|
319
|
+
{
|
|
320
|
+
mrb_value obj = mrb_get_arg1(mrb);
|
|
321
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
322
|
+
if (kset_is_empty(set)) return mrb_false_value();
|
|
323
|
+
|
|
324
|
+
return mrb_bool_value(!kset_is_end(set, kset_get(mrb, set, obj)));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/*
|
|
328
|
+
* call-seq:
|
|
329
|
+
* set.add(object) -> self
|
|
330
|
+
* set << object -> self
|
|
331
|
+
*
|
|
332
|
+
* Adds the given object to the set and returns self.
|
|
333
|
+
*/
|
|
334
|
+
static mrb_value
|
|
335
|
+
set_add(mrb_state *mrb, mrb_value self)
|
|
336
|
+
{
|
|
337
|
+
mrb_value obj = mrb_get_arg1(mrb);
|
|
338
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
339
|
+
set_ensure_initialized(mrb, set);
|
|
340
|
+
|
|
341
|
+
kset_put(mrb, set, obj);
|
|
342
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(set), obj);
|
|
343
|
+
return self;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/*
|
|
347
|
+
* call-seq:
|
|
348
|
+
* set.add?(object) -> self or nil
|
|
349
|
+
*
|
|
350
|
+
* Adds the given object to the set and returns self. If the object is already
|
|
351
|
+
* in the set, returns nil.
|
|
352
|
+
*/
|
|
353
|
+
static mrb_value
|
|
354
|
+
set_add_p(mrb_state *mrb, mrb_value self)
|
|
355
|
+
{
|
|
356
|
+
mrb_value obj = mrb_get_arg1(mrb);
|
|
357
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
358
|
+
set_ensure_initialized(mrb, set);
|
|
359
|
+
|
|
360
|
+
int ret;
|
|
361
|
+
kset_put2(mrb, set, obj, &ret);
|
|
362
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(set), obj);
|
|
363
|
+
return (ret == 0) ? mrb_nil_value() : self;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/*
|
|
367
|
+
* call-seq:
|
|
368
|
+
* set.delete(object) -> self
|
|
369
|
+
*
|
|
370
|
+
* Deletes the given object from the set and returns self.
|
|
371
|
+
*/
|
|
372
|
+
static mrb_value
|
|
373
|
+
set_delete(mrb_state *mrb, mrb_value self)
|
|
374
|
+
{
|
|
375
|
+
mrb_value obj = mrb_get_arg1(mrb);
|
|
376
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
377
|
+
if (kset_is_empty(set)) return self;
|
|
378
|
+
|
|
379
|
+
kset_iter_t k = kset_get(mrb, set, obj);
|
|
380
|
+
if (!kset_is_end(set, k)) {
|
|
381
|
+
kset_del(mrb, set, k);
|
|
382
|
+
}
|
|
383
|
+
return self;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/*
|
|
387
|
+
* call-seq:
|
|
388
|
+
* set.delete?(object) -> self or nil
|
|
389
|
+
*
|
|
390
|
+
* Deletes the given object from the set and returns self. If the object is not
|
|
391
|
+
* in the set, returns nil.
|
|
392
|
+
*/
|
|
393
|
+
static mrb_value
|
|
394
|
+
set_delete_p(mrb_state *mrb, mrb_value self)
|
|
395
|
+
{
|
|
396
|
+
mrb_value obj = mrb_get_arg1(mrb);
|
|
397
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
398
|
+
if (kset_is_empty(set)) return mrb_nil_value();
|
|
399
|
+
|
|
400
|
+
kset_iter_t k = kset_get(mrb, set, obj);
|
|
401
|
+
if (!kset_is_end(set, k)) {
|
|
402
|
+
kset_del(mrb, set, k);
|
|
403
|
+
return self;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
return mrb_nil_value();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/*
|
|
411
|
+
* Core implementation of Set-to-Set merge (mutating version)
|
|
412
|
+
* This is an internal method that will be called from Ruby
|
|
413
|
+
*/
|
|
414
|
+
static mrb_value
|
|
415
|
+
set_core_merge(mrb_state *mrb, mrb_value self)
|
|
416
|
+
{
|
|
417
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
418
|
+
|
|
419
|
+
if (!set_is_set(other)) {
|
|
420
|
+
return mrb_false_value();
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
424
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
425
|
+
|
|
426
|
+
set_ensure_initialized(mrb, self_set);
|
|
427
|
+
if (!kset_is_empty(other_set)) {
|
|
428
|
+
kset_copy_merge(mrb, self_set, other_set);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
return mrb_true_value();
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/*
|
|
435
|
+
* Core implementation of Set-to-Set subtraction (mutating version)
|
|
436
|
+
* This is an internal method that will be called from Ruby
|
|
437
|
+
*/
|
|
438
|
+
static mrb_value
|
|
439
|
+
set_core_subtract(mrb_state *mrb, mrb_value self)
|
|
440
|
+
{
|
|
441
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
442
|
+
|
|
443
|
+
if (!set_is_set(other)) {
|
|
444
|
+
return mrb_false_value();
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
448
|
+
if (kset_is_empty(self_set)) return mrb_true_value();
|
|
449
|
+
|
|
450
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
451
|
+
if (kset_is_empty(other_set)) return mrb_true_value();
|
|
452
|
+
|
|
453
|
+
/* Remove all elements that are in other set */
|
|
454
|
+
KSET_FOREACH(other_set, k) {
|
|
455
|
+
mrb_value key = kset_key(other_set, k);
|
|
456
|
+
kset_iter_t self_k = kset_get(mrb, self_set, key);
|
|
457
|
+
if (!kset_is_end(self_set, self_k)) {
|
|
458
|
+
kset_del(mrb, self_set, self_k);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return mrb_true_value();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* Core implementation of Set-to-Set union
|
|
467
|
+
* This is an internal method that will be called from Ruby
|
|
468
|
+
*/
|
|
469
|
+
static mrb_value
|
|
470
|
+
set_core_union(mrb_state *mrb, mrb_value self)
|
|
471
|
+
{
|
|
472
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
473
|
+
|
|
474
|
+
if (!set_is_set(other)) {
|
|
475
|
+
return mrb_nil_value();
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/* Create a new set by duplicating self */
|
|
479
|
+
mrb_value result = mrb_obj_dup(mrb, self);
|
|
480
|
+
kset_t *result_set = set_get_kset(mrb, result);
|
|
481
|
+
if (kset_is_uninitialized(result_set)) {
|
|
482
|
+
/* If self is empty, initialize the set */
|
|
483
|
+
kset_init_data(mrb, result_set, KSET_INITIAL_SIZE);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/* Add all elements from other set */
|
|
487
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
488
|
+
if (!kset_is_uninitialized(other_set)) {
|
|
489
|
+
kset_copy_merge(mrb, result_set, other_set);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return result;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/*
|
|
496
|
+
* Core implementation of Set-to-Set difference
|
|
497
|
+
* This is an internal method that will be called from Ruby
|
|
498
|
+
*/
|
|
499
|
+
static mrb_value
|
|
500
|
+
set_core_difference(mrb_state *mrb, mrb_value self)
|
|
501
|
+
{
|
|
502
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
503
|
+
|
|
504
|
+
if (!set_is_set(other)) {
|
|
505
|
+
return mrb_nil_value();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* Create a new set by duplicating self */
|
|
509
|
+
mrb_value result = mrb_obj_dup(mrb, self);
|
|
510
|
+
kset_t *result_set = set_get_kset(mrb, result);
|
|
511
|
+
if (kset_is_uninitialized(result_set)) {
|
|
512
|
+
/* If self is empty, return an empty set */
|
|
513
|
+
return result;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/* Remove all elements that are in other set */
|
|
517
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
518
|
+
if (!kset_is_uninitialized(other_set)) {
|
|
519
|
+
KSET_FOREACH(other_set, k) {
|
|
520
|
+
mrb_value key = kset_key(other_set, k);
|
|
521
|
+
kset_iter_t result_k = kset_get(mrb, result_set, key);
|
|
522
|
+
if (!kset_is_end(result_set, result_k)) {
|
|
523
|
+
kset_del(mrb, result_set, result_k);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return result;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
/*
|
|
533
|
+
* Core implementation of Set-to-Set intersection
|
|
534
|
+
* This is an internal method that will be called from Ruby
|
|
535
|
+
*/
|
|
536
|
+
static mrb_value
|
|
537
|
+
set_core_intersection(mrb_state *mrb, mrb_value self)
|
|
538
|
+
{
|
|
539
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
540
|
+
|
|
541
|
+
if (!set_is_set(other)) {
|
|
542
|
+
return mrb_nil_value();
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/* Create a new empty set of the same class as self */
|
|
546
|
+
mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
|
|
547
|
+
kset_t *result_set = set_get_kset(mrb, result);
|
|
548
|
+
|
|
549
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
550
|
+
if (kset_is_uninitialized(self_set)) return result;
|
|
551
|
+
|
|
552
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
553
|
+
if (kset_is_uninitialized(other_set)) return result;
|
|
554
|
+
|
|
555
|
+
KSET_FOREACH(other_set, k) {
|
|
556
|
+
mrb_value key = kset_key(other_set, k);
|
|
557
|
+
kset_iter_t self_k = kset_get(mrb, self_set, key);
|
|
558
|
+
|
|
559
|
+
/* If key exists in self, add it to result */
|
|
560
|
+
if (!kset_is_end(self_set, self_k)) {
|
|
561
|
+
kset_put(mrb, result_set, key);
|
|
562
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
return result;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
/*
|
|
571
|
+
* Core implementation of Set-to-Set XOR (symmetric difference)
|
|
572
|
+
* This is an internal method that will be called from Ruby
|
|
573
|
+
*/
|
|
574
|
+
static mrb_value
|
|
575
|
+
set_core_xor(mrb_state *mrb, mrb_value self)
|
|
576
|
+
{
|
|
577
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
578
|
+
|
|
579
|
+
if (!set_is_set(other)) {
|
|
580
|
+
return mrb_nil_value();
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
|
|
584
|
+
kset_t *result_set = set_get_kset(mrb, result);
|
|
585
|
+
kset_t *self_set, *other_set;
|
|
586
|
+
|
|
587
|
+
self_set = set_get_kset(mrb, self);
|
|
588
|
+
other_set = set_get_kset(mrb, other);
|
|
589
|
+
|
|
590
|
+
/* Handle empty sets */
|
|
591
|
+
if (kset_is_empty(self_set)) {
|
|
592
|
+
if (!kset_is_empty(other_set)) {
|
|
593
|
+
kset_copy_merge(mrb, result_set, other_set);
|
|
594
|
+
}
|
|
595
|
+
return result;
|
|
596
|
+
}
|
|
597
|
+
if (kset_is_empty(other_set)) {
|
|
598
|
+
kh_replace(set_val, mrb, result_set, self_set);
|
|
599
|
+
return result;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/* Add elements from self that are not in other */
|
|
603
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
604
|
+
KSET_FOREACH(self_set, k) {
|
|
605
|
+
mrb_value key = kset_key(self_set, k);
|
|
606
|
+
kset_iter_t other_k = kset_get(mrb, other_set, key);
|
|
607
|
+
|
|
608
|
+
/* Add to result if not in other */
|
|
609
|
+
if (kset_is_end(other_set, other_k)) {
|
|
610
|
+
kset_put(mrb, result_set, key);
|
|
611
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
|
|
612
|
+
}
|
|
613
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/* Add elements from other that are not in self */
|
|
617
|
+
KSET_FOREACH(other_set, k) {
|
|
618
|
+
mrb_value key = kset_key(other_set, k);
|
|
619
|
+
kset_iter_t self_k = kset_get(mrb, self_set, key);
|
|
620
|
+
|
|
621
|
+
/* Add to result if not in self */
|
|
622
|
+
if (kset_is_end(self_set, self_k)) {
|
|
623
|
+
kset_put(mrb, result_set, key);
|
|
624
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
|
|
625
|
+
}
|
|
626
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return result;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/*
|
|
633
|
+
* call-seq:
|
|
634
|
+
* set == other -> true or false
|
|
635
|
+
*
|
|
636
|
+
* Returns true if two sets are equal.
|
|
637
|
+
*/
|
|
638
|
+
/*
|
|
639
|
+
* call-seq:
|
|
640
|
+
* set.eql?(other) -> true or false
|
|
641
|
+
*
|
|
642
|
+
* Returns true if two sets are equal.
|
|
643
|
+
*/
|
|
644
|
+
static mrb_value
|
|
645
|
+
set_equal(mrb_state *mrb, mrb_value self)
|
|
646
|
+
{
|
|
647
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
648
|
+
|
|
649
|
+
/* Fast path: same object */
|
|
650
|
+
if (mrb_obj_equal(mrb, self, other)) {
|
|
651
|
+
return mrb_true_value();
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/* Only compare with other Set objects */
|
|
655
|
+
if (!set_is_set(other)) {
|
|
656
|
+
return mrb_false_value();
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
660
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
661
|
+
|
|
662
|
+
/* Fast path: both empty */
|
|
663
|
+
if (kset_is_empty(self_set) && kset_is_empty(other_set)) {
|
|
664
|
+
return mrb_true_value();
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/* Fast path: different sizes */
|
|
668
|
+
if (kset_size(self_set) != kset_size(other_set)) {
|
|
669
|
+
return mrb_false_value();
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
/* Compare elements: iterate through the smaller hash for efficiency */
|
|
673
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
674
|
+
KSET_FOREACH(self_set, k) {
|
|
675
|
+
kset_iter_t k2 = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
676
|
+
if (kset_is_end(other_set, k2)) {
|
|
677
|
+
return mrb_false_value(); /* Element in self not found in other */
|
|
678
|
+
}
|
|
679
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
return mrb_true_value();
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/*
|
|
686
|
+
* call-seq:
|
|
687
|
+
* set.hash -> integer
|
|
688
|
+
*
|
|
689
|
+
* Compute a hash-code for this set.
|
|
690
|
+
* Uses an improved hash algorithm for better distribution.
|
|
691
|
+
*/
|
|
692
|
+
static mrb_value
|
|
693
|
+
set_hash_m(mrb_state *mrb, mrb_value self)
|
|
694
|
+
{
|
|
695
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
696
|
+
|
|
697
|
+
/* Use order-independent hash algorithm for sets */
|
|
698
|
+
uint64_t hash = 0; /* Start with zero for XOR accumulation */
|
|
699
|
+
|
|
700
|
+
/* Include the size of the set in the hash */
|
|
701
|
+
size_t size = kset_size(set);
|
|
702
|
+
hash ^= size * GOLDEN_RATIO_PRIME;
|
|
703
|
+
|
|
704
|
+
if (!kset_is_uninitialized(set) && size > 0) {
|
|
705
|
+
/* Process each element - order independent using XOR */
|
|
706
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
707
|
+
KSET_FOREACH(set, k) {
|
|
708
|
+
/* Get element's hash code */
|
|
709
|
+
khint_t elem_hash = (khint_t)mrb_obj_hash_code(mrb, kset_key(set, k));
|
|
710
|
+
|
|
711
|
+
/* XOR is commutative, so order doesn't matter */
|
|
712
|
+
hash ^= elem_hash * GOLDEN_RATIO_PRIME;
|
|
713
|
+
|
|
714
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/* Final mixing to improve distribution */
|
|
719
|
+
hash ^= hash >> 32;
|
|
720
|
+
|
|
721
|
+
return mrb_fixnum_value((mrb_int)hash);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/*
|
|
725
|
+
* call-seq:
|
|
726
|
+
* set.superset?(other) -> true or false
|
|
727
|
+
* set >= other -> true or false
|
|
728
|
+
*
|
|
729
|
+
* Returns true if the set is a superset of the given set.
|
|
730
|
+
*/
|
|
731
|
+
static mrb_value
|
|
732
|
+
set_superset_p(mrb_state *mrb, mrb_value self)
|
|
733
|
+
{
|
|
734
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
735
|
+
|
|
736
|
+
/* Check if other is a Set */
|
|
737
|
+
set_check_type(mrb, other);
|
|
738
|
+
|
|
739
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
740
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
741
|
+
|
|
742
|
+
/* Handle empty sets */
|
|
743
|
+
if (kset_is_empty(other_set)) {
|
|
744
|
+
return mrb_true_value(); /* Empty set is a subset of any set */
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (kset_is_uninitialized(self_set)) {
|
|
748
|
+
return mrb_false_value(); /* Empty set is not a superset of a non-empty set */
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/* Check size first - a superset must be at least as large as the subset */
|
|
752
|
+
if (kset_size(self_set) < kset_size(other_set)) {
|
|
753
|
+
return mrb_false_value();
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/* Check if all elements in other are in self */
|
|
757
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
758
|
+
KSET_FOREACH(other_set, k) {
|
|
759
|
+
kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
|
|
760
|
+
if (kset_is_end(self_set, self_k)) {
|
|
761
|
+
return mrb_false_value(); /* Element in other not found in self */
|
|
762
|
+
}
|
|
763
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
return mrb_true_value();
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/*
|
|
770
|
+
* call-seq:
|
|
771
|
+
* set.proper_superset?(other) -> true or false
|
|
772
|
+
* set > other -> true or false
|
|
773
|
+
*
|
|
774
|
+
* Returns true if the set is a proper superset of the given set.
|
|
775
|
+
*/
|
|
776
|
+
static mrb_value
|
|
777
|
+
set_proper_superset_p(mrb_state *mrb, mrb_value self)
|
|
778
|
+
{
|
|
779
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
780
|
+
|
|
781
|
+
/* Check if other is a Set */
|
|
782
|
+
set_check_type(mrb, other);
|
|
783
|
+
|
|
784
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
785
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
786
|
+
|
|
787
|
+
/* Handle empty sets */
|
|
788
|
+
if (kset_is_empty(other_set)) {
|
|
789
|
+
/* Empty set is a proper subset of any non-empty set */
|
|
790
|
+
return !kset_is_empty(self_set) ? mrb_true_value() : mrb_false_value();
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
if (kset_is_uninitialized(self_set)) {
|
|
794
|
+
return mrb_false_value(); /* Empty set is not a proper superset of any set */
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
/* For a proper superset, self must be strictly larger than other */
|
|
798
|
+
if (kset_size(self_set) <= kset_size(other_set)) {
|
|
799
|
+
return mrb_false_value();
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/* Check if all elements in other are in self */
|
|
803
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
804
|
+
KSET_FOREACH(other_set, k) {
|
|
805
|
+
kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
|
|
806
|
+
if (kset_is_end(self_set, self_k)) {
|
|
807
|
+
return mrb_false_value(); /* Element in other not found in self */
|
|
808
|
+
}
|
|
809
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
return mrb_true_value();
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/*
|
|
816
|
+
* call-seq:
|
|
817
|
+
* set.subset?(other) -> true or false
|
|
818
|
+
* set <= other -> true or false
|
|
819
|
+
*
|
|
820
|
+
* Returns true if the set is a subset of the given set.
|
|
821
|
+
*/
|
|
822
|
+
static mrb_value
|
|
823
|
+
set_subset_p(mrb_state *mrb, mrb_value self)
|
|
824
|
+
{
|
|
825
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
826
|
+
|
|
827
|
+
/* Check if other is a Set */
|
|
828
|
+
set_check_type(mrb, other);
|
|
829
|
+
|
|
830
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
831
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
832
|
+
|
|
833
|
+
/* Handle empty sets */
|
|
834
|
+
if (kset_is_empty(self_set)) {
|
|
835
|
+
return mrb_true_value(); /* Empty set is a subset of any set */
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
if (kset_is_uninitialized(other_set)) {
|
|
839
|
+
return mrb_false_value(); /* Non-empty set is not a subset of an empty set */
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/* Check size first - a subset cannot be larger than its superset */
|
|
843
|
+
if (kset_size(other_set) < kset_size(self_set)) {
|
|
844
|
+
return mrb_false_value();
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/* Check if all elements in self are in other */
|
|
848
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
849
|
+
KSET_FOREACH(self_set, k) {
|
|
850
|
+
kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
851
|
+
if (kset_is_end(other_set, other_k)) {
|
|
852
|
+
return mrb_false_value(); /* Element in self not found in other */
|
|
853
|
+
}
|
|
854
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
return mrb_true_value();
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/*
|
|
861
|
+
* call-seq:
|
|
862
|
+
* set.proper_subset?(other) -> true or false
|
|
863
|
+
* set < other -> true or false
|
|
864
|
+
*
|
|
865
|
+
* Returns true if the set is a proper subset of the given set.
|
|
866
|
+
*/
|
|
867
|
+
static mrb_value
|
|
868
|
+
set_proper_subset_p(mrb_state *mrb, mrb_value self)
|
|
869
|
+
{
|
|
870
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
871
|
+
|
|
872
|
+
/* Check if other is a Set */
|
|
873
|
+
set_check_type(mrb, other);
|
|
874
|
+
|
|
875
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
876
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
877
|
+
|
|
878
|
+
/* Handle empty sets */
|
|
879
|
+
if (kset_is_empty(self_set)) {
|
|
880
|
+
/* Empty set is a proper subset of any non-empty set */
|
|
881
|
+
return !kset_is_empty(other_set) ? mrb_true_value() : mrb_false_value();
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
if (kset_is_uninitialized(other_set)) {
|
|
885
|
+
return mrb_false_value(); /* Non-empty set is not a proper subset of an empty set */
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/* For a proper subset, self must be strictly smaller than other */
|
|
889
|
+
if (kset_size(other_set) <= kset_size(self_set)) {
|
|
890
|
+
return mrb_false_value();
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/* Check if all elements in self are in other */
|
|
894
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
895
|
+
KSET_FOREACH(self_set, k) {
|
|
896
|
+
kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
897
|
+
if (kset_is_end(other_set, other_k)) {
|
|
898
|
+
return mrb_false_value(); /* Element in self not found in other */
|
|
899
|
+
}
|
|
900
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
return mrb_true_value();
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/*
|
|
907
|
+
* call-seq:
|
|
908
|
+
* set.intersect?(other) -> true or false
|
|
909
|
+
*
|
|
910
|
+
* Returns true if the set and the given set have at least one element in common.
|
|
911
|
+
*/
|
|
912
|
+
static mrb_value
|
|
913
|
+
set_intersect_p(mrb_state *mrb, mrb_value self)
|
|
914
|
+
{
|
|
915
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
916
|
+
|
|
917
|
+
/* Check if other is a Set */
|
|
918
|
+
set_check_type(mrb, other);
|
|
919
|
+
|
|
920
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
921
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
922
|
+
|
|
923
|
+
/* Handle empty sets */
|
|
924
|
+
if (kset_is_empty(self_set) || kset_is_empty(other_set)) {
|
|
925
|
+
return mrb_false_value(); /* Empty sets have no elements in common */
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/* Iterate through the smaller set for efficiency */
|
|
929
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
930
|
+
if (kset_size(self_set) < kset_size(other_set)) {
|
|
931
|
+
KSET_FOREACH(self_set, k) {
|
|
932
|
+
kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
933
|
+
if (!kset_is_end(other_set, other_k)) {
|
|
934
|
+
return mrb_true_value(); /* Found a common element */
|
|
935
|
+
}
|
|
936
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
else {
|
|
940
|
+
KSET_FOREACH(other_set, k) {
|
|
941
|
+
kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
|
|
942
|
+
if (!kset_is_end(self_set, self_k)) {
|
|
943
|
+
return mrb_true_value(); /* Found a common element */
|
|
944
|
+
}
|
|
945
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
return mrb_false_value(); /* No common elements found */
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/*
|
|
953
|
+
* call-seq:
|
|
954
|
+
* set.disjoint?(other) -> true or false
|
|
955
|
+
*
|
|
956
|
+
* Returns true if the set and the given set have no elements in common.
|
|
957
|
+
*/
|
|
958
|
+
static mrb_value
|
|
959
|
+
set_disjoint_p(mrb_state *mrb, mrb_value self)
|
|
960
|
+
{
|
|
961
|
+
mrb_value result = set_intersect_p(mrb, self);
|
|
962
|
+
return mrb_bool_value(!mrb_test(result));
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
/*
|
|
966
|
+
* call-seq:
|
|
967
|
+
* set <=> other -> -1, 0, +1, or nil
|
|
968
|
+
*
|
|
969
|
+
* Compares this set with another set.
|
|
970
|
+
* Returns -1 if this set is a proper subset of the other set,
|
|
971
|
+
* +1 if this set is a proper superset of the other set,
|
|
972
|
+
* 0 if the sets are equal,
|
|
973
|
+
* or nil if the sets cannot be compared (they are neither subsets nor supersets).
|
|
974
|
+
*/
|
|
975
|
+
static mrb_value
|
|
976
|
+
set_cmp(mrb_state *mrb, mrb_value self)
|
|
977
|
+
{
|
|
978
|
+
mrb_value other = mrb_get_arg1(mrb);
|
|
979
|
+
|
|
980
|
+
if (!set_is_set(other)) {
|
|
981
|
+
return mrb_nil_value();
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
985
|
+
kset_t *other_set = set_get_kset(mrb, other);
|
|
986
|
+
|
|
987
|
+
/* Handle empty sets */
|
|
988
|
+
if (kset_is_empty(self_set)) {
|
|
989
|
+
if (kset_is_empty(other_set)) {
|
|
990
|
+
return mrb_fixnum_value(0); /* Both empty, they're equal */
|
|
991
|
+
}
|
|
992
|
+
return mrb_fixnum_value(-1); /* Empty set is a proper subset of any non-empty set */
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
if (kset_is_empty(other_set)) {
|
|
996
|
+
return mrb_fixnum_value(1); /* Any non-empty set is a proper superset of an empty set */
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
/* Compare sizes */
|
|
1000
|
+
mrb_int size_diff = kset_size(self_set) - kset_size(other_set);
|
|
1001
|
+
|
|
1002
|
+
if (size_diff < 0) {
|
|
1003
|
+
/* self might be a proper subset of other */
|
|
1004
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1005
|
+
KSET_FOREACH(self_set, k) {
|
|
1006
|
+
kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
1007
|
+
if (kset_is_end(other_set, other_k)) {
|
|
1008
|
+
/* Not a subset */
|
|
1009
|
+
return mrb_nil_value(); /* Not comparable */
|
|
1010
|
+
}
|
|
1011
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
/* All elements of self are in other, and self is smaller than other */
|
|
1015
|
+
return mrb_fixnum_value(-1); /* self is a proper subset of other */
|
|
1016
|
+
}
|
|
1017
|
+
else if (size_diff > 0) {
|
|
1018
|
+
/* self might be a proper superset of other */
|
|
1019
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1020
|
+
KSET_FOREACH(other_set, k) {
|
|
1021
|
+
kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
|
|
1022
|
+
if (kset_is_end(self_set, self_k)) {
|
|
1023
|
+
/* Not a superset */
|
|
1024
|
+
return mrb_nil_value(); /* Not comparable */
|
|
1025
|
+
}
|
|
1026
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
/* All elements of other are in self, and self is larger than other */
|
|
1030
|
+
return mrb_fixnum_value(1); /* self is a proper superset of other */
|
|
1031
|
+
}
|
|
1032
|
+
else { /* size_diff == 0 */
|
|
1033
|
+
/* Same size, check if they're equal */
|
|
1034
|
+
mrb_bool is_equal = TRUE;
|
|
1035
|
+
|
|
1036
|
+
int ai3 = mrb_gc_arena_save(mrb);
|
|
1037
|
+
KSET_FOREACH(self_set, k) {
|
|
1038
|
+
kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
|
|
1039
|
+
if (kset_is_end(other_set, other_k)) {
|
|
1040
|
+
is_equal = FALSE;
|
|
1041
|
+
break;
|
|
1042
|
+
}
|
|
1043
|
+
mrb_gc_arena_restore(mrb, ai3);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
if (is_equal) {
|
|
1047
|
+
return mrb_fixnum_value(0); /* Sets are equal */
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
/* Sets are not comparable */
|
|
1052
|
+
return mrb_nil_value();
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/*
|
|
1056
|
+
* call-seq:
|
|
1057
|
+
* set.join(separator = nil) -> string
|
|
1058
|
+
*
|
|
1059
|
+
* Returns a string created by converting each element of the set to a string,
|
|
1060
|
+
* separated by the given separator.
|
|
1061
|
+
*/
|
|
1062
|
+
static mrb_value
|
|
1063
|
+
set_join(mrb_state *mrb, mrb_value self)
|
|
1064
|
+
{
|
|
1065
|
+
mrb_value separator = mrb_nil_value();
|
|
1066
|
+
mrb_get_args(mrb, "|S", &separator);
|
|
1067
|
+
|
|
1068
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
1069
|
+
if (kset_is_empty(set)) {
|
|
1070
|
+
return mrb_str_new_lit(mrb, "");
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
/* Create result string */
|
|
1074
|
+
mrb_value result = mrb_str_new_capa(mrb, 64); /* Initial capacity */
|
|
1075
|
+
mrb_bool first = TRUE;
|
|
1076
|
+
|
|
1077
|
+
/* Iterate through all elements */
|
|
1078
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1079
|
+
KSET_FOREACH(set, k) {
|
|
1080
|
+
if (!first) {
|
|
1081
|
+
if (!mrb_nil_p(separator)) {
|
|
1082
|
+
mrb_str_cat(mrb, result, RSTRING_PTR(separator), RSTRING_LEN(separator));
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
else {
|
|
1086
|
+
first = FALSE;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
mrb_value elem = kset_key(set, k);
|
|
1090
|
+
mrb_value str = mrb_obj_as_string(mrb, elem);
|
|
1091
|
+
mrb_str_cat_str(mrb, result, str);
|
|
1092
|
+
|
|
1093
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
return result;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
/*
|
|
1100
|
+
* call-seq:
|
|
1101
|
+
* set.inspect -> string
|
|
1102
|
+
* set.to_s -> string
|
|
1103
|
+
*
|
|
1104
|
+
* Returns a string representation of the set.
|
|
1105
|
+
* Format: Set[elem1, elem2, ...]
|
|
1106
|
+
*/
|
|
1107
|
+
static mrb_value
|
|
1108
|
+
set_inspect(mrb_state *mrb, mrb_value self)
|
|
1109
|
+
{
|
|
1110
|
+
struct RClass* c = mrb_obj_class(mrb, self);
|
|
1111
|
+
const char* classname = mrb_class_name(mrb, c);
|
|
1112
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
1113
|
+
|
|
1114
|
+
/* Handle empty set */
|
|
1115
|
+
if (kset_is_empty(set)) {
|
|
1116
|
+
return mrb_format(mrb, "%s[]", classname);
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
/* Handle recursive inspection */
|
|
1120
|
+
if (MRB_RECURSIVE_UNARY_P(mrb, MRB_SYM(inspect), self)) {
|
|
1121
|
+
return mrb_format(mrb, "%s[...]", classname);
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
/* Estimate buffer size based on set size */
|
|
1125
|
+
size_t size = kset_size(set);
|
|
1126
|
+
size_t buffer_size = 16 + strlen(classname) + (size * 8); /* Rough estimate */
|
|
1127
|
+
|
|
1128
|
+
/* Create the beginning of the string with pre-allocated capacity */
|
|
1129
|
+
mrb_value result_str = mrb_str_new_capa(mrb, buffer_size);
|
|
1130
|
+
mrb_str_cat_cstr(mrb, result_str, classname);
|
|
1131
|
+
mrb_str_cat_lit(mrb, result_str, "[");
|
|
1132
|
+
|
|
1133
|
+
/* Iterate through all elements */
|
|
1134
|
+
mrb_bool first = TRUE;
|
|
1135
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1136
|
+
KSET_FOREACH(set, k) {
|
|
1137
|
+
if (!first) {
|
|
1138
|
+
mrb_str_cat_lit(mrb, result_str, ", ");
|
|
1139
|
+
}
|
|
1140
|
+
else {
|
|
1141
|
+
first = FALSE;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
mrb_value elem = kset_key(set, k);
|
|
1145
|
+
mrb_value entry_str = mrb_inspect(mrb, elem);
|
|
1146
|
+
mrb_str_cat_str(mrb, result_str, entry_str);
|
|
1147
|
+
|
|
1148
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
/* Add the closing part */
|
|
1152
|
+
mrb_str_cat_lit(mrb, result_str, "]");
|
|
1153
|
+
|
|
1154
|
+
return result_str;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
/*
|
|
1158
|
+
* call-seq:
|
|
1159
|
+
* set.reset -> self
|
|
1160
|
+
*
|
|
1161
|
+
* Resets the internal state after modification to existing elements.
|
|
1162
|
+
* This is necessary when the hash value of objects in the set has changed.
|
|
1163
|
+
* It rebuilds the hash table to ensure all elements can be found.
|
|
1164
|
+
*/
|
|
1165
|
+
static mrb_value
|
|
1166
|
+
set_reset(mrb_state *mrb, mrb_value self)
|
|
1167
|
+
{
|
|
1168
|
+
mrb_check_frozen_value(mrb, self);
|
|
1169
|
+
|
|
1170
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
1171
|
+
if (!kset_is_empty(set)) {
|
|
1172
|
+
kset_resize(mrb, set, kset_size(set));
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
return self;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
/*
|
|
1179
|
+
* call-seq:
|
|
1180
|
+
* set.add_all(*objects) -> self
|
|
1181
|
+
*
|
|
1182
|
+
* Adds multiple objects to the set and returns self.
|
|
1183
|
+
*/
|
|
1184
|
+
static mrb_value
|
|
1185
|
+
set_add_all(mrb_state *mrb, mrb_value self)
|
|
1186
|
+
{
|
|
1187
|
+
const mrb_value *argv;
|
|
1188
|
+
mrb_int argc;
|
|
1189
|
+
|
|
1190
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1191
|
+
kset_t *set = set_get_kset(mrb, self);
|
|
1192
|
+
set_ensure_initialized(mrb, set);
|
|
1193
|
+
|
|
1194
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1195
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1196
|
+
kset_put(mrb, set, argv[i]);
|
|
1197
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(set), argv[i]);
|
|
1198
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
return self;
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
/*
|
|
1205
|
+
* Optimized implementation for flattening sets
|
|
1206
|
+
* Uses a more efficient algorithm with minimal memory usage
|
|
1207
|
+
*/
|
|
1208
|
+
|
|
1209
|
+
/* Small array for tracking seen object IDs to detect cycles */
|
|
1210
|
+
#define MAX_NESTED_DEPTH 16
|
|
1211
|
+
|
|
1212
|
+
/*
|
|
1213
|
+
* Recursively flattens a set by merging nested sets into the target set.
|
|
1214
|
+
* This is an internal helper function that does not call back to the VM.
|
|
1215
|
+
*
|
|
1216
|
+
* @param mrb The mruby state
|
|
1217
|
+
* @param target The target set table to add elements to
|
|
1218
|
+
* @param source The source set table to flatten
|
|
1219
|
+
* @param seen_count Pointer to the current count of seen sets (recursion depth)
|
|
1220
|
+
* @return 0 on success, -1 if recursion depth exceeds maximum
|
|
1221
|
+
*/
|
|
1222
|
+
static int
|
|
1223
|
+
set_flatten_recursive(mrb_state *mrb, kset_t *target, kset_t *source, int *seen_count)
|
|
1224
|
+
{
|
|
1225
|
+
if (!source || !target) return 0;
|
|
1226
|
+
if (*seen_count >= MAX_NESTED_DEPTH) return -1;
|
|
1227
|
+
|
|
1228
|
+
struct RBasic *target_obj = kset_to_rset(target);
|
|
1229
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1230
|
+
/* Process each element in the source set */
|
|
1231
|
+
KSET_FOREACH(source, k) {
|
|
1232
|
+
mrb_value elem = kset_key(source, k);
|
|
1233
|
+
|
|
1234
|
+
/* Check if element is a Set */
|
|
1235
|
+
if (set_is_set(elem)) {
|
|
1236
|
+
/* Increment recursion depth */
|
|
1237
|
+
(*seen_count)++;
|
|
1238
|
+
|
|
1239
|
+
/* Recursively flatten the nested set */
|
|
1240
|
+
kset_t *nested_set = set_get_kset(mrb, elem);
|
|
1241
|
+
if (nested_set) {
|
|
1242
|
+
int nested_result = set_flatten_recursive(mrb, target, nested_set, seen_count);
|
|
1243
|
+
if (nested_result < 0) {
|
|
1244
|
+
return nested_result; /* Propagate error code */
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
/* Decrement recursion depth */
|
|
1249
|
+
(*seen_count)--;
|
|
1250
|
+
}
|
|
1251
|
+
else {
|
|
1252
|
+
/* Add non-Set element directly */
|
|
1253
|
+
kset_put(mrb, target, elem);
|
|
1254
|
+
mrb_field_write_barrier_value(mrb, target_obj, elem);
|
|
1255
|
+
}
|
|
1256
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1257
|
+
}
|
|
1258
|
+
return 0;
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
/*
|
|
1262
|
+
* Helper function: Check if a set has any nested sets
|
|
1263
|
+
* Returns TRUE if nested sets found, FALSE otherwise
|
|
1264
|
+
*/
|
|
1265
|
+
static mrb_bool
|
|
1266
|
+
set_has_nested_sets(mrb_state *mrb, kset_t *set)
|
|
1267
|
+
{
|
|
1268
|
+
if (kset_is_empty(set)) return FALSE;
|
|
1269
|
+
|
|
1270
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1271
|
+
KSET_FOREACH(set, k) {
|
|
1272
|
+
if (set_is_set(kset_key(set, k))) {
|
|
1273
|
+
return TRUE;
|
|
1274
|
+
}
|
|
1275
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1276
|
+
}
|
|
1277
|
+
return FALSE;
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
/*
|
|
1281
|
+
* Helper function: Perform the actual flattening operation
|
|
1282
|
+
* Returns the flattened set (creates a new kset_t*)
|
|
1283
|
+
*/
|
|
1284
|
+
static void
|
|
1285
|
+
set_do_flatten(mrb_state *mrb, kset_t *result_set, kset_t *source_set)
|
|
1286
|
+
{
|
|
1287
|
+
int seen_count = 0;
|
|
1288
|
+
|
|
1289
|
+
if (set_flatten_recursive(mrb, result_set, source_set, &seen_count) < 0) {
|
|
1290
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "flatten recursion depth too deep");
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
/*
|
|
1295
|
+
* call-seq:
|
|
1296
|
+
* set.flatten -> new_set
|
|
1297
|
+
*
|
|
1298
|
+
* Returns a new set that is a flattened version of this set.
|
|
1299
|
+
* Recursively flattens nested sets.
|
|
1300
|
+
*/
|
|
1301
|
+
static mrb_value
|
|
1302
|
+
set_flatten(mrb_state *mrb, mrb_value self)
|
|
1303
|
+
{
|
|
1304
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
1305
|
+
|
|
1306
|
+
/* Fast path for empty sets */
|
|
1307
|
+
if (kset_is_empty(self_set)) {
|
|
1308
|
+
return mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
/* Fast path: check if there are any nested sets */
|
|
1312
|
+
if (!set_has_nested_sets(mrb, self_set)) {
|
|
1313
|
+
return mrb_obj_dup(mrb, self);
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/* Create a new set and flatten into it */
|
|
1317
|
+
mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
|
|
1318
|
+
kset_t *result_set = set_get_kset(mrb, result);
|
|
1319
|
+
|
|
1320
|
+
set_do_flatten(mrb, result_set, self_set);
|
|
1321
|
+
|
|
1322
|
+
return result;
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
/*
|
|
1326
|
+
* call-seq:
|
|
1327
|
+
* set.flatten! -> self or nil
|
|
1328
|
+
*
|
|
1329
|
+
* Replaces the contents of this set with a flattened version of itself.
|
|
1330
|
+
* Returns self if flattened, nil if no changes were made.
|
|
1331
|
+
*/
|
|
1332
|
+
static mrb_value
|
|
1333
|
+
set_flatten_bang(mrb_state *mrb, mrb_value self)
|
|
1334
|
+
{
|
|
1335
|
+
mrb_check_frozen_value(mrb, self);
|
|
1336
|
+
|
|
1337
|
+
kset_t *self_set = set_get_kset(mrb, self);
|
|
1338
|
+
if (kset_is_empty(self_set)) {
|
|
1339
|
+
return mrb_nil_value(); /* No changes needed for empty set */
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
/* Check if there are any nested sets */
|
|
1343
|
+
if (!set_has_nested_sets(mrb, self_set)) {
|
|
1344
|
+
return mrb_nil_value(); /* No nested sets, no changes needed */
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
/* Create a temporary set to flatten into (GC-protected) */
|
|
1348
|
+
mrb_value temp = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
|
|
1349
|
+
kset_t *temp_set = set_get_kset(mrb, temp);
|
|
1350
|
+
|
|
1351
|
+
set_do_flatten(mrb, temp_set, self_set);
|
|
1352
|
+
|
|
1353
|
+
/* Swap the data between self and temp */
|
|
1354
|
+
kset_t temp_data = *self_set;
|
|
1355
|
+
*self_set = *temp_set;
|
|
1356
|
+
*temp_set = temp_data;
|
|
1357
|
+
|
|
1358
|
+
return self;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
/*
|
|
1362
|
+
* call-seq:
|
|
1363
|
+
* set.delete_all(*objects) -> self
|
|
1364
|
+
*
|
|
1365
|
+
* Deletes multiple objects from the set and returns self.
|
|
1366
|
+
*/
|
|
1367
|
+
static mrb_value
|
|
1368
|
+
set_delete_all(mrb_state *mrb, mrb_value self)
|
|
1369
|
+
{
|
|
1370
|
+
const mrb_value *argv;
|
|
1371
|
+
mrb_int argc;
|
|
1372
|
+
|
|
1373
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1374
|
+
kset_t *ks = set_get_kset(mrb, self);
|
|
1375
|
+
if (kset_is_uninitialized(ks)) return self;
|
|
1376
|
+
|
|
1377
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
1378
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1379
|
+
kset_iter_t k = kset_get(mrb, ks, argv[i]);
|
|
1380
|
+
if (!kset_is_end(ks, k)) {
|
|
1381
|
+
kset_del(mrb, ks, k);
|
|
1382
|
+
}
|
|
1383
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
return self;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
/*
|
|
1390
|
+
* call-seq:
|
|
1391
|
+
* set.include_all?(*objects) -> true or false
|
|
1392
|
+
*
|
|
1393
|
+
* Returns true if the set contains all of the given objects.
|
|
1394
|
+
*/
|
|
1395
|
+
static mrb_value
|
|
1396
|
+
set_include_all_p(mrb_state *mrb, mrb_value self)
|
|
1397
|
+
{
|
|
1398
|
+
const mrb_value *argv;
|
|
1399
|
+
mrb_int argc;
|
|
1400
|
+
|
|
1401
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1402
|
+
kset_t *ks = set_get_kset(mrb, self);
|
|
1403
|
+
if (kset_is_uninitialized(ks)) return mrb_false_value();
|
|
1404
|
+
|
|
1405
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1406
|
+
kset_iter_t k = kset_get(mrb, ks, argv[i]);
|
|
1407
|
+
if (kset_is_end(ks, k)) {
|
|
1408
|
+
return mrb_false_value();
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
return mrb_true_value();
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
/*
|
|
1416
|
+
* call-seq:
|
|
1417
|
+
* set.include_any?(*objects) -> true or false
|
|
1418
|
+
*
|
|
1419
|
+
* Returns true if the set contains any of the given objects.
|
|
1420
|
+
*/
|
|
1421
|
+
static mrb_value
|
|
1422
|
+
set_include_any_p(mrb_state *mrb, mrb_value self)
|
|
1423
|
+
{
|
|
1424
|
+
const mrb_value *argv;
|
|
1425
|
+
mrb_int argc;
|
|
1426
|
+
|
|
1427
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1428
|
+
kset_t *ks = set_get_kset(mrb, self);
|
|
1429
|
+
if (kset_is_empty(ks)) return mrb_false_value();
|
|
1430
|
+
|
|
1431
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1432
|
+
kset_iter_t k = kset_get(mrb, ks, argv[i]);
|
|
1433
|
+
if (!kset_is_end(ks, k)) {
|
|
1434
|
+
return mrb_true_value();
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
return mrb_false_value();
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
/*
|
|
1442
|
+
* call-seq:
|
|
1443
|
+
* Set[*ary] -> new_set
|
|
1444
|
+
*
|
|
1445
|
+
* Creates a new set containing the given objects.
|
|
1446
|
+
*/
|
|
1447
|
+
static mrb_value
|
|
1448
|
+
set_s_create(mrb_state *mrb, mrb_value klass)
|
|
1449
|
+
{
|
|
1450
|
+
const mrb_value *argv;
|
|
1451
|
+
mrb_int argc;
|
|
1452
|
+
|
|
1453
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1454
|
+
|
|
1455
|
+
/* Optimized direct creation */
|
|
1456
|
+
mrb_value set = mrb_obj_new(mrb, mrb_class_ptr(klass), 0, NULL);
|
|
1457
|
+
kset_t *ks = set_get_kset(mrb, set);
|
|
1458
|
+
|
|
1459
|
+
for (mrb_int i = 0; i < argc; i++) {
|
|
1460
|
+
kset_put(mrb, ks, argv[i]);
|
|
1461
|
+
mrb_field_write_barrier_value(mrb, kset_to_rset(ks), argv[i]);
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
return set;
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
static const mrb_mt_entry set_rom_entries[] = {
|
|
1468
|
+
MRB_MT_ENTRY(set_size, MRB_SYM(size), MRB_ARGS_NONE()),
|
|
1469
|
+
MRB_MT_ENTRY(set_size, MRB_SYM(length), MRB_ARGS_NONE()),
|
|
1470
|
+
MRB_MT_ENTRY(set_empty_p, MRB_SYM_Q(empty), MRB_ARGS_NONE()),
|
|
1471
|
+
MRB_MT_ENTRY(set_clear, MRB_SYM(clear), MRB_ARGS_NONE()),
|
|
1472
|
+
MRB_MT_ENTRY(set_to_a, MRB_SYM(to_a), MRB_ARGS_NONE()),
|
|
1473
|
+
MRB_MT_ENTRY(set_include_p, MRB_SYM_Q(include), MRB_ARGS_REQ(1)),
|
|
1474
|
+
MRB_MT_ENTRY(set_include_p, MRB_SYM_Q(member), MRB_ARGS_REQ(1)),
|
|
1475
|
+
MRB_MT_ENTRY(set_include_p, MRB_OPSYM(eqq), MRB_ARGS_REQ(1)),
|
|
1476
|
+
MRB_MT_ENTRY(set_add, MRB_SYM(add), MRB_ARGS_REQ(1)),
|
|
1477
|
+
MRB_MT_ENTRY(set_add, MRB_OPSYM(lshift), MRB_ARGS_REQ(1)),
|
|
1478
|
+
MRB_MT_ENTRY(set_add_p, MRB_SYM_Q(add), MRB_ARGS_REQ(1)),
|
|
1479
|
+
MRB_MT_ENTRY(set_delete, MRB_SYM(delete), MRB_ARGS_REQ(1)),
|
|
1480
|
+
MRB_MT_ENTRY(set_delete_p, MRB_SYM_Q(delete), MRB_ARGS_REQ(1)),
|
|
1481
|
+
MRB_MT_ENTRY(set_init, MRB_SYM(__init), MRB_ARGS_NONE()),
|
|
1482
|
+
MRB_MT_ENTRY(set_core_merge, MRB_SYM(__merge), MRB_ARGS_REQ(1)),
|
|
1483
|
+
MRB_MT_ENTRY(set_core_subtract, MRB_SYM(__subtract), MRB_ARGS_REQ(1)),
|
|
1484
|
+
MRB_MT_ENTRY(set_core_union, MRB_SYM(__union), MRB_ARGS_REQ(1)),
|
|
1485
|
+
MRB_MT_ENTRY(set_core_difference, MRB_SYM(__difference), MRB_ARGS_REQ(1)),
|
|
1486
|
+
MRB_MT_ENTRY(set_core_intersection, MRB_SYM(__intersection), MRB_ARGS_REQ(1)),
|
|
1487
|
+
MRB_MT_ENTRY(set_core_xor, MRB_SYM(__xor), MRB_ARGS_REQ(1)),
|
|
1488
|
+
MRB_MT_ENTRY(set_equal, MRB_OPSYM(eq), MRB_ARGS_REQ(1)),
|
|
1489
|
+
MRB_MT_ENTRY(set_hash_m, MRB_SYM(hash), MRB_ARGS_NONE()),
|
|
1490
|
+
MRB_MT_ENTRY(set_join, MRB_SYM(join), MRB_ARGS_OPT(1)),
|
|
1491
|
+
MRB_MT_ENTRY(set_inspect, MRB_SYM(inspect), MRB_ARGS_NONE()),
|
|
1492
|
+
MRB_MT_ENTRY(set_inspect, MRB_SYM(to_s), MRB_ARGS_NONE()),
|
|
1493
|
+
MRB_MT_ENTRY(set_reset, MRB_SYM(reset), MRB_ARGS_NONE()),
|
|
1494
|
+
MRB_MT_ENTRY(set_add_all, MRB_SYM(add_all), MRB_ARGS_ANY()),
|
|
1495
|
+
MRB_MT_ENTRY(set_delete_all, MRB_SYM(delete_all), MRB_ARGS_ANY()),
|
|
1496
|
+
MRB_MT_ENTRY(set_include_all_p, MRB_SYM_Q(include_all), MRB_ARGS_ANY()),
|
|
1497
|
+
MRB_MT_ENTRY(set_include_any_p, MRB_SYM_Q(include_any), MRB_ARGS_ANY()),
|
|
1498
|
+
MRB_MT_ENTRY(set_superset_p, MRB_SYM_Q(superset), MRB_ARGS_REQ(1)),
|
|
1499
|
+
MRB_MT_ENTRY(set_superset_p, MRB_OPSYM(ge), MRB_ARGS_REQ(1)),
|
|
1500
|
+
MRB_MT_ENTRY(set_proper_superset_p, MRB_SYM_Q(proper_superset), MRB_ARGS_REQ(1)),
|
|
1501
|
+
MRB_MT_ENTRY(set_proper_superset_p, MRB_OPSYM(gt), MRB_ARGS_REQ(1)),
|
|
1502
|
+
MRB_MT_ENTRY(set_subset_p, MRB_SYM_Q(subset), MRB_ARGS_REQ(1)),
|
|
1503
|
+
MRB_MT_ENTRY(set_subset_p, MRB_OPSYM(le), MRB_ARGS_REQ(1)),
|
|
1504
|
+
MRB_MT_ENTRY(set_proper_subset_p, MRB_SYM_Q(proper_subset), MRB_ARGS_REQ(1)),
|
|
1505
|
+
MRB_MT_ENTRY(set_proper_subset_p, MRB_OPSYM(lt), MRB_ARGS_REQ(1)),
|
|
1506
|
+
MRB_MT_ENTRY(set_intersect_p, MRB_SYM_Q(intersect), MRB_ARGS_REQ(1)),
|
|
1507
|
+
MRB_MT_ENTRY(set_disjoint_p, MRB_SYM_Q(disjoint), MRB_ARGS_REQ(1)),
|
|
1508
|
+
MRB_MT_ENTRY(set_cmp, MRB_OPSYM(cmp), MRB_ARGS_REQ(1)),
|
|
1509
|
+
MRB_MT_ENTRY(set_flatten, MRB_SYM(flatten), MRB_ARGS_NONE()),
|
|
1510
|
+
MRB_MT_ENTRY(set_flatten_bang, MRB_SYM_B(flatten), MRB_ARGS_NONE()),
|
|
1511
|
+
};
|
|
1512
|
+
|
|
1513
|
+
void
|
|
1514
|
+
mrb_mruby_set_gem_init(mrb_state *mrb)
|
|
1515
|
+
{
|
|
1516
|
+
struct RClass *set;
|
|
1517
|
+
|
|
1518
|
+
set = mrb_define_class(mrb, "Set", mrb->object_class);
|
|
1519
|
+
MRB_SET_INSTANCE_TT(set, MRB_TT_SET);
|
|
1520
|
+
|
|
1521
|
+
mrb_include_module(mrb, set, mrb_module_get(mrb, "Enumerable"));
|
|
1522
|
+
|
|
1523
|
+
mrb_define_class_method(mrb, set, "[]", set_s_create, MRB_ARGS_ANY());
|
|
1524
|
+
|
|
1525
|
+
mrb_define_private_method(mrb, set, "initialize_copy", set_init_copy, MRB_ARGS_REQ(1));
|
|
1526
|
+
|
|
1527
|
+
MRB_MT_INIT_ROM(mrb, set, set_rom_entries);
|
|
1528
|
+
|
|
1529
|
+
mrb_define_alias(mrb, set, "eql?", "==");
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
void
|
|
1533
|
+
mrb_mruby_set_gem_final(mrb_state *mrb)
|
|
1534
|
+
{
|
|
1535
|
+
}
|