adlint 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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