adlint 1.0.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.
- data/AUTHORS +27 -0
- data/COPYING +674 -0
- data/ChangeLog +820 -0
- data/INSTALL +78 -0
- data/MANIFEST +464 -0
- data/NEWS +38 -0
- data/README +74 -0
- data/Rakefile +167 -0
- data/TODO +29 -0
- data/bin/adlint +141 -0
- data/bin/adlint_chk +129 -0
- data/bin/adlint_cma +122 -0
- data/bin/adlint_sma +129 -0
- data/bin/adlintize +286 -0
- data/etc/conf.d/fallback/cinit.erb +11 -0
- data/etc/conf.d/fallback/traits.erb +216 -0
- data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
- data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
- data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
- data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
- data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
- data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
- data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
- data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
- data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
- data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
- data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
- data/etc/conf.d/noarch/pinit.erb +11 -0
- data/etc/mesg.d/en_US/messages.yml +784 -0
- data/etc/mesg.d/ja_JP/messages.yml +784 -0
- data/lib/adlint/analyzer.rb +294 -0
- data/lib/adlint/c/branch.rb +251 -0
- data/lib/adlint/c/builtin.rb +92 -0
- data/lib/adlint/c/code.rb +490 -0
- data/lib/adlint/c/const.rb +465 -0
- data/lib/adlint/c/conv.rb +212 -0
- data/lib/adlint/c/ctrlexpr.rb +949 -0
- data/lib/adlint/c/domain.rb +7499 -0
- data/lib/adlint/c/environ.rb +133 -0
- data/lib/adlint/c/expr.rb +1725 -0
- data/lib/adlint/c/format.rb +3209 -0
- data/lib/adlint/c/interp.rb +1740 -0
- data/lib/adlint/c/lexer.rb +241 -0
- data/lib/adlint/c/mediator.rb +313 -0
- data/lib/adlint/c/message.rb +13597 -0
- data/lib/adlint/c/metric.rb +765 -0
- data/lib/adlint/c/object.rb +1018 -0
- data/lib/adlint/c/parser.rb +3800 -0
- data/lib/adlint/c/parser.y +2054 -0
- data/lib/adlint/c/phase.rb +712 -0
- data/lib/adlint/c/resolver.rb +270 -0
- data/lib/adlint/c/scanner.rb +248 -0
- data/lib/adlint/c/scope.rb +74 -0
- data/lib/adlint/c/syntax.rb +4279 -0
- data/lib/adlint/c/type.rb +7506 -0
- data/lib/adlint/c/util.rb +91 -0
- data/lib/adlint/c/value.rb +2310 -0
- data/lib/adlint/c.rb +56 -0
- data/lib/adlint/code.rb +500 -0
- data/lib/adlint/cpp/code.rb +189 -0
- data/lib/adlint/cpp/constexpr.rb +721 -0
- data/lib/adlint/cpp/constexpr.y +389 -0
- data/lib/adlint/cpp/eval.rb +1012 -0
- data/lib/adlint/cpp/lexer.rb +860 -0
- data/lib/adlint/cpp/macro.rb +637 -0
- data/lib/adlint/cpp/message.rb +992 -0
- data/lib/adlint/cpp/phase.rb +176 -0
- data/lib/adlint/cpp/scanner.rb +93 -0
- data/lib/adlint/cpp/source.rb +169 -0
- data/lib/adlint/cpp/subst.rb +300 -0
- data/lib/adlint/cpp/syntax.rb +1412 -0
- data/lib/adlint/cpp/util.rb +97 -0
- data/lib/adlint/cpp.rb +43 -0
- data/lib/adlint/driver.rb +147 -0
- data/lib/adlint/error.rb +179 -0
- data/lib/adlint/lang.rb +97 -0
- data/lib/adlint/ld/message.rb +259 -0
- data/lib/adlint/ld/metric.rb +57 -0
- data/lib/adlint/ld/object.rb +542 -0
- data/lib/adlint/ld/phase.rb +193 -0
- data/lib/adlint/ld/typedef.rb +109 -0
- data/lib/adlint/ld/util.rb +88 -0
- data/lib/adlint/ld.rb +37 -0
- data/lib/adlint/lexer.rb +293 -0
- data/lib/adlint/message.rb +368 -0
- data/lib/adlint/metric.rb +805 -0
- data/lib/adlint/monitor.rb +144 -0
- data/lib/adlint/phase.rb +90 -0
- data/lib/adlint/prelude.rb +314 -0
- data/lib/adlint/report.rb +617 -0
- data/lib/adlint/source.rb +155 -0
- data/lib/adlint/symbol.rb +127 -0
- data/lib/adlint/token.rb +215 -0
- data/lib/adlint/traits.rb +643 -0
- data/lib/adlint/util.rb +524 -0
- data/lib/adlint/version.rb +71 -0
- data/lib/adlint.rb +66 -0
- data/share/HEADER +45 -0
- data/share/demo/Makefile +110 -0
- data/share/demo/ambig_operator/ambig_operator.c +289 -0
- data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
- data/share/demo/array_range/array_range.c +62 -0
- data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
- data/share/demo/bad_brace/bad_brace.c +19 -0
- data/share/demo/bad_charset/abcde$.h +0 -0
- data/share/demo/bad_charset/bad_charset.c +22 -0
- data/share/demo/bad_comment/bad_comment.c +3 -0
- data/share/demo/bad_const/bad_const.c +19 -0
- data/share/demo/bad_conv/bad_conv.c +48 -0
- data/share/demo/bad_indent/bad_indent.c +50 -0
- data/share/demo/bad_init/bad_init.c +49 -0
- data/share/demo/bad_macro/bad_macro.c +97 -0
- data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
- data/share/demo/call_by_value/call_by_value.c +26 -0
- data/share/demo/cross_ref/cross_ref.c +21 -0
- data/share/demo/dangling_else/dangling_else.c +20 -0
- data/share/demo/dead_code/dead_code.c +237 -0
- data/share/demo/deep_nest/deep_nest.c +57 -0
- data/share/demo/dense_switch/dense_switch.c +62 -0
- data/share/demo/direct_recur/direct_recur.c +15 -0
- data/share/demo/div_by_zero/div_by_zero.c +35 -0
- data/share/demo/dos_source/dos_source.c +7 -0
- data/share/demo/funptr_cast/funptr_cast.c +26 -0
- data/share/demo/goto_stmt/goto_stmt.c +19 -0
- data/share/demo/id_hiding/id_hiding.c +19 -0
- data/share/demo/ill_defined/ill_defined.c +13 -0
- data/share/demo/implicit_conv/implicit_conv.c +60 -0
- data/share/demo/implicit_int/implicit_int.c +14 -0
- data/share/demo/incomplete_type/incomplete_type.c +49 -0
- data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
- data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
- data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
- data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
- data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
- data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
- data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
- data/share/demo/intro_demo/intro_demo.c +76 -0
- data/share/demo/intro_demo/intro_demo.h +12 -0
- data/share/demo/intro_demo/useless_header.h +5 -0
- data/share/demo/invalid_call/invalid_call.c +32 -0
- data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
- data/share/demo/line_comment/line_comment.c +12 -0
- data/share/demo/local_decl/local_decl.c +9 -0
- data/share/demo/logical_trick/logical_trick.c +36 -0
- data/share/demo/long_sym/long_sym.c +5 -0
- data/share/demo/loop_var/loop_var.c +92 -0
- data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
- data/share/demo/may_be_null/may_be_null.c +52 -0
- data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
- data/share/demo/may_be_unset/may_be_unset.c +34 -0
- data/share/demo/mmapped_io/mmapped_io.c +23 -0
- data/share/demo/multi_break/multi_break.c +33 -0
- data/share/demo/multi_decl/multi_decl_1.c +17 -0
- data/share/demo/multi_decl/multi_decl_1.h +6 -0
- data/share/demo/multi_decl/multi_decl_2.c +13 -0
- data/share/demo/multi_decl/multi_decl_2.h +6 -0
- data/share/demo/multi_decl/multi_decl_3.c +22 -0
- data/share/demo/multi_def/multi_def_1.c +36 -0
- data/share/demo/multi_def/multi_def_1.h +6 -0
- data/share/demo/multi_def/multi_def_2.c +22 -0
- data/share/demo/multi_def/multi_def_2.h +6 -0
- data/share/demo/multi_def/multi_def_3.c +6 -0
- data/share/demo/multi_typedef/multi_typedef.c +11 -0
- data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
- data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
- data/share/demo/must_be_false/must_be_false.c +53 -0
- data/share/demo/must_be_null/must_be_null.c +13 -0
- data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
- data/share/demo/must_be_true/must_be_true.c +21 -0
- data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
- data/share/demo/no_void_arg/no_void_arg.c +14 -0
- data/share/demo/null_stmt/null_stmt.c +19 -0
- data/share/demo/octal_const/octal_const.c +20 -0
- data/share/demo/output_by_param/output_by_param.c +17 -0
- data/share/demo/overflow/overflow.c +74 -0
- data/share/demo/press_release/press_release.c +40 -0
- data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
- data/share/demo/shift_expr/shift_expr.c +14 -0
- data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
- data/share/demo/static_paths/static_paths.c +153 -0
- data/share/demo/static_vars/static_vars.c +39 -0
- data/share/demo/tag_hiding/tag_hiding.c +18 -0
- data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
- data/share/demo/undefined_macro/undefined_macro.c +17 -0
- data/share/demo/uninit_vars/uninit_vars.c +28 -0
- data/share/demo/union_type/union_type.c +23 -0
- data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
- data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
- data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
- data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
- data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
- data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
- data/share/demo/unreachable/unreachable.c +34 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
- data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
- data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
- data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
- data/share/demo/useless_expr/useless_expr.c +17 -0
- data/share/demo/useless_funs/useless_funs_1.c +21 -0
- data/share/demo/useless_funs/useless_funs_1.h +8 -0
- data/share/demo/useless_funs/useless_funs_2.c +6 -0
- data/share/demo/useless_header/useless_header.c +9 -0
- data/share/demo/useless_header/useless_header_1.h +12 -0
- data/share/demo/useless_header/useless_header_2.h +6 -0
- data/share/demo/useless_header/useless_header_3.h +9 -0
- data/share/demo/useless_header/useless_header_4.h +3 -0
- data/share/demo/useless_vars/useless_vars.c +17 -0
- data/share/demo/va_funcall/va_funcall.c +25 -0
- data/share/demo/various_fundef/various_fundef.c +36 -0
- data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
- data/share/demo/wrap_around/wrap_around.c +38 -0
- data/share/doc/Makefile +16 -0
- data/share/doc/adlint_on_adqua.png +0 -0
- data/share/doc/adlint_on_eclipse_en.png +0 -0
- data/share/doc/adlint_on_eclipse_ja.png +0 -0
- data/share/doc/adlint_on_vim_en.png +0 -0
- data/share/doc/adlint_on_vim_ja.png +0 -0
- data/share/doc/developers_guide_ja.html +171 -0
- data/share/doc/developers_guide_ja.texi +87 -0
- data/share/doc/gen_mesg_sections.rb +39 -0
- data/share/doc/samples/GNUmakefile +162 -0
- data/share/doc/samples/adlint_traits.yml +238 -0
- data/share/doc/texinfo.css +22 -0
- data/share/doc/users_guide_en.html +39975 -0
- data/share/doc/users_guide_en.texi +32640 -0
- data/share/doc/users_guide_ja.html +40505 -0
- data/share/doc/users_guide_ja.texi +33189 -0
- data/share/logo/adlint-110.png +0 -0
- data/share/logo/adlint-524.png +0 -0
- data/share/logo/adlint.svg +4637 -0
- data/share/sample/README +6 -0
- data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
- data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
- data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
- data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
- data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
- data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
- data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
- data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
- data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
- data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
- data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
- data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
- data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
- data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
- data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
- data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
- data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
- data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
- data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
- data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
- data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
- data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
- data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
- data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
- data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
- data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
- data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
- data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
- data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
- metadata +532 -0
|
@@ -0,0 +1,2310 @@
|
|
|
1
|
+
# Values associated with memory blocks.
|
|
2
|
+
#
|
|
3
|
+
# Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
|
|
4
|
+
# Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
|
5
|
+
# License:: GPLv3+: GNU General Public License version 3 or later
|
|
6
|
+
#
|
|
7
|
+
# Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
|
|
8
|
+
|
|
9
|
+
#--
|
|
10
|
+
# ___ ____ __ ___ _________
|
|
11
|
+
# / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
|
|
12
|
+
# / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
|
|
13
|
+
# / __ |/ /_/ / /___/ / /| / / /
|
|
14
|
+
# /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
|
15
|
+
#
|
|
16
|
+
# This file is part of AdLint.
|
|
17
|
+
#
|
|
18
|
+
# AdLint is free software: you can redistribute it and/or modify it under the
|
|
19
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
20
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
21
|
+
# version.
|
|
22
|
+
#
|
|
23
|
+
# AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
24
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
25
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
26
|
+
#
|
|
27
|
+
# You should have received a copy of the GNU General Public License along with
|
|
28
|
+
# AdLint. If not, see <http://www.gnu.org/licenses/>.
|
|
29
|
+
#
|
|
30
|
+
#++
|
|
31
|
+
|
|
32
|
+
require "adlint/c/domain"
|
|
33
|
+
|
|
34
|
+
module AdLint #:nodoc:
|
|
35
|
+
module C #:nodoc:
|
|
36
|
+
|
|
37
|
+
module BuggyValueSampler
|
|
38
|
+
def unique_sample
|
|
39
|
+
# NOTE: A value may have multiple sample values.
|
|
40
|
+
# So, callers of this method have potential bugs!
|
|
41
|
+
to_enum.first
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# == DESCRIPTION
|
|
46
|
+
# === Value class hierarchy
|
|
47
|
+
# Value
|
|
48
|
+
# <--- SingleValue
|
|
49
|
+
# <--- ScalarValue
|
|
50
|
+
# <--- ArrayValue
|
|
51
|
+
# <--- CompositeValue
|
|
52
|
+
# <--- MultipleValue
|
|
53
|
+
# <--- VersionedValue
|
|
54
|
+
# <--- FrozenValue
|
|
55
|
+
class Value
|
|
56
|
+
include BuggyValueSampler
|
|
57
|
+
|
|
58
|
+
def scalar?
|
|
59
|
+
subclass_responsibility
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def array?
|
|
63
|
+
subclass_responsibility
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def composite?
|
|
67
|
+
subclass_responsibility
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def undefined?
|
|
71
|
+
subclass_responsibility
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def ambiguous?
|
|
75
|
+
subclass_responsibility
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def exist?
|
|
79
|
+
subclass_responsibility
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def multiple?
|
|
83
|
+
subclass_responsibility
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def overwrite!(value)
|
|
87
|
+
subclass_responsibility
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
91
|
+
subclass_responsibility
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
95
|
+
subclass_responsibility
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def invert_domain!
|
|
99
|
+
subclass_responsibility
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def single_value_unified_with(rhs_value)
|
|
103
|
+
subclass_responsibility
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def ~
|
|
107
|
+
subclass_responsibility
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def +@
|
|
111
|
+
subclass_responsibility
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def -@
|
|
115
|
+
subclass_responsibility
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def +(rhs_value)
|
|
119
|
+
subclass_responsibility
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def -(rhs_value)
|
|
123
|
+
subclass_responsibility
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def *(rhs_value)
|
|
127
|
+
subclass_responsibility
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def /(rhs_value)
|
|
131
|
+
subclass_responsibility
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def %(rhs_value)
|
|
135
|
+
subclass_responsibility
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def &(rhs_value)
|
|
139
|
+
subclass_responsibility
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def |(rhs_value)
|
|
143
|
+
subclass_responsibility
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def ^(rhs_value)
|
|
147
|
+
subclass_responsibility
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def <<(rhs_value)
|
|
151
|
+
subclass_responsibility
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def >>(rhs_value)
|
|
155
|
+
subclass_responsibility
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def !
|
|
159
|
+
subclass_responsibility
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def <(rhs_value)
|
|
163
|
+
subclass_responsibility
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def >(rhs_value)
|
|
167
|
+
subclass_responsibility
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def ==(rhs_value)
|
|
171
|
+
subclass_responsibility
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def !=(rhs_value)
|
|
175
|
+
subclass_responsibility
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def <=(rhs_value)
|
|
179
|
+
subclass_responsibility
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def >=(rhs_value)
|
|
183
|
+
subclass_responsibility
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def logical_and(rhs_value)
|
|
187
|
+
# NOTE: Operator && cannot be defined as a method in Ruby.
|
|
188
|
+
subclass_responsibility
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def logical_or(rhs_value)
|
|
192
|
+
# NOTE: Operator || cannot be defined as a method in Ruby.
|
|
193
|
+
subclass_responsibility
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def must_be_equal_to?(value)
|
|
197
|
+
subclass_responsibility
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def may_be_equal_to?(value)
|
|
201
|
+
subclass_responsibility
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def must_not_be_equal_to?(value)
|
|
205
|
+
subclass_responsibility
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def may_not_be_equal_to?(value)
|
|
209
|
+
subclass_responsibility
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def must_be_less_than?(value)
|
|
213
|
+
subclass_responsibility
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def may_be_less_than?(value)
|
|
217
|
+
subclass_responsibility
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def must_be_greater_than?(value)
|
|
221
|
+
subclass_responsibility
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def may_be_greater_than?(value)
|
|
225
|
+
subclass_responsibility
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def must_be_undefined?
|
|
229
|
+
subclass_responsibility
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def may_be_undefined?
|
|
233
|
+
subclass_responsibility
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def must_be_true?
|
|
237
|
+
subclass_responsibility
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def may_be_true?
|
|
241
|
+
subclass_responsibility
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def must_be_false?
|
|
245
|
+
subclass_responsibility
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def may_be_false?
|
|
249
|
+
subclass_responsibility
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def coerce_to(type)
|
|
253
|
+
subclass_responsibility
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def to_enum
|
|
257
|
+
subclass_responsibility
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def to_single_value
|
|
261
|
+
subclass_responsibility
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def to_defined_value
|
|
265
|
+
subclass_responsibility
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def eql?(rhs_value)
|
|
269
|
+
subclass_responsibility
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def hash
|
|
273
|
+
subclass_responsibility
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def dup
|
|
277
|
+
subclass_responsibility
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
class SingleValue < Value
|
|
282
|
+
def multiple?
|
|
283
|
+
false
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def must_be_undefined?
|
|
287
|
+
self.undefined?
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def may_be_undefined?
|
|
291
|
+
# NOTE: SingleValue has exactly one value domain.
|
|
292
|
+
# So, the value of SingleValue may be undefined when the value
|
|
293
|
+
# must be undefined.
|
|
294
|
+
self.must_be_undefined?
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def to_single_value
|
|
298
|
+
self
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
class ScalarValue < SingleValue
|
|
303
|
+
def self.of(numeric_or_range)
|
|
304
|
+
case numeric_or_range
|
|
305
|
+
when Numeric
|
|
306
|
+
new(ValueDomain.equal_to(numeric_or_range))
|
|
307
|
+
when Range
|
|
308
|
+
lower = ValueDomain.greater_than_or_equal_to(numeric_or_range.first)
|
|
309
|
+
higher = ValueDomain.less_than_or_equal_to(numeric_or_range.last)
|
|
310
|
+
new(lower.intersection(higher))
|
|
311
|
+
else
|
|
312
|
+
raise TypeError, "argument must be a Numeric or a Range."
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def self.not_of(numeric_or_range)
|
|
317
|
+
case numeric_or_range
|
|
318
|
+
when Numeric
|
|
319
|
+
new(ValueDomain.not_equal_to(numeric_or_range))
|
|
320
|
+
when Range
|
|
321
|
+
lower = ValueDomain.less_than(numeric_or_range.first)
|
|
322
|
+
higher = ValueDomain.greater_than(numeric_or_range.last)
|
|
323
|
+
new(lower.union(higher))
|
|
324
|
+
else
|
|
325
|
+
raise TypeError, "argument must be a Numeric or a Range."
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def self.of_true
|
|
330
|
+
not_of(0)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def self.of_false
|
|
334
|
+
of(0)
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def self.of_arbitrary
|
|
338
|
+
new(ValueDomain.of_unlimited)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def self.of_undefined(range)
|
|
342
|
+
new(ValueDomain.of_undefined(range))
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def self.of_nil
|
|
346
|
+
new(ValueDomain.of_nil)
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def self.of_nan
|
|
350
|
+
new(ValueDomain.of_nan)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def initialize(domain)
|
|
354
|
+
@domain = domain
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
def scalar?
|
|
358
|
+
true
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
def array?
|
|
362
|
+
false
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def composite?
|
|
366
|
+
false
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def exist?
|
|
370
|
+
!@domain.empty?
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def undefined?
|
|
374
|
+
@domain.undefined?
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def ambiguous?
|
|
378
|
+
@domain.ambiguous?
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def overwrite!(value)
|
|
382
|
+
case single_value = value.to_single_value
|
|
383
|
+
when ScalarValue
|
|
384
|
+
@domain = single_value.domain
|
|
385
|
+
else
|
|
386
|
+
raise TypeError, "cannot overwrite scalar with non-scalar."
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
391
|
+
case operand_single_value = operand_value.to_single_value
|
|
392
|
+
when ScalarValue
|
|
393
|
+
orig_domain = @domain
|
|
394
|
+
@domain = @domain.narrow(operator_symbol, operand_single_value.domain)
|
|
395
|
+
!@domain.equal?(orig_domain)
|
|
396
|
+
else
|
|
397
|
+
raise TypeError, "cannot narrow scalar value domain with non-scalar."
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
402
|
+
case operand_single_value = operand_value.to_single_value
|
|
403
|
+
when ScalarValue
|
|
404
|
+
orig_domain = @domain
|
|
405
|
+
@domain = @domain.widen(operator_symbol, operand_single_value.domain)
|
|
406
|
+
!@domain.equal?(orig_domain)
|
|
407
|
+
else
|
|
408
|
+
raise TypeError, "cannot widen scalar value domain with non-scalar."
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def invert_domain!
|
|
413
|
+
@domain = @domain.inversion
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
def single_value_unified_with(rhs_value)
|
|
417
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
418
|
+
when ScalarValue
|
|
419
|
+
ScalarValue.new(@domain.union(rhs_single_value.domain))
|
|
420
|
+
else
|
|
421
|
+
raise TypeError, "cannot unify scalar value with non-scalar."
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
def ~
|
|
426
|
+
ScalarValue.new(~@domain)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
def +@
|
|
430
|
+
ScalarValue.new(+@domain)
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
def -@
|
|
434
|
+
ScalarValue.new(-@domain)
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
def +(rhs_value)
|
|
438
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
439
|
+
when ScalarValue
|
|
440
|
+
ScalarValue.new(@domain + rhs_single_value.domain)
|
|
441
|
+
else
|
|
442
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
def -(rhs_value)
|
|
447
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
448
|
+
when ScalarValue
|
|
449
|
+
ScalarValue.new(@domain - rhs_single_value.domain)
|
|
450
|
+
else
|
|
451
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
def *(rhs_value)
|
|
456
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
457
|
+
when ScalarValue
|
|
458
|
+
ScalarValue.new(@domain * rhs_single_value.domain)
|
|
459
|
+
else
|
|
460
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
def /(rhs_value)
|
|
465
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
466
|
+
when ScalarValue
|
|
467
|
+
ScalarValue.new(@domain / rhs_single_value.domain)
|
|
468
|
+
else
|
|
469
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
470
|
+
end
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
def %(rhs_value)
|
|
474
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
475
|
+
when ScalarValue
|
|
476
|
+
ScalarValue.new(@domain % rhs_single_value.domain)
|
|
477
|
+
else
|
|
478
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def &(rhs_value)
|
|
483
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
484
|
+
when ScalarValue
|
|
485
|
+
ScalarValue.new(@domain & rhs_single_value.domain)
|
|
486
|
+
else
|
|
487
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
def |(rhs_value)
|
|
492
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
493
|
+
when ScalarValue
|
|
494
|
+
ScalarValue.new(@domain | rhs_single_value.domain)
|
|
495
|
+
else
|
|
496
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
def ^(rhs_value)
|
|
501
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
502
|
+
when ScalarValue
|
|
503
|
+
ScalarValue.new(@domain ^ rhs_single_value.domain)
|
|
504
|
+
else
|
|
505
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
506
|
+
end
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
def <<(rhs_value)
|
|
510
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
511
|
+
when ScalarValue
|
|
512
|
+
ScalarValue.new(@domain << rhs_single_value.domain)
|
|
513
|
+
else
|
|
514
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
515
|
+
end
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
def >>(rhs_value)
|
|
519
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
520
|
+
when ScalarValue
|
|
521
|
+
ScalarValue.new(@domain >> rhs_single_value.domain)
|
|
522
|
+
else
|
|
523
|
+
raise TypeError, "binary operation between scalar and non-scalar."
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
def !
|
|
528
|
+
ScalarValue.new(!@domain)
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
def <(rhs_value)
|
|
532
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
533
|
+
when ScalarValue
|
|
534
|
+
ScalarValue.new(@domain < rhs_single_value.domain)
|
|
535
|
+
else
|
|
536
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
537
|
+
end
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
def >(rhs_value)
|
|
541
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
542
|
+
when ScalarValue
|
|
543
|
+
ScalarValue.new(@domain > rhs_single_value.domain)
|
|
544
|
+
else
|
|
545
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
546
|
+
end
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
def ==(rhs_value)
|
|
550
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
551
|
+
when ScalarValue
|
|
552
|
+
ScalarValue.new(@domain == rhs_single_value.domain)
|
|
553
|
+
else
|
|
554
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
555
|
+
end
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
def !=(rhs_value)
|
|
559
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
560
|
+
when ScalarValue
|
|
561
|
+
ScalarValue.new(@domain != rhs_single_value.domain)
|
|
562
|
+
else
|
|
563
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
564
|
+
end
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
def <=(rhs_value)
|
|
568
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
569
|
+
when ScalarValue
|
|
570
|
+
ScalarValue.new(@domain <= rhs_single_value.domain)
|
|
571
|
+
else
|
|
572
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def >=(rhs_value)
|
|
577
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
578
|
+
when ScalarValue
|
|
579
|
+
ScalarValue.new(@domain >= rhs_single_value.domain)
|
|
580
|
+
else
|
|
581
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
582
|
+
end
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
def logical_and(rhs_value)
|
|
586
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
587
|
+
when ScalarValue
|
|
588
|
+
ScalarValue.new(@domain.logical_and(rhs_single_value.domain))
|
|
589
|
+
else
|
|
590
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
def logical_or(rhs_value)
|
|
595
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
596
|
+
when ScalarValue
|
|
597
|
+
ScalarValue.new(@domain.logical_or(rhs_single_value.domain))
|
|
598
|
+
else
|
|
599
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
def must_be_equal_to?(value)
|
|
604
|
+
case single_value = value.to_single_value.dup
|
|
605
|
+
when ScalarValue
|
|
606
|
+
comp_result = (self == single_value)
|
|
607
|
+
single_value.invert_domain!
|
|
608
|
+
single_value.narrow_domain!(:==, self)
|
|
609
|
+
comp_result.domain.intersect?(ScalarValue.of_true.domain) &&
|
|
610
|
+
!comp_result.domain.contain?(ScalarValue.of_false.domain) &&
|
|
611
|
+
!@domain.intersect?(single_value.domain)
|
|
612
|
+
else
|
|
613
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
614
|
+
end
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
def may_be_equal_to?(value)
|
|
618
|
+
case single_value = value.to_single_value
|
|
619
|
+
when ScalarValue
|
|
620
|
+
(self == single_value).domain.intersect?(ScalarValue.of_true.domain)
|
|
621
|
+
else
|
|
622
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
623
|
+
end
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
def must_not_be_equal_to?(value)
|
|
627
|
+
case single_value = value.to_single_value
|
|
628
|
+
when ScalarValue
|
|
629
|
+
comp_result = (self != single_value)
|
|
630
|
+
comp_result.domain.intersect?(ScalarValue.of_true.domain) &&
|
|
631
|
+
!comp_result.domain.contain?(ScalarValue.of_false.domain) &&
|
|
632
|
+
!@domain.intersect?(single_value.domain)
|
|
633
|
+
else
|
|
634
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
def may_not_be_equal_to?(value)
|
|
639
|
+
case single_value = value.to_single_value
|
|
640
|
+
when ScalarValue
|
|
641
|
+
(self != single_value).domain.intersect?(ScalarValue.of_true.domain)
|
|
642
|
+
else
|
|
643
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
def must_be_less_than?(value)
|
|
648
|
+
case single_value = value.to_single_value
|
|
649
|
+
when ScalarValue
|
|
650
|
+
comp_result = (self < single_value)
|
|
651
|
+
comp_result.domain.intersect?(ScalarValue.of_true.domain) &&
|
|
652
|
+
!comp_result.domain.contain?(ScalarValue.of_false.domain)
|
|
653
|
+
else
|
|
654
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
def may_be_less_than?(value)
|
|
659
|
+
case single_value = value.to_single_value
|
|
660
|
+
when ScalarValue
|
|
661
|
+
(self < single_value).domain.intersect?(ScalarValue.of_true.domain)
|
|
662
|
+
else
|
|
663
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def must_be_greater_than?(value)
|
|
668
|
+
case single_value = value.to_single_value
|
|
669
|
+
when ScalarValue
|
|
670
|
+
comp_result = (self > single_value)
|
|
671
|
+
comp_result.domain.intersect?(ScalarValue.of_true.domain) &&
|
|
672
|
+
!comp_result.domain.contain?(ScalarValue.of_false.domain)
|
|
673
|
+
else
|
|
674
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
def may_be_greater_than?(value)
|
|
679
|
+
case single_value = value.to_single_value
|
|
680
|
+
when ScalarValue
|
|
681
|
+
(self > single_value).domain.intersect?(ScalarValue.of_true.domain)
|
|
682
|
+
else
|
|
683
|
+
raise TypeError, "comparison between scalar and non-scalar."
|
|
684
|
+
end
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
def must_be_true?
|
|
688
|
+
self.may_be_equal_to?(ScalarValue.of_true) &&
|
|
689
|
+
self.must_not_be_equal_to?(ScalarValue.of_false)
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
def may_be_true?
|
|
693
|
+
self.may_be_equal_to?(ScalarValue.of_true)
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
def must_be_false?
|
|
697
|
+
self.must_be_equal_to?(ScalarValue.of_false)
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
def may_be_false?
|
|
701
|
+
self.may_be_equal_to?(ScalarValue.of_false)
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
def coerce_to(type)
|
|
705
|
+
type.coerce_scalar_value(self)
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
def to_enum
|
|
709
|
+
@domain.each_sample
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
def to_defined_value
|
|
713
|
+
ScalarValue.new(@domain.to_defined_domain)
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
def eql?(rhs_value)
|
|
717
|
+
rhs_value.kind_of?(ScalarValue) && @domain.eql?(rhs_value.domain)
|
|
718
|
+
end
|
|
719
|
+
|
|
720
|
+
def hash
|
|
721
|
+
@domain.hash
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
def dup
|
|
725
|
+
ScalarValue.new(@domain)
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
protected
|
|
729
|
+
attr_reader :domain
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
class ArrayValue < SingleValue
|
|
733
|
+
def initialize(values)
|
|
734
|
+
@values = values
|
|
735
|
+
end
|
|
736
|
+
|
|
737
|
+
attr_reader :values
|
|
738
|
+
|
|
739
|
+
def scalar?
|
|
740
|
+
false
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
def array?
|
|
744
|
+
true
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
def composite?
|
|
748
|
+
false
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
def exist?
|
|
752
|
+
@values.all? { |value| value.exist? }
|
|
753
|
+
end
|
|
754
|
+
|
|
755
|
+
def undefined?
|
|
756
|
+
@values.all? { |value| value.undefined? }
|
|
757
|
+
end
|
|
758
|
+
|
|
759
|
+
def ambiguous?
|
|
760
|
+
@values.all? { |value| value.ambiguous? }
|
|
761
|
+
end
|
|
762
|
+
|
|
763
|
+
def overwrite!(value)
|
|
764
|
+
case single_value = value.to_single_value
|
|
765
|
+
when ArrayValue
|
|
766
|
+
@values.zip(single_value.values).each do |lhs, rhs|
|
|
767
|
+
rhs && lhs.overwrite!(rhs)
|
|
768
|
+
end
|
|
769
|
+
else
|
|
770
|
+
raise TypeError, "cannot overwrite array with non-array."
|
|
771
|
+
end
|
|
772
|
+
end
|
|
773
|
+
|
|
774
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
775
|
+
case operand_single_value = operand_value.to_single_value
|
|
776
|
+
when ArrayValue
|
|
777
|
+
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
|
778
|
+
if rhs
|
|
779
|
+
lhs.narrow_domain!(operator_symbol, rhs)
|
|
780
|
+
else
|
|
781
|
+
next
|
|
782
|
+
end
|
|
783
|
+
}.any?
|
|
784
|
+
else
|
|
785
|
+
raise TypeError, "cannot narrow array value domain with non-array."
|
|
786
|
+
end
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
790
|
+
case operand_single_value = operand_value.to_single_value
|
|
791
|
+
when ArrayValue
|
|
792
|
+
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
|
793
|
+
if rhs
|
|
794
|
+
lhs.widen_domain!(operator_symbol, rhs)
|
|
795
|
+
else
|
|
796
|
+
next
|
|
797
|
+
end
|
|
798
|
+
}.any?
|
|
799
|
+
else
|
|
800
|
+
raise TypeError, "cannot widen array value domain with non-array."
|
|
801
|
+
end
|
|
802
|
+
end
|
|
803
|
+
|
|
804
|
+
def invert_domain!
|
|
805
|
+
@values.each { |value| value.invert_domain! }
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
def single_value_unified_with(rhs_value)
|
|
809
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
810
|
+
when ArrayValue
|
|
811
|
+
ArrayValue.new(@values.zip(rhs_single_value.values).map { |lhs, rhs|
|
|
812
|
+
lhs.single_value_unified_with(rhs)
|
|
813
|
+
})
|
|
814
|
+
else
|
|
815
|
+
raise TypeError, "cannot unify array value with non-array."
|
|
816
|
+
end
|
|
817
|
+
end
|
|
818
|
+
|
|
819
|
+
def ~
|
|
820
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
821
|
+
# of an array variable should be evaluated into a pointer to the
|
|
822
|
+
# array body.
|
|
823
|
+
dup # NOTREACHED
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
def +@
|
|
827
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
828
|
+
# of an array variable should be evaluated into a pointer to the
|
|
829
|
+
# array body.
|
|
830
|
+
dup # NOTREACHED
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
def -@
|
|
834
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
835
|
+
# of an array variable should be evaluated into a pointer to the
|
|
836
|
+
# array body.
|
|
837
|
+
dup # NOTREACHED
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
def +(rhs_value)
|
|
841
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
842
|
+
# of an array variable should be evaluated into a pointer to the
|
|
843
|
+
# array body.
|
|
844
|
+
dup # NOTREACHED
|
|
845
|
+
end
|
|
846
|
+
|
|
847
|
+
def -(rhs_value)
|
|
848
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
849
|
+
# of an array variable should be evaluated into a pointer to the
|
|
850
|
+
# array body.
|
|
851
|
+
dup # NOTREACHED
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
def *(rhs_value)
|
|
855
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
856
|
+
# of an array variable should be evaluated into a pointer to the
|
|
857
|
+
# array body.
|
|
858
|
+
dup # NOTREACHED
|
|
859
|
+
end
|
|
860
|
+
|
|
861
|
+
def /(rhs_value)
|
|
862
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
863
|
+
# of an array variable should be evaluated into a pointer to the
|
|
864
|
+
# array body.
|
|
865
|
+
dup # NOTREACHED
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
def %(rhs_value)
|
|
869
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
870
|
+
# of an array variable should be evaluated into a pointer to the
|
|
871
|
+
# array body.
|
|
872
|
+
dup # NOTREACHED
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
def &(rhs_value)
|
|
876
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
877
|
+
# of an array variable should be evaluated into a pointer to the
|
|
878
|
+
# array body.
|
|
879
|
+
dup # NOTREACHED
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
def |(rhs_value)
|
|
883
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
884
|
+
# of an array variable should be evaluated into a pointer to the
|
|
885
|
+
# array body.
|
|
886
|
+
dup # NOTREACHED
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
def ^(rhs_value)
|
|
890
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
891
|
+
# of an array variable should be evaluated into a pointer to the
|
|
892
|
+
# array body.
|
|
893
|
+
dup # NOTREACHED
|
|
894
|
+
end
|
|
895
|
+
|
|
896
|
+
def <<(rhs_value)
|
|
897
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
898
|
+
# of an array variable should be evaluated into a pointer to the
|
|
899
|
+
# array body.
|
|
900
|
+
dup # NOTREACHED
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
def >>(rhs_value)
|
|
904
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
905
|
+
# of an array variable should be evaluated into a pointer to the
|
|
906
|
+
# array body.
|
|
907
|
+
dup # NOTREACHED
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
def !
|
|
911
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
912
|
+
# of an array variable should be evaluated into a pointer to the
|
|
913
|
+
# array body.
|
|
914
|
+
ScalarValue.of_false # NOTREACHED
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
def <(rhs_value)
|
|
918
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
919
|
+
# of an array variable should be evaluated into a pointer to the
|
|
920
|
+
# array body.
|
|
921
|
+
# So, this comparison operator should not be reached.
|
|
922
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
923
|
+
when ArrayValue
|
|
924
|
+
if @values.size == rhs_single_value.values.size
|
|
925
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
926
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
927
|
+
result.single_value_unified_with(lhs < rhs)
|
|
928
|
+
end
|
|
929
|
+
else
|
|
930
|
+
ScalarValue.of_false
|
|
931
|
+
end
|
|
932
|
+
else
|
|
933
|
+
raise TypeError, "comparison between array and non-array."
|
|
934
|
+
end
|
|
935
|
+
end
|
|
936
|
+
|
|
937
|
+
def >(rhs_value)
|
|
938
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
939
|
+
# of an array variable should be evaluated into a pointer to the
|
|
940
|
+
# array body.
|
|
941
|
+
# So, this comparison operator should not be reached.
|
|
942
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
943
|
+
when ArrayValue
|
|
944
|
+
if @values.size == rhs_single_value.values.size
|
|
945
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
946
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
947
|
+
result.single_value_unified_with(lhs > rhs)
|
|
948
|
+
end
|
|
949
|
+
else
|
|
950
|
+
ScalarValue.of_false
|
|
951
|
+
end
|
|
952
|
+
else
|
|
953
|
+
raise TypeError, "comparison between array and non-array."
|
|
954
|
+
end
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
def ==(rhs_value)
|
|
958
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
959
|
+
# of an array variable should be evaluated into a pointer to the
|
|
960
|
+
# array body.
|
|
961
|
+
# So, this comparison operator should not be reached.
|
|
962
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
963
|
+
when ArrayValue
|
|
964
|
+
if @values.size == rhs_single_value.values.size
|
|
965
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
966
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
967
|
+
result.single_value_unified_with(lhs == rhs)
|
|
968
|
+
end
|
|
969
|
+
else
|
|
970
|
+
ScalarValue.of_false
|
|
971
|
+
end
|
|
972
|
+
else
|
|
973
|
+
raise TypeError, "comparison between array and non-array."
|
|
974
|
+
end
|
|
975
|
+
end
|
|
976
|
+
|
|
977
|
+
def !=(rhs_value)
|
|
978
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
979
|
+
# of an array variable should be evaluated into a pointer to the
|
|
980
|
+
# array body.
|
|
981
|
+
# So, this comparison operator should not be reached.
|
|
982
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
983
|
+
when ArrayValue
|
|
984
|
+
if @values.size == rhs_single_value.values.size
|
|
985
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
986
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
987
|
+
result.single_value_unified_with(lhs != rhs)
|
|
988
|
+
end
|
|
989
|
+
else
|
|
990
|
+
ScalarValue.of_false
|
|
991
|
+
end
|
|
992
|
+
else
|
|
993
|
+
raise TypeError, "comparison between array and non-array."
|
|
994
|
+
end
|
|
995
|
+
end
|
|
996
|
+
|
|
997
|
+
def <=(rhs_value)
|
|
998
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
999
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1000
|
+
# array body.
|
|
1001
|
+
# So, this comparison operator should not be reached.
|
|
1002
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1003
|
+
when ArrayValue
|
|
1004
|
+
if @values.size == rhs_single_value.values.size
|
|
1005
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1006
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1007
|
+
result.single_value_unified_with(lhs <= rhs)
|
|
1008
|
+
end
|
|
1009
|
+
else
|
|
1010
|
+
ScalarValue.of_false
|
|
1011
|
+
end
|
|
1012
|
+
else
|
|
1013
|
+
raise TypeError, "comparison between array and non-array."
|
|
1014
|
+
end
|
|
1015
|
+
end
|
|
1016
|
+
|
|
1017
|
+
def >=(rhs_value)
|
|
1018
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1019
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1020
|
+
# array body.
|
|
1021
|
+
# So, this comparison operator should not be reached.
|
|
1022
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1023
|
+
when ArrayValue
|
|
1024
|
+
if @values.size == rhs_single_value.values.size
|
|
1025
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1026
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1027
|
+
result.single_value_unified_with(lhs >= rhs)
|
|
1028
|
+
end
|
|
1029
|
+
else
|
|
1030
|
+
ScalarValue.of_false
|
|
1031
|
+
end
|
|
1032
|
+
else
|
|
1033
|
+
raise TypeError, "comparison between array and non-array."
|
|
1034
|
+
end
|
|
1035
|
+
end
|
|
1036
|
+
|
|
1037
|
+
def logical_and(rhs_value)
|
|
1038
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1039
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1040
|
+
# array body.
|
|
1041
|
+
# So, this comparison operator should not be reached.
|
|
1042
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1043
|
+
when ArrayValue
|
|
1044
|
+
if @values.size == rhs_single_value.values.size
|
|
1045
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1046
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1047
|
+
result.single_value_unified_with(lhs.logical_and(rhs))
|
|
1048
|
+
end
|
|
1049
|
+
else
|
|
1050
|
+
ScalarValue.of_false
|
|
1051
|
+
end
|
|
1052
|
+
else
|
|
1053
|
+
raise TypeError, "comparison between array and non-array."
|
|
1054
|
+
end
|
|
1055
|
+
end
|
|
1056
|
+
|
|
1057
|
+
def logical_or(rhs_value)
|
|
1058
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1059
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1060
|
+
# array body.
|
|
1061
|
+
# So, this comparison operator should not be reached.
|
|
1062
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1063
|
+
when ArrayValue
|
|
1064
|
+
if @values.size == rhs_single_value.values.size
|
|
1065
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1066
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1067
|
+
result.single_value_unified_with(lhs.logical_or(rhs))
|
|
1068
|
+
end
|
|
1069
|
+
else
|
|
1070
|
+
ScalarValue.of_false
|
|
1071
|
+
end
|
|
1072
|
+
else
|
|
1073
|
+
raise TypeError, "comparison between array and non-array."
|
|
1074
|
+
end
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
def must_be_equal_to?(value)
|
|
1078
|
+
case single_value = value.to_single_value
|
|
1079
|
+
when ArrayValue
|
|
1080
|
+
(self == single_value).must_be_true?
|
|
1081
|
+
else
|
|
1082
|
+
raise TypeError, "comparison between array and non-array."
|
|
1083
|
+
end
|
|
1084
|
+
end
|
|
1085
|
+
|
|
1086
|
+
def may_be_equal_to?(value)
|
|
1087
|
+
case single_value = value.to_single_value
|
|
1088
|
+
when ArrayValue
|
|
1089
|
+
(self == single_value).may_be_true?
|
|
1090
|
+
else
|
|
1091
|
+
raise TypeError, "comparison between array and non-array."
|
|
1092
|
+
end
|
|
1093
|
+
end
|
|
1094
|
+
|
|
1095
|
+
def must_not_be_equal_to?(value)
|
|
1096
|
+
case single_value = value.to_single_value
|
|
1097
|
+
when ArrayValue
|
|
1098
|
+
(self != single_value).must_be_true?
|
|
1099
|
+
else
|
|
1100
|
+
raise TypeError, "comparison between array and non-array."
|
|
1101
|
+
end
|
|
1102
|
+
end
|
|
1103
|
+
|
|
1104
|
+
def may_not_be_equal_to?(value)
|
|
1105
|
+
case single_value = value.to_single_value
|
|
1106
|
+
when ArrayValue
|
|
1107
|
+
(self != single_value).may_be_true?
|
|
1108
|
+
else
|
|
1109
|
+
raise TypeError, "comparison between array and non-array."
|
|
1110
|
+
end
|
|
1111
|
+
end
|
|
1112
|
+
|
|
1113
|
+
def must_be_less_than?(value)
|
|
1114
|
+
case single_value = value.to_single_value
|
|
1115
|
+
when ArrayValue
|
|
1116
|
+
(self < single_value).must_be_true?
|
|
1117
|
+
else
|
|
1118
|
+
raise TypeError, "comparison between array and non-array."
|
|
1119
|
+
end
|
|
1120
|
+
end
|
|
1121
|
+
|
|
1122
|
+
def may_be_less_than?(value)
|
|
1123
|
+
case single_value = value.to_single_value
|
|
1124
|
+
when ArrayValue
|
|
1125
|
+
(self < single_value).may_be_true?
|
|
1126
|
+
else
|
|
1127
|
+
raise TypeError, "comparison between array and non-array."
|
|
1128
|
+
end
|
|
1129
|
+
end
|
|
1130
|
+
|
|
1131
|
+
def must_be_greater_than?(value)
|
|
1132
|
+
case single_value = value.to_single_value
|
|
1133
|
+
when ArrayValue
|
|
1134
|
+
(self > single_value).must_be_true?
|
|
1135
|
+
else
|
|
1136
|
+
raise TypeError, "comparison between array and non-array."
|
|
1137
|
+
end
|
|
1138
|
+
end
|
|
1139
|
+
|
|
1140
|
+
def may_be_greater_than?(value)
|
|
1141
|
+
case single_value = value.to_single_value
|
|
1142
|
+
when ArrayValue
|
|
1143
|
+
(self > single_value).may_be_true?
|
|
1144
|
+
else
|
|
1145
|
+
raise TypeError, "comparison between array and non-array."
|
|
1146
|
+
end
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
def must_be_true?
|
|
1150
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1151
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1152
|
+
# array body.
|
|
1153
|
+
# So, this method should not be reached.
|
|
1154
|
+
@values.all? { |value| value.must_be_true? }
|
|
1155
|
+
end
|
|
1156
|
+
|
|
1157
|
+
def may_be_true?
|
|
1158
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1159
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1160
|
+
# array body.
|
|
1161
|
+
# So, this method should not be reached.
|
|
1162
|
+
@values.all? { |value| value.may_be_true? }
|
|
1163
|
+
end
|
|
1164
|
+
|
|
1165
|
+
def must_be_false?
|
|
1166
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1167
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1168
|
+
# array body.
|
|
1169
|
+
# So, this method should not be reached.
|
|
1170
|
+
@values.all? { |value| value.must_be_false? }
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
def may_be_false?
|
|
1174
|
+
# NOTE: When an array variable appears in expressions, object-specifier
|
|
1175
|
+
# of an array variable should be evaluated into a pointer to the
|
|
1176
|
+
# array body.
|
|
1177
|
+
# So, this method should not be reached.
|
|
1178
|
+
@values.all? { |value| value.may_be_false? }
|
|
1179
|
+
end
|
|
1180
|
+
|
|
1181
|
+
def coerce_to(type)
|
|
1182
|
+
type.coerce_array_value(self)
|
|
1183
|
+
end
|
|
1184
|
+
|
|
1185
|
+
def to_enum
|
|
1186
|
+
# FIXME: This method generates only one of sample values.
|
|
1187
|
+
@values.map { |value| value.to_enum.first }
|
|
1188
|
+
end
|
|
1189
|
+
|
|
1190
|
+
def to_defined_value
|
|
1191
|
+
ArrayValue.new(@values.map { |value| value.to_defined_value })
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
def eql?(rhs_value)
|
|
1195
|
+
rhs_value.kind_of?(ArrayValue) && @values.eql?(rhs_value.values)
|
|
1196
|
+
end
|
|
1197
|
+
|
|
1198
|
+
def hash
|
|
1199
|
+
@values.hash
|
|
1200
|
+
end
|
|
1201
|
+
|
|
1202
|
+
def dup
|
|
1203
|
+
ArrayValue.new(@values.map { |value| value.dup })
|
|
1204
|
+
end
|
|
1205
|
+
end
|
|
1206
|
+
|
|
1207
|
+
class CompositeValue < SingleValue
|
|
1208
|
+
def initialize(values)
|
|
1209
|
+
@values = values
|
|
1210
|
+
end
|
|
1211
|
+
|
|
1212
|
+
attr_reader :values
|
|
1213
|
+
|
|
1214
|
+
def scalar?
|
|
1215
|
+
false
|
|
1216
|
+
end
|
|
1217
|
+
|
|
1218
|
+
def array?
|
|
1219
|
+
false
|
|
1220
|
+
end
|
|
1221
|
+
|
|
1222
|
+
def composite?
|
|
1223
|
+
true
|
|
1224
|
+
end
|
|
1225
|
+
|
|
1226
|
+
def exist?
|
|
1227
|
+
@values.all? { |value| value.exist? }
|
|
1228
|
+
end
|
|
1229
|
+
|
|
1230
|
+
def undefined?
|
|
1231
|
+
@values.all? { |value| value.undefined? }
|
|
1232
|
+
end
|
|
1233
|
+
|
|
1234
|
+
def ambiguous?
|
|
1235
|
+
@values.all? { |value| value.ambiguous? }
|
|
1236
|
+
end
|
|
1237
|
+
|
|
1238
|
+
def overwrite!(value)
|
|
1239
|
+
case single_value = value.to_single_value
|
|
1240
|
+
when CompositeValue
|
|
1241
|
+
@values.zip(single_value.values).each do |lhs, rhs|
|
|
1242
|
+
rhs && lhs.overwrite!(rhs)
|
|
1243
|
+
end
|
|
1244
|
+
else
|
|
1245
|
+
raise TypeError, "cannot overwrite composite with non-composite."
|
|
1246
|
+
end
|
|
1247
|
+
end
|
|
1248
|
+
|
|
1249
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
1250
|
+
case operand_single_value = operand_value.to_single_value
|
|
1251
|
+
when CompositeValue
|
|
1252
|
+
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
|
1253
|
+
if rhs
|
|
1254
|
+
lhs.narrow_domain!(operator_symbol, rhs)
|
|
1255
|
+
else
|
|
1256
|
+
next
|
|
1257
|
+
end
|
|
1258
|
+
}.any?
|
|
1259
|
+
else
|
|
1260
|
+
raise TypeError,
|
|
1261
|
+
"cannot narrow composite value domain with non-composite."
|
|
1262
|
+
end
|
|
1263
|
+
end
|
|
1264
|
+
|
|
1265
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
1266
|
+
case operand_single_value = operand_value.to_single_value
|
|
1267
|
+
when CompositeValue
|
|
1268
|
+
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
|
1269
|
+
if rhs
|
|
1270
|
+
lhs.widen_domain!(operator_symbol, rhs)
|
|
1271
|
+
else
|
|
1272
|
+
next
|
|
1273
|
+
end
|
|
1274
|
+
}.any?
|
|
1275
|
+
else
|
|
1276
|
+
raise TypeError,
|
|
1277
|
+
"cannot widen composite value domain with non-composite."
|
|
1278
|
+
end
|
|
1279
|
+
end
|
|
1280
|
+
|
|
1281
|
+
def invert_domain!
|
|
1282
|
+
@values.each { |value| value.invert_domain! }
|
|
1283
|
+
end
|
|
1284
|
+
|
|
1285
|
+
def single_value_unified_with(rhs_value)
|
|
1286
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1287
|
+
when CompositeValue
|
|
1288
|
+
CompositeValue.new(
|
|
1289
|
+
@values.zip(rhs_single_value.values).map { |lhs, rhs|
|
|
1290
|
+
lhs.single_value_unified_with(rhs)
|
|
1291
|
+
})
|
|
1292
|
+
else
|
|
1293
|
+
raise TypeError, "cannot unify composite value with non-composite."
|
|
1294
|
+
end
|
|
1295
|
+
end
|
|
1296
|
+
|
|
1297
|
+
def ~
|
|
1298
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1299
|
+
# primary-expression(object-specifier followed by `.').
|
|
1300
|
+
dup # NOTREACHED
|
|
1301
|
+
end
|
|
1302
|
+
|
|
1303
|
+
def +@
|
|
1304
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1305
|
+
# primary-expression(object-specifier followed by `.').
|
|
1306
|
+
dup # NOTREACHED
|
|
1307
|
+
end
|
|
1308
|
+
|
|
1309
|
+
def -@
|
|
1310
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1311
|
+
# primary-expression(object-specifier followed by `.').
|
|
1312
|
+
dup # NOTREACHED
|
|
1313
|
+
end
|
|
1314
|
+
|
|
1315
|
+
def +(rhs_value)
|
|
1316
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1317
|
+
# primary-expression(object-specifier followed by `.').
|
|
1318
|
+
dup # NOTREACHED
|
|
1319
|
+
end
|
|
1320
|
+
|
|
1321
|
+
def -(rhs_value)
|
|
1322
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1323
|
+
# primary-expression(object-specifier followed by `.').
|
|
1324
|
+
dup # NOTREACHED
|
|
1325
|
+
end
|
|
1326
|
+
|
|
1327
|
+
def *(rhs_value)
|
|
1328
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1329
|
+
# primary-expression(object-specifier followed by `.').
|
|
1330
|
+
dup # NOTREACHED
|
|
1331
|
+
end
|
|
1332
|
+
|
|
1333
|
+
def /(rhs_value)
|
|
1334
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1335
|
+
# primary-expression(object-specifier followed by `.').
|
|
1336
|
+
dup # NOTREACHED
|
|
1337
|
+
end
|
|
1338
|
+
|
|
1339
|
+
def %(rhs_value)
|
|
1340
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1341
|
+
# primary-expression(object-specifier followed by `.').
|
|
1342
|
+
dup # NOTREACHED
|
|
1343
|
+
end
|
|
1344
|
+
|
|
1345
|
+
def &(rhs_value)
|
|
1346
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1347
|
+
# primary-expression(object-specifier followed by `.').
|
|
1348
|
+
dup # NOTREACHED
|
|
1349
|
+
end
|
|
1350
|
+
|
|
1351
|
+
def |(rhs_value)
|
|
1352
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1353
|
+
# primary-expression(object-specifier followed by `.').
|
|
1354
|
+
dup # NOTREACHED
|
|
1355
|
+
end
|
|
1356
|
+
|
|
1357
|
+
def ^(rhs_value)
|
|
1358
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1359
|
+
# primary-expression(object-specifier followed by `.').
|
|
1360
|
+
dup # NOTREACHED
|
|
1361
|
+
end
|
|
1362
|
+
|
|
1363
|
+
def <<(rhs_value)
|
|
1364
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1365
|
+
# primary-expression(object-specifier followed by `.').
|
|
1366
|
+
dup # NOTREACHED
|
|
1367
|
+
end
|
|
1368
|
+
|
|
1369
|
+
def >>(rhs_value)
|
|
1370
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1371
|
+
# primary-expression(object-specifier followed by `.').
|
|
1372
|
+
dup # NOTREACHED
|
|
1373
|
+
end
|
|
1374
|
+
|
|
1375
|
+
def !
|
|
1376
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1377
|
+
# primary-expression(object-specifier followed by `.').
|
|
1378
|
+
ScalarValue.of_false # NOTREACHED
|
|
1379
|
+
end
|
|
1380
|
+
|
|
1381
|
+
def <(rhs_value)
|
|
1382
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1383
|
+
# primary-expression(object-specifier followed by `.').
|
|
1384
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1385
|
+
when CompositeValue
|
|
1386
|
+
if @values.size == rhs_single_value.values.size
|
|
1387
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1388
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1389
|
+
result.single_value_unified_with(lhs < rhs)
|
|
1390
|
+
end
|
|
1391
|
+
else
|
|
1392
|
+
ScalarValue.of_false
|
|
1393
|
+
end
|
|
1394
|
+
else
|
|
1395
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1396
|
+
end
|
|
1397
|
+
end
|
|
1398
|
+
|
|
1399
|
+
def >(rhs_value)
|
|
1400
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1401
|
+
# primary-expression(object-specifier followed by `.').
|
|
1402
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1403
|
+
when CompositeValue
|
|
1404
|
+
if @values.size == rhs_single_value.values.size
|
|
1405
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1406
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1407
|
+
result.single_value_unified_with(lhs > rhs)
|
|
1408
|
+
end
|
|
1409
|
+
else
|
|
1410
|
+
ScalarValue.of_false
|
|
1411
|
+
end
|
|
1412
|
+
else
|
|
1413
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1414
|
+
end
|
|
1415
|
+
end
|
|
1416
|
+
|
|
1417
|
+
def ==(rhs_value)
|
|
1418
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1419
|
+
# primary-expression(object-specifier followed by `.').
|
|
1420
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1421
|
+
when CompositeValue
|
|
1422
|
+
if @values.size == rhs_single_value.values.size
|
|
1423
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1424
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1425
|
+
result.single_value_unified_with(lhs == rhs)
|
|
1426
|
+
end
|
|
1427
|
+
else
|
|
1428
|
+
ScalarValue.of_false
|
|
1429
|
+
end
|
|
1430
|
+
else
|
|
1431
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1432
|
+
end
|
|
1433
|
+
end
|
|
1434
|
+
|
|
1435
|
+
def !=(rhs_value)
|
|
1436
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1437
|
+
# primary-expression(object-specifier followed by `.').
|
|
1438
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1439
|
+
when CompositeValue
|
|
1440
|
+
if @values.size == rhs_single_value.values.size
|
|
1441
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1442
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1443
|
+
result.single_value_unified_with(lhs != rhs)
|
|
1444
|
+
end
|
|
1445
|
+
else
|
|
1446
|
+
ScalarValue.of_false
|
|
1447
|
+
end
|
|
1448
|
+
else
|
|
1449
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1450
|
+
end
|
|
1451
|
+
end
|
|
1452
|
+
|
|
1453
|
+
def <=(rhs_value)
|
|
1454
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1455
|
+
# primary-expression(object-specifier followed by `.').
|
|
1456
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1457
|
+
when CompositeValue
|
|
1458
|
+
if @values.size == rhs_single_value.values.size
|
|
1459
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1460
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1461
|
+
result.single_value_unified_with(lhs <= rhs)
|
|
1462
|
+
end
|
|
1463
|
+
else
|
|
1464
|
+
ScalarValue.of_false
|
|
1465
|
+
end
|
|
1466
|
+
else
|
|
1467
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1468
|
+
end
|
|
1469
|
+
end
|
|
1470
|
+
|
|
1471
|
+
def >=(rhs_value)
|
|
1472
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1473
|
+
# primary-expression(object-specifier followed by `.').
|
|
1474
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1475
|
+
when CompositeValue
|
|
1476
|
+
if @values.size == rhs_single_value.values.size
|
|
1477
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1478
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1479
|
+
result.single_value_unified_with(lhs >= rhs)
|
|
1480
|
+
end
|
|
1481
|
+
else
|
|
1482
|
+
ScalarValue.of_false
|
|
1483
|
+
end
|
|
1484
|
+
else
|
|
1485
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1486
|
+
end
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
def logical_and(rhs_value)
|
|
1490
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1491
|
+
# primary-expression(object-specifier followed by `.').
|
|
1492
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1493
|
+
when CompositeValue
|
|
1494
|
+
if @values.size == rhs_single_value.values.size
|
|
1495
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1496
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1497
|
+
result.single_value_unified_with(lhs.logical_and(rhs))
|
|
1498
|
+
end
|
|
1499
|
+
else
|
|
1500
|
+
ScalarValue.of_false
|
|
1501
|
+
end
|
|
1502
|
+
else
|
|
1503
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1504
|
+
end
|
|
1505
|
+
end
|
|
1506
|
+
|
|
1507
|
+
def logical_or(rhs_value)
|
|
1508
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1509
|
+
# primary-expression(object-specifier followed by `.').
|
|
1510
|
+
case rhs_single_value = rhs_value.to_single_value
|
|
1511
|
+
when CompositeValue
|
|
1512
|
+
if @values.size == rhs_single_value.values.size
|
|
1513
|
+
zipped = @values.zip(rhs_single_value.values)
|
|
1514
|
+
zipped.reduce(ScalarValue.of_nil) do |result, (lhs, rhs)|
|
|
1515
|
+
result.single_value_unified_with(lhs.logical_or(rhs))
|
|
1516
|
+
end
|
|
1517
|
+
else
|
|
1518
|
+
ScalarValue.of_false
|
|
1519
|
+
end
|
|
1520
|
+
else
|
|
1521
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1522
|
+
end
|
|
1523
|
+
end
|
|
1524
|
+
|
|
1525
|
+
def must_be_equal_to?(value)
|
|
1526
|
+
case single_value = value.to_single_value
|
|
1527
|
+
when CompositeValue
|
|
1528
|
+
(self == single_value).must_be_true?
|
|
1529
|
+
else
|
|
1530
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1531
|
+
end
|
|
1532
|
+
end
|
|
1533
|
+
|
|
1534
|
+
def may_be_equal_to?(value)
|
|
1535
|
+
case single_value = value.to_single_value
|
|
1536
|
+
when CompositeValue
|
|
1537
|
+
(self == single_value).may_be_true?
|
|
1538
|
+
else
|
|
1539
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1540
|
+
end
|
|
1541
|
+
end
|
|
1542
|
+
|
|
1543
|
+
def must_not_be_equal_to?(value)
|
|
1544
|
+
case single_value = value.to_single_value
|
|
1545
|
+
when CompositeValue
|
|
1546
|
+
(self != single_value).must_be_true?
|
|
1547
|
+
else
|
|
1548
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1549
|
+
end
|
|
1550
|
+
end
|
|
1551
|
+
|
|
1552
|
+
def may_not_be_equal_to?(value)
|
|
1553
|
+
case single_value = value.to_single_value
|
|
1554
|
+
when CompositeValue
|
|
1555
|
+
(self != single_value).may_be_true?
|
|
1556
|
+
else
|
|
1557
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1558
|
+
end
|
|
1559
|
+
end
|
|
1560
|
+
|
|
1561
|
+
def must_be_less_than?(value)
|
|
1562
|
+
case single_value = value.to_single_value
|
|
1563
|
+
when CompositeValue
|
|
1564
|
+
(self < single_value).must_be_true?
|
|
1565
|
+
else
|
|
1566
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1567
|
+
end
|
|
1568
|
+
end
|
|
1569
|
+
|
|
1570
|
+
def may_be_less_than?(value)
|
|
1571
|
+
case single_value = value.to_single_value
|
|
1572
|
+
when CompositeValue
|
|
1573
|
+
(self < single_value).may_be_true?
|
|
1574
|
+
else
|
|
1575
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1576
|
+
end
|
|
1577
|
+
end
|
|
1578
|
+
|
|
1579
|
+
def must_be_greater_than?(value)
|
|
1580
|
+
case single_value = value.to_single_value
|
|
1581
|
+
when CompositeValue
|
|
1582
|
+
(self > single_value).must_be_true?
|
|
1583
|
+
else
|
|
1584
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1585
|
+
end
|
|
1586
|
+
end
|
|
1587
|
+
|
|
1588
|
+
def may_be_greater_than?(value)
|
|
1589
|
+
case single_value = value.to_single_value
|
|
1590
|
+
when CompositeValue
|
|
1591
|
+
(self > single_value).may_be_true?
|
|
1592
|
+
else
|
|
1593
|
+
raise TypeError, "comparison between composite and non-composite."
|
|
1594
|
+
end
|
|
1595
|
+
end
|
|
1596
|
+
|
|
1597
|
+
def must_be_true?
|
|
1598
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1599
|
+
# primary-expression(object-specifier followed by `.').
|
|
1600
|
+
@values.all? { |value| value.must_be_true? }
|
|
1601
|
+
end
|
|
1602
|
+
|
|
1603
|
+
def may_be_true?
|
|
1604
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1605
|
+
# primary-expression(object-specifier followed by `.').
|
|
1606
|
+
@values.all? { |value| value.may_be_true? }
|
|
1607
|
+
end
|
|
1608
|
+
|
|
1609
|
+
def must_be_false?
|
|
1610
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1611
|
+
# primary-expression(object-specifier followed by `.').
|
|
1612
|
+
@values.all? { |value| value.must_be_false? }
|
|
1613
|
+
end
|
|
1614
|
+
|
|
1615
|
+
def may_be_false?
|
|
1616
|
+
# NOTE: A composite variable cannot appear in expressions except the
|
|
1617
|
+
# primary-expression(object-specifier followed by `.').
|
|
1618
|
+
@values.all? { |value| value.may_be_false? }
|
|
1619
|
+
end
|
|
1620
|
+
|
|
1621
|
+
def coerce_to(type)
|
|
1622
|
+
type.coerce_composite_value(self)
|
|
1623
|
+
end
|
|
1624
|
+
|
|
1625
|
+
def to_enum
|
|
1626
|
+
# FIXME: This method generates only one of sample values.
|
|
1627
|
+
@values.map { |value| value.to_enum.first }
|
|
1628
|
+
end
|
|
1629
|
+
|
|
1630
|
+
def to_defined_value
|
|
1631
|
+
CompositeValue.new(@values.map { |value| value.to_defined_value })
|
|
1632
|
+
end
|
|
1633
|
+
|
|
1634
|
+
def eql?(rhs_value)
|
|
1635
|
+
rhs_value.kind_of?(CompositeValue) && @values.eql?(rhs_value.values)
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
def hash
|
|
1639
|
+
@values.hash
|
|
1640
|
+
end
|
|
1641
|
+
|
|
1642
|
+
def dup
|
|
1643
|
+
CompositeValue.new(@values.map { |value| value.dup })
|
|
1644
|
+
end
|
|
1645
|
+
end
|
|
1646
|
+
|
|
1647
|
+
class MultipleValue < Value
|
|
1648
|
+
def initialize(value, ancestor)
|
|
1649
|
+
@base_value = value.to_single_value
|
|
1650
|
+
@ancestor = ancestor
|
|
1651
|
+
@descendants = []
|
|
1652
|
+
end
|
|
1653
|
+
|
|
1654
|
+
attr_reader :base_value
|
|
1655
|
+
|
|
1656
|
+
extend Forwardable
|
|
1657
|
+
|
|
1658
|
+
def_delegator :@base_value, :scalar?
|
|
1659
|
+
def_delegator :@base_value, :array?
|
|
1660
|
+
def_delegator :@base_value, :composite?
|
|
1661
|
+
|
|
1662
|
+
def undefined?
|
|
1663
|
+
effective_values.all? { |multi_value| multi_value.base_value.undefined? }
|
|
1664
|
+
end
|
|
1665
|
+
|
|
1666
|
+
def ambiguous?
|
|
1667
|
+
effective_values.all? { |multi_value| multi_value.base_value.ambiguous? }
|
|
1668
|
+
end
|
|
1669
|
+
|
|
1670
|
+
def exist?
|
|
1671
|
+
effective_values.any? { |multi_value| multi_value.base_value.exist? }
|
|
1672
|
+
end
|
|
1673
|
+
|
|
1674
|
+
def multiple?
|
|
1675
|
+
true
|
|
1676
|
+
end
|
|
1677
|
+
|
|
1678
|
+
def overwrite!(value)
|
|
1679
|
+
single_value = value.to_single_value
|
|
1680
|
+
effective_values.each do |multi_value|
|
|
1681
|
+
multi_value.base_value.overwrite!(single_value)
|
|
1682
|
+
end
|
|
1683
|
+
end
|
|
1684
|
+
|
|
1685
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
1686
|
+
operand_single_value = operand_value.to_single_value
|
|
1687
|
+
effective_values.map { |multi_value|
|
|
1688
|
+
if ancestor = multi_value.ancestor
|
|
1689
|
+
ancestor.base_value.narrow_domain!(operator_symbol.invert,
|
|
1690
|
+
operand_single_value)
|
|
1691
|
+
end
|
|
1692
|
+
multi_value.base_value.narrow_domain!(operator_symbol,
|
|
1693
|
+
operand_single_value)
|
|
1694
|
+
}.any?
|
|
1695
|
+
end
|
|
1696
|
+
|
|
1697
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
1698
|
+
operand_single_value = operand_value.to_single_value
|
|
1699
|
+
effective_values.map { |multi_value|
|
|
1700
|
+
if ancestor = multi_value.ancestor
|
|
1701
|
+
ancestor.base_value.narrow_domain!(operator_symbol.invert,
|
|
1702
|
+
operand_single_value)
|
|
1703
|
+
end
|
|
1704
|
+
multi_value.base_value.widen_domain!(operator_symbol,
|
|
1705
|
+
operand_single_value)
|
|
1706
|
+
}.any?
|
|
1707
|
+
end
|
|
1708
|
+
|
|
1709
|
+
def invert_domain!
|
|
1710
|
+
effective_values.each do |multi_value|
|
|
1711
|
+
multi_value.base_value.invert_domain!
|
|
1712
|
+
end
|
|
1713
|
+
end
|
|
1714
|
+
|
|
1715
|
+
def single_value_unified_with(rhs_value)
|
|
1716
|
+
to_single_value.single_value_unified_with(rhs_value)
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
def fork
|
|
1720
|
+
descendant = MultipleValue.new(@base_value.dup, self)
|
|
1721
|
+
@descendants.push(descendant)
|
|
1722
|
+
descendant
|
|
1723
|
+
end
|
|
1724
|
+
|
|
1725
|
+
def rollback!
|
|
1726
|
+
@descendants.pop
|
|
1727
|
+
end
|
|
1728
|
+
|
|
1729
|
+
def delete_descendants!
|
|
1730
|
+
@descendants.clear
|
|
1731
|
+
end
|
|
1732
|
+
|
|
1733
|
+
def ~
|
|
1734
|
+
~to_single_value
|
|
1735
|
+
end
|
|
1736
|
+
|
|
1737
|
+
def +@
|
|
1738
|
+
+to_single_value
|
|
1739
|
+
end
|
|
1740
|
+
|
|
1741
|
+
def -@
|
|
1742
|
+
-to_single_value
|
|
1743
|
+
end
|
|
1744
|
+
|
|
1745
|
+
def +(rhs_value)
|
|
1746
|
+
to_single_value + rhs_value.to_single_value
|
|
1747
|
+
end
|
|
1748
|
+
|
|
1749
|
+
def -(rhs_value)
|
|
1750
|
+
to_single_value - rhs_value.to_single_value
|
|
1751
|
+
end
|
|
1752
|
+
|
|
1753
|
+
def *(rhs_value)
|
|
1754
|
+
to_single_value * rhs_value.to_single_value
|
|
1755
|
+
end
|
|
1756
|
+
|
|
1757
|
+
def /(rhs_value)
|
|
1758
|
+
to_single_value / rhs_value.to_single_value
|
|
1759
|
+
end
|
|
1760
|
+
|
|
1761
|
+
def %(rhs_value)
|
|
1762
|
+
to_single_value % rhs_value.to_single_value
|
|
1763
|
+
end
|
|
1764
|
+
|
|
1765
|
+
def &(rhs_value)
|
|
1766
|
+
to_single_value & rhs_value.to_single_value
|
|
1767
|
+
end
|
|
1768
|
+
|
|
1769
|
+
def |(rhs_value)
|
|
1770
|
+
to_single_value | rhs_value.to_single_value
|
|
1771
|
+
end
|
|
1772
|
+
|
|
1773
|
+
def ^(rhs_value)
|
|
1774
|
+
to_single_value ^ rhs_value.to_single_value
|
|
1775
|
+
end
|
|
1776
|
+
|
|
1777
|
+
def <<(rhs_value)
|
|
1778
|
+
to_single_value << rhs_value.to_single_value
|
|
1779
|
+
end
|
|
1780
|
+
|
|
1781
|
+
def >>(rhs_value)
|
|
1782
|
+
to_single_value >> rhs_value.to_single_value
|
|
1783
|
+
end
|
|
1784
|
+
|
|
1785
|
+
def !
|
|
1786
|
+
!to_single_value
|
|
1787
|
+
end
|
|
1788
|
+
|
|
1789
|
+
def <(rhs_value)
|
|
1790
|
+
to_single_value < rhs_value.to_single_value
|
|
1791
|
+
end
|
|
1792
|
+
|
|
1793
|
+
def >(rhs_value)
|
|
1794
|
+
to_single_value > rhs_value.to_single_value
|
|
1795
|
+
end
|
|
1796
|
+
|
|
1797
|
+
def ==(rhs_value)
|
|
1798
|
+
to_single_value == rhs_value.to_single_value
|
|
1799
|
+
end
|
|
1800
|
+
|
|
1801
|
+
def !=(rhs_value)
|
|
1802
|
+
to_single_value != rhs_value.to_single_value
|
|
1803
|
+
end
|
|
1804
|
+
|
|
1805
|
+
def <=(rhs_value)
|
|
1806
|
+
to_single_value <= rhs_value.to_single_value
|
|
1807
|
+
end
|
|
1808
|
+
|
|
1809
|
+
def >=(rhs_value)
|
|
1810
|
+
to_single_value >= rhs_value.to_single_value
|
|
1811
|
+
end
|
|
1812
|
+
|
|
1813
|
+
def logical_and(rhs_value)
|
|
1814
|
+
to_single_value.logical_and(rhs_value.to_single_value)
|
|
1815
|
+
end
|
|
1816
|
+
|
|
1817
|
+
def logical_or(rhs_value)
|
|
1818
|
+
to_single_value.logical_or(rhs_value.to_single_value)
|
|
1819
|
+
end
|
|
1820
|
+
|
|
1821
|
+
def must_be_equal_to?(value)
|
|
1822
|
+
single_value = value.to_single_value
|
|
1823
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1824
|
+
multi_value.base_value.exist?
|
|
1825
|
+
}
|
|
1826
|
+
return false if non_nil_values.empty?
|
|
1827
|
+
|
|
1828
|
+
non_nil_values.all? do |multi_value|
|
|
1829
|
+
multi_value.base_value.must_be_equal_to?(single_value)
|
|
1830
|
+
end
|
|
1831
|
+
end
|
|
1832
|
+
|
|
1833
|
+
def may_be_equal_to?(value)
|
|
1834
|
+
single_value = value.to_single_value
|
|
1835
|
+
effective_values.any? do |multi_value|
|
|
1836
|
+
multi_value.base_value.may_be_equal_to?(single_value)
|
|
1837
|
+
end
|
|
1838
|
+
end
|
|
1839
|
+
|
|
1840
|
+
def must_not_be_equal_to?(value)
|
|
1841
|
+
single_value = value.to_single_value
|
|
1842
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1843
|
+
multi_value.base_value.exist?
|
|
1844
|
+
}
|
|
1845
|
+
return false if non_nil_values.empty?
|
|
1846
|
+
|
|
1847
|
+
non_nil_values.all? do |multi_value|
|
|
1848
|
+
multi_value.base_value.must_not_be_equal_to?(single_value)
|
|
1849
|
+
end
|
|
1850
|
+
end
|
|
1851
|
+
|
|
1852
|
+
def may_not_be_equal_to?(value)
|
|
1853
|
+
single_value = value.to_single_value
|
|
1854
|
+
effective_values.any? do |multi_value|
|
|
1855
|
+
multi_value.base_value.may_not_be_equal_to?(single_value)
|
|
1856
|
+
end
|
|
1857
|
+
end
|
|
1858
|
+
|
|
1859
|
+
def must_be_less_than?(value)
|
|
1860
|
+
single_value = value.to_single_value
|
|
1861
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1862
|
+
multi_value.base_value.exist?
|
|
1863
|
+
}
|
|
1864
|
+
return false if non_nil_values.empty?
|
|
1865
|
+
|
|
1866
|
+
non_nil_values.all? do |multi_value|
|
|
1867
|
+
multi_value.base_value.must_be_less_than?(single_value)
|
|
1868
|
+
end
|
|
1869
|
+
end
|
|
1870
|
+
|
|
1871
|
+
def may_be_less_than?(value)
|
|
1872
|
+
single_value = value.to_single_value
|
|
1873
|
+
effective_values.any? do |multi_value|
|
|
1874
|
+
multi_value.base_value.may_be_less_than?(single_value)
|
|
1875
|
+
end
|
|
1876
|
+
end
|
|
1877
|
+
|
|
1878
|
+
def must_be_greater_than?(value)
|
|
1879
|
+
single_value = value.to_single_value
|
|
1880
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1881
|
+
multi_value.base_value.exist?
|
|
1882
|
+
}
|
|
1883
|
+
return false if non_nil_values.empty?
|
|
1884
|
+
|
|
1885
|
+
non_nil_values.all? do |multi_value|
|
|
1886
|
+
multi_value.base_value.must_be_greater_than?(single_value)
|
|
1887
|
+
end
|
|
1888
|
+
end
|
|
1889
|
+
|
|
1890
|
+
def may_be_greater_than?(value)
|
|
1891
|
+
single_value = value.to_single_value
|
|
1892
|
+
effective_values.any? do |multi_value|
|
|
1893
|
+
multi_value.base_value.may_be_greater_than?(single_value)
|
|
1894
|
+
end
|
|
1895
|
+
end
|
|
1896
|
+
|
|
1897
|
+
def must_be_undefined?
|
|
1898
|
+
effective_values.all? do |multi_value|
|
|
1899
|
+
multi_value.base_value.must_be_undefined?
|
|
1900
|
+
end
|
|
1901
|
+
end
|
|
1902
|
+
|
|
1903
|
+
def may_be_undefined?
|
|
1904
|
+
effective_values.any? do |multi_value|
|
|
1905
|
+
multi_value.base_value.may_be_undefined?
|
|
1906
|
+
end
|
|
1907
|
+
end
|
|
1908
|
+
|
|
1909
|
+
def must_be_true?
|
|
1910
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1911
|
+
multi_value.base_value.exist?
|
|
1912
|
+
}
|
|
1913
|
+
return false if non_nil_values.empty?
|
|
1914
|
+
|
|
1915
|
+
non_nil_values.all? do |multi_value|
|
|
1916
|
+
multi_value.base_value.must_be_true?
|
|
1917
|
+
end
|
|
1918
|
+
end
|
|
1919
|
+
|
|
1920
|
+
def may_be_true?
|
|
1921
|
+
effective_values.any? do |multi_value|
|
|
1922
|
+
multi_value.base_value.may_be_true?
|
|
1923
|
+
end
|
|
1924
|
+
end
|
|
1925
|
+
|
|
1926
|
+
def must_be_false?
|
|
1927
|
+
non_nil_values = effective_values.select { |multi_value|
|
|
1928
|
+
multi_value.base_value.exist?
|
|
1929
|
+
}
|
|
1930
|
+
return false if non_nil_values.empty?
|
|
1931
|
+
|
|
1932
|
+
non_nil_values.all? do |multi_value|
|
|
1933
|
+
multi_value.base_value.must_be_false?
|
|
1934
|
+
end
|
|
1935
|
+
end
|
|
1936
|
+
|
|
1937
|
+
def may_be_false?
|
|
1938
|
+
effective_values.any? do |multi_value|
|
|
1939
|
+
multi_value.base_value.may_be_false?
|
|
1940
|
+
end
|
|
1941
|
+
end
|
|
1942
|
+
|
|
1943
|
+
def coerce_to(type)
|
|
1944
|
+
MultipleValue.new(to_single_value.coerce_to(type), nil)
|
|
1945
|
+
end
|
|
1946
|
+
|
|
1947
|
+
def to_enum
|
|
1948
|
+
to_single_value.to_enum
|
|
1949
|
+
end
|
|
1950
|
+
|
|
1951
|
+
def to_single_value
|
|
1952
|
+
# NOTE: The base_value of the MultipleValue object must be a SingleValue.
|
|
1953
|
+
effective_values.map { |multi_value|
|
|
1954
|
+
multi_value.base_value
|
|
1955
|
+
}.reduce do |unified_value, single_value|
|
|
1956
|
+
unified_value.single_value_unified_with(single_value)
|
|
1957
|
+
end
|
|
1958
|
+
end
|
|
1959
|
+
|
|
1960
|
+
def to_defined_value
|
|
1961
|
+
to_single_value.to_defined_value
|
|
1962
|
+
end
|
|
1963
|
+
|
|
1964
|
+
def eql?(rhs_value)
|
|
1965
|
+
to_single_value.eql?(rhs_value.to_single_value)
|
|
1966
|
+
end
|
|
1967
|
+
|
|
1968
|
+
def hash
|
|
1969
|
+
to_single_value.hash
|
|
1970
|
+
end
|
|
1971
|
+
|
|
1972
|
+
def dup
|
|
1973
|
+
MultipleValue.new(to_single_value.dup, nil)
|
|
1974
|
+
end
|
|
1975
|
+
|
|
1976
|
+
def effective_values
|
|
1977
|
+
@descendants.empty? ? [self] : @descendants
|
|
1978
|
+
end
|
|
1979
|
+
|
|
1980
|
+
def descendants
|
|
1981
|
+
if @descendants.empty?
|
|
1982
|
+
[self]
|
|
1983
|
+
else
|
|
1984
|
+
@descendants.map { |multi_value| multi_value.descendants }.flatten.uniq
|
|
1985
|
+
end
|
|
1986
|
+
end
|
|
1987
|
+
|
|
1988
|
+
protected
|
|
1989
|
+
attr_reader :ancestor
|
|
1990
|
+
end
|
|
1991
|
+
|
|
1992
|
+
class VersionedValue < MultipleValue
|
|
1993
|
+
def initialize(original_value)
|
|
1994
|
+
# NOTE: `original_value.to_single_value' will be done in
|
|
1995
|
+
# MultipleValue#initialize.
|
|
1996
|
+
super(original_value, nil)
|
|
1997
|
+
|
|
1998
|
+
@version_controller = ValueVersionController.new(self)
|
|
1999
|
+
end
|
|
2000
|
+
|
|
2001
|
+
def begin_versioning_group
|
|
2002
|
+
@version_controller.enter_new_versioning_group
|
|
2003
|
+
end
|
|
2004
|
+
|
|
2005
|
+
def end_versioning_group(raise_complement_values)
|
|
2006
|
+
@version_controller.copy_current_version if raise_complement_values
|
|
2007
|
+
@version_controller.merge_forked_versions
|
|
2008
|
+
@version_controller.leave_current_versioning_group
|
|
2009
|
+
invalidate_memo!
|
|
2010
|
+
end
|
|
2011
|
+
|
|
2012
|
+
def begin_versioning
|
|
2013
|
+
@version_controller.begin_forking
|
|
2014
|
+
end
|
|
2015
|
+
|
|
2016
|
+
def end_versioning
|
|
2017
|
+
@version_controller.end_forking
|
|
2018
|
+
invalidate_memo!
|
|
2019
|
+
end
|
|
2020
|
+
|
|
2021
|
+
alias :_rollback_latest_version! :rollback!
|
|
2022
|
+
|
|
2023
|
+
def rollback!
|
|
2024
|
+
if @version_controller.rollback
|
|
2025
|
+
invalidate_memo!
|
|
2026
|
+
end
|
|
2027
|
+
end
|
|
2028
|
+
|
|
2029
|
+
def rollback_to_original!
|
|
2030
|
+
delete_descendants!
|
|
2031
|
+
_direct_overwrite!(@version_controller.initial_value)
|
|
2032
|
+
@version_controller = ValueVersionController.new(self)
|
|
2033
|
+
invalidate_memo!
|
|
2034
|
+
end
|
|
2035
|
+
|
|
2036
|
+
alias :_direct_overwrite! :overwrite!
|
|
2037
|
+
|
|
2038
|
+
def overwrite!(value)
|
|
2039
|
+
single_value = value.to_single_value
|
|
2040
|
+
no_effect = effective_values.all? { |multi_value|
|
|
2041
|
+
multi_value.ambiguous? || multi_value.eql?(single_value)
|
|
2042
|
+
}
|
|
2043
|
+
unless no_effect
|
|
2044
|
+
@version_controller.fork_new_version
|
|
2045
|
+
super(single_value)
|
|
2046
|
+
@version_controller.mark_current_versioning_group_as_sticky
|
|
2047
|
+
invalidate_memo!
|
|
2048
|
+
end
|
|
2049
|
+
end
|
|
2050
|
+
|
|
2051
|
+
def narrow_domain!(operator_symbol, operand_value)
|
|
2052
|
+
if effective_values.any? { |multi_value| !multi_value.ambiguous? }
|
|
2053
|
+
@version_controller.fork_new_version
|
|
2054
|
+
super
|
|
2055
|
+
invalidate_memo!
|
|
2056
|
+
end
|
|
2057
|
+
end
|
|
2058
|
+
|
|
2059
|
+
def widen_domain!(operator_symbol, operand_value)
|
|
2060
|
+
if effective_values.any? { |multi_value| !multi_value.ambiguous? }
|
|
2061
|
+
@version_controller.fork_new_version
|
|
2062
|
+
super
|
|
2063
|
+
invalidate_memo!
|
|
2064
|
+
end
|
|
2065
|
+
end
|
|
2066
|
+
|
|
2067
|
+
def invert_domain!
|
|
2068
|
+
if effective_values.any? { |multi_value| !multi_value.ambiguous? }
|
|
2069
|
+
@version_controller.fork_new_version
|
|
2070
|
+
super
|
|
2071
|
+
invalidate_memo!
|
|
2072
|
+
end
|
|
2073
|
+
end
|
|
2074
|
+
|
|
2075
|
+
def coerce_to(type)
|
|
2076
|
+
VersionedValue.new(to_single_value.coerce_to(type))
|
|
2077
|
+
end
|
|
2078
|
+
|
|
2079
|
+
def effective_values
|
|
2080
|
+
@version_controller.current_values
|
|
2081
|
+
end
|
|
2082
|
+
|
|
2083
|
+
extend Memoizable
|
|
2084
|
+
|
|
2085
|
+
memoize :to_single_value
|
|
2086
|
+
|
|
2087
|
+
def invalidate_memo!
|
|
2088
|
+
forget_to_single_value_memo
|
|
2089
|
+
end
|
|
2090
|
+
|
|
2091
|
+
private
|
|
2092
|
+
def compact_descendants!
|
|
2093
|
+
@descendants = @version_controller.current_values.reject { |multi_value|
|
|
2094
|
+
multi_value.equal?(self)
|
|
2095
|
+
}.uniq
|
|
2096
|
+
end
|
|
2097
|
+
end
|
|
2098
|
+
|
|
2099
|
+
class ValueVersionController
|
|
2100
|
+
VersioningGroup = Struct.new(:sticky, :original_values)
|
|
2101
|
+
Version = Struct.new(:group, :state, :values)
|
|
2102
|
+
|
|
2103
|
+
def initialize(original_value)
|
|
2104
|
+
@versioning_groups = [initial_versioning_group(original_value)]
|
|
2105
|
+
@versions = [initial_version(@versioning_groups.first, original_value)]
|
|
2106
|
+
end
|
|
2107
|
+
|
|
2108
|
+
def initial_value
|
|
2109
|
+
@versioning_groups.first.original_values.first
|
|
2110
|
+
end
|
|
2111
|
+
|
|
2112
|
+
def current_values
|
|
2113
|
+
current_version.values
|
|
2114
|
+
end
|
|
2115
|
+
|
|
2116
|
+
def enter_new_versioning_group
|
|
2117
|
+
original_values = current_values.map { |multi_value|
|
|
2118
|
+
multi_value.base_value.dup
|
|
2119
|
+
}
|
|
2120
|
+
VersioningGroup.new(false, original_values).tap do |group|
|
|
2121
|
+
@versioning_groups.push(group)
|
|
2122
|
+
end
|
|
2123
|
+
end
|
|
2124
|
+
|
|
2125
|
+
def leave_current_versioning_group
|
|
2126
|
+
@versioning_groups.pop
|
|
2127
|
+
end
|
|
2128
|
+
|
|
2129
|
+
def begin_forking
|
|
2130
|
+
@versions.push(Version.new(current_versioning_group,
|
|
2131
|
+
:forking, current_version.values))
|
|
2132
|
+
end
|
|
2133
|
+
|
|
2134
|
+
def end_forking
|
|
2135
|
+
@versions.pop
|
|
2136
|
+
end
|
|
2137
|
+
|
|
2138
|
+
def fork_new_version
|
|
2139
|
+
if current_version.state == :forking
|
|
2140
|
+
fork_all_base_versions
|
|
2141
|
+
current_version.values = current_version.values.map { |multi_value|
|
|
2142
|
+
multi_value.fork
|
|
2143
|
+
}
|
|
2144
|
+
current_version.state = :forked
|
|
2145
|
+
end
|
|
2146
|
+
end
|
|
2147
|
+
|
|
2148
|
+
def rollback
|
|
2149
|
+
# NOTE: This method must be called in the forking section.
|
|
2150
|
+
if current_version.state == :forked
|
|
2151
|
+
end_forking
|
|
2152
|
+
current_version.values.each do |multi_value|
|
|
2153
|
+
case multi_value
|
|
2154
|
+
when VersionedValue
|
|
2155
|
+
multi_value._rollback_latest_version!
|
|
2156
|
+
else
|
|
2157
|
+
multi_value.rollback!
|
|
2158
|
+
end
|
|
2159
|
+
end
|
|
2160
|
+
begin_forking
|
|
2161
|
+
mark_current_versioning_group_as_sticky
|
|
2162
|
+
true
|
|
2163
|
+
else
|
|
2164
|
+
false
|
|
2165
|
+
end
|
|
2166
|
+
end
|
|
2167
|
+
|
|
2168
|
+
def mark_current_versioning_group_as_sticky
|
|
2169
|
+
@versioning_groups.reverse_each do |group|
|
|
2170
|
+
if group.sticky
|
|
2171
|
+
break
|
|
2172
|
+
else
|
|
2173
|
+
group.sticky = true
|
|
2174
|
+
end
|
|
2175
|
+
end
|
|
2176
|
+
end
|
|
2177
|
+
|
|
2178
|
+
def copy_current_version
|
|
2179
|
+
# NOTE: This method must be called between ending of the forking section
|
|
2180
|
+
# and ending of the versioning group.
|
|
2181
|
+
if current_versioning_group.sticky
|
|
2182
|
+
current_values.each do |multi_value|
|
|
2183
|
+
base_value = multi_value.base_value
|
|
2184
|
+
already_exist = multi_value.descendants.any? { |desc|
|
|
2185
|
+
!desc.equal?(multi_value) && desc.eql?(base_value)
|
|
2186
|
+
}
|
|
2187
|
+
multi_value.fork unless already_exist
|
|
2188
|
+
end
|
|
2189
|
+
end
|
|
2190
|
+
end
|
|
2191
|
+
|
|
2192
|
+
def merge_forked_versions
|
|
2193
|
+
# NOTE: This method must be called between ending of the forking section
|
|
2194
|
+
# and ending of the versioning group.
|
|
2195
|
+
if current_versioning_group.sticky
|
|
2196
|
+
current_version.values = current_values.map { |multi_value|
|
|
2197
|
+
multi_value.descendants
|
|
2198
|
+
}.flatten.uniq
|
|
2199
|
+
else
|
|
2200
|
+
values = current_values.zip(current_versioning_group.original_values)
|
|
2201
|
+
values.each do |current_multi_value, original_single_value|
|
|
2202
|
+
current_multi_value.delete_descendants!
|
|
2203
|
+
case current_multi_value
|
|
2204
|
+
when VersionedValue
|
|
2205
|
+
current_multi_value._direct_overwrite!(original_single_value)
|
|
2206
|
+
else
|
|
2207
|
+
current_multi_value.overwrite!(original_single_value)
|
|
2208
|
+
end
|
|
2209
|
+
end
|
|
2210
|
+
end
|
|
2211
|
+
end
|
|
2212
|
+
|
|
2213
|
+
private
|
|
2214
|
+
def initial_versioning_group(original_value)
|
|
2215
|
+
VersioningGroup.new(true, [original_value.base_value.dup])
|
|
2216
|
+
end
|
|
2217
|
+
|
|
2218
|
+
def initial_version(versioning_group, original_value)
|
|
2219
|
+
Version.new(versioning_group, :original, [original_value])
|
|
2220
|
+
end
|
|
2221
|
+
|
|
2222
|
+
def fork_all_base_versions
|
|
2223
|
+
base_version = @versions.first
|
|
2224
|
+
@versions[1..-2].each do |version|
|
|
2225
|
+
if version.state == :forking
|
|
2226
|
+
version.values = base_version.values.map { |multi_value|
|
|
2227
|
+
multi_value.fork
|
|
2228
|
+
}
|
|
2229
|
+
version.state = :forked
|
|
2230
|
+
end
|
|
2231
|
+
base_version = version
|
|
2232
|
+
end
|
|
2233
|
+
end
|
|
2234
|
+
|
|
2235
|
+
def current_versioning_group
|
|
2236
|
+
@versioning_groups.last
|
|
2237
|
+
end
|
|
2238
|
+
|
|
2239
|
+
def current_version
|
|
2240
|
+
@versions.last
|
|
2241
|
+
end
|
|
2242
|
+
end
|
|
2243
|
+
|
|
2244
|
+
class FrozenValue < Value
|
|
2245
|
+
def initialize(versioned_value)
|
|
2246
|
+
@versioned_value = versioned_value
|
|
2247
|
+
end
|
|
2248
|
+
|
|
2249
|
+
extend Forwardable
|
|
2250
|
+
|
|
2251
|
+
def_delegator :@versioned_value, :scalar?
|
|
2252
|
+
def_delegator :@versioned_value, :array?
|
|
2253
|
+
def_delegator :@versioned_value, :composite?
|
|
2254
|
+
def_delegator :@versioned_value, :undefined?
|
|
2255
|
+
def_delegator :@versioned_value, :exist?
|
|
2256
|
+
def_delegator :@versioned_value, :multiple?
|
|
2257
|
+
def_delegator :@versioned_value, :begin_versioning_group
|
|
2258
|
+
def_delegator :@versioned_value, :end_versioning_group
|
|
2259
|
+
def_delegator :@versioned_value, :begin_versioning
|
|
2260
|
+
def_delegator :@versioned_value, :end_versioning
|
|
2261
|
+
def_delegator :@versioned_value, :rollback!
|
|
2262
|
+
def_delegator :@versioned_value, :rollback_to_original!
|
|
2263
|
+
def_delegator :@versioned_value, :single_value_unified_with
|
|
2264
|
+
def_delegator :@versioned_value, :~
|
|
2265
|
+
def_delegator :@versioned_value, :+@
|
|
2266
|
+
def_delegator :@versioned_value, :-@
|
|
2267
|
+
def_delegator :@versioned_value, :+
|
|
2268
|
+
def_delegator :@versioned_value, :-
|
|
2269
|
+
def_delegator :@versioned_value, :*
|
|
2270
|
+
def_delegator :@versioned_value, :/
|
|
2271
|
+
def_delegator :@versioned_value, :%
|
|
2272
|
+
def_delegator :@versioned_value, :&
|
|
2273
|
+
def_delegator :@versioned_value, :|
|
|
2274
|
+
def_delegator :@versioned_value, :^
|
|
2275
|
+
def_delegator :@versioned_value, :<<
|
|
2276
|
+
def_delegator :@versioned_value, :>>
|
|
2277
|
+
def_delegator :@versioned_value, :!
|
|
2278
|
+
def_delegator :@versioned_value, :<
|
|
2279
|
+
def_delegator :@versioned_value, :>
|
|
2280
|
+
def_delegator :@versioned_value, :==
|
|
2281
|
+
def_delegator :@versioned_value, :!=
|
|
2282
|
+
def_delegator :@versioned_value, :<=
|
|
2283
|
+
def_delegator :@versioned_value, :>=
|
|
2284
|
+
def_delegator :@versioned_value, :logical_and
|
|
2285
|
+
def_delegator :@versioned_value, :logical_or
|
|
2286
|
+
def_delegator :@versioned_value, :must_be_equal_to?
|
|
2287
|
+
def_delegator :@versioned_value, :may_be_equal_to?
|
|
2288
|
+
def_delegator :@versioned_value, :must_not_be_equal_to?
|
|
2289
|
+
def_delegator :@versioned_value, :may_not_be_equal_to?
|
|
2290
|
+
def_delegator :@versioned_value, :must_be_less_than?
|
|
2291
|
+
def_delegator :@versioned_value, :may_be_less_than?
|
|
2292
|
+
def_delegator :@versioned_value, :must_be_greater_than?
|
|
2293
|
+
def_delegator :@versioned_value, :may_be_greater_than?
|
|
2294
|
+
def_delegator :@versioned_value, :must_be_undefined?
|
|
2295
|
+
def_delegator :@versioned_value, :may_be_undefined?
|
|
2296
|
+
def_delegator :@versioned_value, :must_be_true?
|
|
2297
|
+
def_delegator :@versioned_value, :may_be_true?
|
|
2298
|
+
def_delegator :@versioned_value, :must_be_false?
|
|
2299
|
+
def_delegator :@versioned_value, :may_be_false?
|
|
2300
|
+
def_delegator :@versioned_value, :coerce_to
|
|
2301
|
+
def_delegator :@versioned_value, :to_enum
|
|
2302
|
+
def_delegator :@versioned_value, :to_single_value
|
|
2303
|
+
def_delegator :@versioned_value, :to_defined_value
|
|
2304
|
+
def_delegator :@versioned_value, :eql?
|
|
2305
|
+
def_delegator :@versioned_value, :hash
|
|
2306
|
+
def_delegator :@versioned_value, :dup
|
|
2307
|
+
end
|
|
2308
|
+
|
|
2309
|
+
end
|
|
2310
|
+
end
|