adlint 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. data/AUTHORS +27 -0
  2. data/COPYING +674 -0
  3. data/ChangeLog +820 -0
  4. data/INSTALL +78 -0
  5. data/MANIFEST +464 -0
  6. data/NEWS +38 -0
  7. data/README +74 -0
  8. data/Rakefile +167 -0
  9. data/TODO +29 -0
  10. data/bin/adlint +141 -0
  11. data/bin/adlint_chk +129 -0
  12. data/bin/adlint_cma +122 -0
  13. data/bin/adlint_sma +129 -0
  14. data/bin/adlintize +286 -0
  15. data/etc/conf.d/fallback/cinit.erb +11 -0
  16. data/etc/conf.d/fallback/traits.erb +216 -0
  17. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
  18. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
  19. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
  20. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
  21. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
  22. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
  23. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
  24. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
  25. data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
  26. data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
  27. data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
  28. data/etc/conf.d/noarch/pinit.erb +11 -0
  29. data/etc/mesg.d/en_US/messages.yml +784 -0
  30. data/etc/mesg.d/ja_JP/messages.yml +784 -0
  31. data/lib/adlint/analyzer.rb +294 -0
  32. data/lib/adlint/c/branch.rb +251 -0
  33. data/lib/adlint/c/builtin.rb +92 -0
  34. data/lib/adlint/c/code.rb +490 -0
  35. data/lib/adlint/c/const.rb +465 -0
  36. data/lib/adlint/c/conv.rb +212 -0
  37. data/lib/adlint/c/ctrlexpr.rb +949 -0
  38. data/lib/adlint/c/domain.rb +7499 -0
  39. data/lib/adlint/c/environ.rb +133 -0
  40. data/lib/adlint/c/expr.rb +1725 -0
  41. data/lib/adlint/c/format.rb +3209 -0
  42. data/lib/adlint/c/interp.rb +1740 -0
  43. data/lib/adlint/c/lexer.rb +241 -0
  44. data/lib/adlint/c/mediator.rb +313 -0
  45. data/lib/adlint/c/message.rb +13597 -0
  46. data/lib/adlint/c/metric.rb +765 -0
  47. data/lib/adlint/c/object.rb +1018 -0
  48. data/lib/adlint/c/parser.rb +3800 -0
  49. data/lib/adlint/c/parser.y +2054 -0
  50. data/lib/adlint/c/phase.rb +712 -0
  51. data/lib/adlint/c/resolver.rb +270 -0
  52. data/lib/adlint/c/scanner.rb +248 -0
  53. data/lib/adlint/c/scope.rb +74 -0
  54. data/lib/adlint/c/syntax.rb +4279 -0
  55. data/lib/adlint/c/type.rb +7506 -0
  56. data/lib/adlint/c/util.rb +91 -0
  57. data/lib/adlint/c/value.rb +2310 -0
  58. data/lib/adlint/c.rb +56 -0
  59. data/lib/adlint/code.rb +500 -0
  60. data/lib/adlint/cpp/code.rb +189 -0
  61. data/lib/adlint/cpp/constexpr.rb +721 -0
  62. data/lib/adlint/cpp/constexpr.y +389 -0
  63. data/lib/adlint/cpp/eval.rb +1012 -0
  64. data/lib/adlint/cpp/lexer.rb +860 -0
  65. data/lib/adlint/cpp/macro.rb +637 -0
  66. data/lib/adlint/cpp/message.rb +992 -0
  67. data/lib/adlint/cpp/phase.rb +176 -0
  68. data/lib/adlint/cpp/scanner.rb +93 -0
  69. data/lib/adlint/cpp/source.rb +169 -0
  70. data/lib/adlint/cpp/subst.rb +300 -0
  71. data/lib/adlint/cpp/syntax.rb +1412 -0
  72. data/lib/adlint/cpp/util.rb +97 -0
  73. data/lib/adlint/cpp.rb +43 -0
  74. data/lib/adlint/driver.rb +147 -0
  75. data/lib/adlint/error.rb +179 -0
  76. data/lib/adlint/lang.rb +97 -0
  77. data/lib/adlint/ld/message.rb +259 -0
  78. data/lib/adlint/ld/metric.rb +57 -0
  79. data/lib/adlint/ld/object.rb +542 -0
  80. data/lib/adlint/ld/phase.rb +193 -0
  81. data/lib/adlint/ld/typedef.rb +109 -0
  82. data/lib/adlint/ld/util.rb +88 -0
  83. data/lib/adlint/ld.rb +37 -0
  84. data/lib/adlint/lexer.rb +293 -0
  85. data/lib/adlint/message.rb +368 -0
  86. data/lib/adlint/metric.rb +805 -0
  87. data/lib/adlint/monitor.rb +144 -0
  88. data/lib/adlint/phase.rb +90 -0
  89. data/lib/adlint/prelude.rb +314 -0
  90. data/lib/adlint/report.rb +617 -0
  91. data/lib/adlint/source.rb +155 -0
  92. data/lib/adlint/symbol.rb +127 -0
  93. data/lib/adlint/token.rb +215 -0
  94. data/lib/adlint/traits.rb +643 -0
  95. data/lib/adlint/util.rb +524 -0
  96. data/lib/adlint/version.rb +71 -0
  97. data/lib/adlint.rb +66 -0
  98. data/share/HEADER +45 -0
  99. data/share/demo/Makefile +110 -0
  100. data/share/demo/ambig_operator/ambig_operator.c +289 -0
  101. data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
  102. data/share/demo/array_range/array_range.c +62 -0
  103. data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
  104. data/share/demo/bad_brace/bad_brace.c +19 -0
  105. data/share/demo/bad_charset/abcde$.h +0 -0
  106. data/share/demo/bad_charset/bad_charset.c +22 -0
  107. data/share/demo/bad_comment/bad_comment.c +3 -0
  108. data/share/demo/bad_const/bad_const.c +19 -0
  109. data/share/demo/bad_conv/bad_conv.c +48 -0
  110. data/share/demo/bad_indent/bad_indent.c +50 -0
  111. data/share/demo/bad_init/bad_init.c +49 -0
  112. data/share/demo/bad_macro/bad_macro.c +97 -0
  113. data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
  114. data/share/demo/call_by_value/call_by_value.c +26 -0
  115. data/share/demo/cross_ref/cross_ref.c +21 -0
  116. data/share/demo/dangling_else/dangling_else.c +20 -0
  117. data/share/demo/dead_code/dead_code.c +237 -0
  118. data/share/demo/deep_nest/deep_nest.c +57 -0
  119. data/share/demo/dense_switch/dense_switch.c +62 -0
  120. data/share/demo/direct_recur/direct_recur.c +15 -0
  121. data/share/demo/div_by_zero/div_by_zero.c +35 -0
  122. data/share/demo/dos_source/dos_source.c +7 -0
  123. data/share/demo/funptr_cast/funptr_cast.c +26 -0
  124. data/share/demo/goto_stmt/goto_stmt.c +19 -0
  125. data/share/demo/id_hiding/id_hiding.c +19 -0
  126. data/share/demo/ill_defined/ill_defined.c +13 -0
  127. data/share/demo/implicit_conv/implicit_conv.c +60 -0
  128. data/share/demo/implicit_int/implicit_int.c +14 -0
  129. data/share/demo/incomplete_type/incomplete_type.c +49 -0
  130. data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
  131. data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
  132. data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
  133. data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
  134. data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
  135. data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
  136. data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
  137. data/share/demo/intro_demo/intro_demo.c +76 -0
  138. data/share/demo/intro_demo/intro_demo.h +12 -0
  139. data/share/demo/intro_demo/useless_header.h +5 -0
  140. data/share/demo/invalid_call/invalid_call.c +32 -0
  141. data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
  142. data/share/demo/line_comment/line_comment.c +12 -0
  143. data/share/demo/local_decl/local_decl.c +9 -0
  144. data/share/demo/logical_trick/logical_trick.c +36 -0
  145. data/share/demo/long_sym/long_sym.c +5 -0
  146. data/share/demo/loop_var/loop_var.c +92 -0
  147. data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
  148. data/share/demo/may_be_null/may_be_null.c +52 -0
  149. data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
  150. data/share/demo/may_be_unset/may_be_unset.c +34 -0
  151. data/share/demo/mmapped_io/mmapped_io.c +23 -0
  152. data/share/demo/multi_break/multi_break.c +33 -0
  153. data/share/demo/multi_decl/multi_decl_1.c +17 -0
  154. data/share/demo/multi_decl/multi_decl_1.h +6 -0
  155. data/share/demo/multi_decl/multi_decl_2.c +13 -0
  156. data/share/demo/multi_decl/multi_decl_2.h +6 -0
  157. data/share/demo/multi_decl/multi_decl_3.c +22 -0
  158. data/share/demo/multi_def/multi_def_1.c +36 -0
  159. data/share/demo/multi_def/multi_def_1.h +6 -0
  160. data/share/demo/multi_def/multi_def_2.c +22 -0
  161. data/share/demo/multi_def/multi_def_2.h +6 -0
  162. data/share/demo/multi_def/multi_def_3.c +6 -0
  163. data/share/demo/multi_typedef/multi_typedef.c +11 -0
  164. data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
  165. data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
  166. data/share/demo/must_be_false/must_be_false.c +53 -0
  167. data/share/demo/must_be_null/must_be_null.c +13 -0
  168. data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
  169. data/share/demo/must_be_true/must_be_true.c +21 -0
  170. data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
  171. data/share/demo/no_void_arg/no_void_arg.c +14 -0
  172. data/share/demo/null_stmt/null_stmt.c +19 -0
  173. data/share/demo/octal_const/octal_const.c +20 -0
  174. data/share/demo/output_by_param/output_by_param.c +17 -0
  175. data/share/demo/overflow/overflow.c +74 -0
  176. data/share/demo/press_release/press_release.c +40 -0
  177. data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
  178. data/share/demo/shift_expr/shift_expr.c +14 -0
  179. data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
  180. data/share/demo/static_paths/static_paths.c +153 -0
  181. data/share/demo/static_vars/static_vars.c +39 -0
  182. data/share/demo/tag_hiding/tag_hiding.c +18 -0
  183. data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
  184. data/share/demo/undefined_macro/undefined_macro.c +17 -0
  185. data/share/demo/uninit_vars/uninit_vars.c +28 -0
  186. data/share/demo/union_type/union_type.c +23 -0
  187. data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
  188. data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
  189. data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
  190. data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
  191. data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
  192. data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
  193. data/share/demo/unreachable/unreachable.c +34 -0
  194. data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
  195. data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
  196. data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
  197. data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
  198. data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
  199. data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
  200. data/share/demo/useless_expr/useless_expr.c +17 -0
  201. data/share/demo/useless_funs/useless_funs_1.c +21 -0
  202. data/share/demo/useless_funs/useless_funs_1.h +8 -0
  203. data/share/demo/useless_funs/useless_funs_2.c +6 -0
  204. data/share/demo/useless_header/useless_header.c +9 -0
  205. data/share/demo/useless_header/useless_header_1.h +12 -0
  206. data/share/demo/useless_header/useless_header_2.h +6 -0
  207. data/share/demo/useless_header/useless_header_3.h +9 -0
  208. data/share/demo/useless_header/useless_header_4.h +3 -0
  209. data/share/demo/useless_vars/useless_vars.c +17 -0
  210. data/share/demo/va_funcall/va_funcall.c +25 -0
  211. data/share/demo/various_fundef/various_fundef.c +36 -0
  212. data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
  213. data/share/demo/wrap_around/wrap_around.c +38 -0
  214. data/share/doc/Makefile +16 -0
  215. data/share/doc/adlint_on_adqua.png +0 -0
  216. data/share/doc/adlint_on_eclipse_en.png +0 -0
  217. data/share/doc/adlint_on_eclipse_ja.png +0 -0
  218. data/share/doc/adlint_on_vim_en.png +0 -0
  219. data/share/doc/adlint_on_vim_ja.png +0 -0
  220. data/share/doc/developers_guide_ja.html +171 -0
  221. data/share/doc/developers_guide_ja.texi +87 -0
  222. data/share/doc/gen_mesg_sections.rb +39 -0
  223. data/share/doc/samples/GNUmakefile +162 -0
  224. data/share/doc/samples/adlint_traits.yml +238 -0
  225. data/share/doc/texinfo.css +22 -0
  226. data/share/doc/users_guide_en.html +39975 -0
  227. data/share/doc/users_guide_en.texi +32640 -0
  228. data/share/doc/users_guide_ja.html +40505 -0
  229. data/share/doc/users_guide_ja.texi +33189 -0
  230. data/share/logo/adlint-110.png +0 -0
  231. data/share/logo/adlint-524.png +0 -0
  232. data/share/logo/adlint.svg +4637 -0
  233. data/share/sample/README +6 -0
  234. data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
  235. data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
  236. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
  237. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
  238. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
  239. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
  240. data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
  241. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
  242. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
  243. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
  244. data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
  245. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
  246. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
  247. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
  248. data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
  249. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
  250. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
  251. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
  252. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
  253. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
  254. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
  255. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
  256. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
  257. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
  258. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
  259. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
  260. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
  261. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
  262. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
  263. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
  264. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
  265. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
  353. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
  354. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
  355. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
  356. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
  357. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
  358. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
  359. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
  360. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
  361. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
  362. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
  363. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
  364. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
  365. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
  366. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
  367. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
  368. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
  369. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
  370. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
  371. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
  372. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
  373. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
  374. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
  375. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
  376. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
  377. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
  378. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
  379. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
  380. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
  381. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
  382. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
  383. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
  384. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
  385. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
  386. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
  387. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
  388. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
  389. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
  390. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
  391. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
  392. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
  393. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
  394. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
  395. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
  396. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
  397. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
  398. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
  399. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
  400. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
  401. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
  402. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
  403. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
  404. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
  405. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
  406. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
  407. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
  408. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
  409. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
  410. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
  411. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
  412. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
  413. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
  414. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
  415. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
  416. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
  417. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
  418. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
  419. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
  420. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
  421. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
  422. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
  423. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
  424. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
  425. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
  426. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
  427. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
  428. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
  429. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
  430. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
  431. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
  432. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
  433. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
  434. data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
  435. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
  436. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
  437. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
  438. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
  439. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
  440. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
  441. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
  442. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
  443. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
  444. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
  445. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
  446. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
  447. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
  448. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
  449. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
  450. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
  451. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
  452. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
  453. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
  454. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
  455. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
  456. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
  457. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
  458. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
  459. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
  460. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
  461. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
  462. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
  463. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
  464. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
  465. 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