isomorfeus-ferret 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +612 -0
  3. data/README.md +44 -0
  4. data/ext/isomorfeus_ferret_ext/benchmark.c +223 -0
  5. data/ext/isomorfeus_ferret_ext/benchmark.h +45 -0
  6. data/ext/isomorfeus_ferret_ext/benchmarks_all.h +25 -0
  7. data/ext/isomorfeus_ferret_ext/bm_bitvector.c +123 -0
  8. data/ext/isomorfeus_ferret_ext/bm_hash.c +118 -0
  9. data/ext/isomorfeus_ferret_ext/bm_micro_string.c +40 -0
  10. data/ext/isomorfeus_ferret_ext/bm_store.c +93 -0
  11. data/ext/isomorfeus_ferret_ext/email.rl +21 -0
  12. data/ext/isomorfeus_ferret_ext/extconf.rb +5 -0
  13. data/ext/isomorfeus_ferret_ext/fio_tmpfile.h +53 -0
  14. data/ext/isomorfeus_ferret_ext/frb_analysis.c +2577 -0
  15. data/ext/isomorfeus_ferret_ext/frb_index.c +3457 -0
  16. data/ext/isomorfeus_ferret_ext/frb_lang.c +9 -0
  17. data/ext/isomorfeus_ferret_ext/frb_lang.h +17 -0
  18. data/ext/isomorfeus_ferret_ext/frb_qparser.c +629 -0
  19. data/ext/isomorfeus_ferret_ext/frb_search.c +4460 -0
  20. data/ext/isomorfeus_ferret_ext/frb_store.c +515 -0
  21. data/ext/isomorfeus_ferret_ext/frb_threading.h +30 -0
  22. data/ext/isomorfeus_ferret_ext/frb_utils.c +1127 -0
  23. data/ext/isomorfeus_ferret_ext/frt_analysis.c +1644 -0
  24. data/ext/isomorfeus_ferret_ext/frt_analysis.h +247 -0
  25. data/ext/isomorfeus_ferret_ext/frt_array.c +124 -0
  26. data/ext/isomorfeus_ferret_ext/frt_array.h +54 -0
  27. data/ext/isomorfeus_ferret_ext/frt_bitvector.c +95 -0
  28. data/ext/isomorfeus_ferret_ext/frt_bitvector.h +586 -0
  29. data/ext/isomorfeus_ferret_ext/frt_compound_io.c +374 -0
  30. data/ext/isomorfeus_ferret_ext/frt_config.h +44 -0
  31. data/ext/isomorfeus_ferret_ext/frt_document.c +134 -0
  32. data/ext/isomorfeus_ferret_ext/frt_document.h +52 -0
  33. data/ext/isomorfeus_ferret_ext/frt_except.c +95 -0
  34. data/ext/isomorfeus_ferret_ext/frt_except.h +188 -0
  35. data/ext/isomorfeus_ferret_ext/frt_field_index.c +233 -0
  36. data/ext/isomorfeus_ferret_ext/frt_field_index.h +42 -0
  37. data/ext/isomorfeus_ferret_ext/frt_filter.c +157 -0
  38. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +502 -0
  39. data/ext/isomorfeus_ferret_ext/frt_global.c +427 -0
  40. data/ext/isomorfeus_ferret_ext/frt_global.h +290 -0
  41. data/ext/isomorfeus_ferret_ext/frt_hash.c +518 -0
  42. data/ext/isomorfeus_ferret_ext/frt_hash.h +466 -0
  43. data/ext/isomorfeus_ferret_ext/frt_hashset.c +191 -0
  44. data/ext/isomorfeus_ferret_ext/frt_hashset.h +206 -0
  45. data/ext/isomorfeus_ferret_ext/frt_helper.c +62 -0
  46. data/ext/isomorfeus_ferret_ext/frt_helper.h +13 -0
  47. data/ext/isomorfeus_ferret_ext/frt_ind.c +353 -0
  48. data/ext/isomorfeus_ferret_ext/frt_ind.h +54 -0
  49. data/ext/isomorfeus_ferret_ext/frt_index.c +6377 -0
  50. data/ext/isomorfeus_ferret_ext/frt_index.h +880 -0
  51. data/ext/isomorfeus_ferret_ext/frt_lang.c +104 -0
  52. data/ext/isomorfeus_ferret_ext/frt_lang.h +44 -0
  53. data/ext/isomorfeus_ferret_ext/frt_mempool.c +87 -0
  54. data/ext/isomorfeus_ferret_ext/frt_mempool.h +33 -0
  55. data/ext/isomorfeus_ferret_ext/frt_multimapper.c +349 -0
  56. data/ext/isomorfeus_ferret_ext/frt_multimapper.h +52 -0
  57. data/ext/isomorfeus_ferret_ext/frt_posh.c +1006 -0
  58. data/ext/isomorfeus_ferret_ext/frt_posh.h +973 -0
  59. data/ext/isomorfeus_ferret_ext/frt_priorityqueue.c +147 -0
  60. data/ext/isomorfeus_ferret_ext/frt_priorityqueue.h +147 -0
  61. data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +1612 -0
  62. data/ext/isomorfeus_ferret_ext/frt_q_const_score.c +157 -0
  63. data/ext/isomorfeus_ferret_ext/frt_q_filtered_query.c +209 -0
  64. data/ext/isomorfeus_ferret_ext/frt_q_fuzzy.c +281 -0
  65. data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +147 -0
  66. data/ext/isomorfeus_ferret_ext/frt_q_multi_term.c +672 -0
  67. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +3084 -0
  68. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +1182 -0
  69. data/ext/isomorfeus_ferret_ext/frt_q_prefix.c +98 -0
  70. data/ext/isomorfeus_ferret_ext/frt_q_range.c +665 -0
  71. data/ext/isomorfeus_ferret_ext/frt_q_span.c +2386 -0
  72. data/ext/isomorfeus_ferret_ext/frt_q_term.c +311 -0
  73. data/ext/isomorfeus_ferret_ext/frt_q_wildcard.c +166 -0
  74. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +460 -0
  75. data/ext/isomorfeus_ferret_ext/frt_scanner.c +899 -0
  76. data/ext/isomorfeus_ferret_ext/frt_scanner.h +28 -0
  77. data/ext/isomorfeus_ferret_ext/frt_scanner_mb.c +6705 -0
  78. data/ext/isomorfeus_ferret_ext/frt_scanner_utf8.c +4419 -0
  79. data/ext/isomorfeus_ferret_ext/frt_search.c +1824 -0
  80. data/ext/isomorfeus_ferret_ext/frt_search.h +924 -0
  81. data/ext/isomorfeus_ferret_ext/frt_similarity.c +150 -0
  82. data/ext/isomorfeus_ferret_ext/frt_similarity.h +79 -0
  83. data/ext/isomorfeus_ferret_ext/frt_sort.c +796 -0
  84. data/ext/isomorfeus_ferret_ext/frt_stopwords.c +395 -0
  85. data/ext/isomorfeus_ferret_ext/frt_store.c +680 -0
  86. data/ext/isomorfeus_ferret_ext/frt_store.h +789 -0
  87. data/ext/isomorfeus_ferret_ext/frt_term_vectors.c +72 -0
  88. data/ext/isomorfeus_ferret_ext/frt_threading.h +23 -0
  89. data/ext/isomorfeus_ferret_ext/frt_win32.h +54 -0
  90. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +409 -0
  91. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.h +95 -0
  92. data/ext/isomorfeus_ferret_ext/libstemmer.c +93 -0
  93. data/ext/isomorfeus_ferret_ext/libstemmer.h +73 -0
  94. data/ext/isomorfeus_ferret_ext/q_parser.y +1366 -0
  95. data/ext/isomorfeus_ferret_ext/scanner.h +28 -0
  96. data/ext/isomorfeus_ferret_ext/scanner.in +43 -0
  97. data/ext/isomorfeus_ferret_ext/scanner.rl +84 -0
  98. data/ext/isomorfeus_ferret_ext/scanner_mb.rl +200 -0
  99. data/ext/isomorfeus_ferret_ext/scanner_utf8.rl +85 -0
  100. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.c +324 -0
  101. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.h +7 -0
  102. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.c +610 -0
  103. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.h +6 -0
  104. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.c +1104 -0
  105. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.h +6 -0
  106. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.c +749 -0
  107. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.h +7 -0
  108. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.c +1233 -0
  109. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.h +6 -0
  110. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.c +490 -0
  111. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.h +6 -0
  112. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_hungarian.c +1217 -0
  113. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_hungarian.h +7 -0
  114. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.c +1052 -0
  115. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.h +6 -0
  116. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.c +283 -0
  117. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.h +6 -0
  118. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.c +735 -0
  119. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.h +6 -0
  120. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.c +1003 -0
  121. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.h +7 -0
  122. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.c +1079 -0
  123. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.h +6 -0
  124. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.c +293 -0
  125. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.h +6 -0
  126. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.c +984 -0
  127. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.h +6 -0
  128. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.c +686 -0
  129. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.h +6 -0
  130. data/ext/isomorfeus_ferret_ext/stem_UTF_8_danish.c +325 -0
  131. data/ext/isomorfeus_ferret_ext/stem_UTF_8_danish.h +6 -0
  132. data/ext/isomorfeus_ferret_ext/stem_UTF_8_dutch.c +620 -0
  133. data/ext/isomorfeus_ferret_ext/stem_UTF_8_dutch.h +6 -0
  134. data/ext/isomorfeus_ferret_ext/stem_UTF_8_english.c +1111 -0
  135. data/ext/isomorfeus_ferret_ext/stem_UTF_8_english.h +6 -0
  136. data/ext/isomorfeus_ferret_ext/stem_UTF_8_finnish.c +754 -0
  137. data/ext/isomorfeus_ferret_ext/stem_UTF_8_finnish.h +6 -0
  138. data/ext/isomorfeus_ferret_ext/stem_UTF_8_french.c +1242 -0
  139. data/ext/isomorfeus_ferret_ext/stem_UTF_8_french.h +6 -0
  140. data/ext/isomorfeus_ferret_ext/stem_UTF_8_german.c +495 -0
  141. data/ext/isomorfeus_ferret_ext/stem_UTF_8_german.h +6 -0
  142. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hungarian.c +1220 -0
  143. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hungarian.h +6 -0
  144. data/ext/isomorfeus_ferret_ext/stem_UTF_8_italian.c +1059 -0
  145. data/ext/isomorfeus_ferret_ext/stem_UTF_8_italian.h +6 -0
  146. data/ext/isomorfeus_ferret_ext/stem_UTF_8_norwegian.c +285 -0
  147. data/ext/isomorfeus_ferret_ext/stem_UTF_8_norwegian.h +6 -0
  148. data/ext/isomorfeus_ferret_ext/stem_UTF_8_porter.c +741 -0
  149. data/ext/isomorfeus_ferret_ext/stem_UTF_8_porter.h +6 -0
  150. data/ext/isomorfeus_ferret_ext/stem_UTF_8_portuguese.c +1009 -0
  151. data/ext/isomorfeus_ferret_ext/stem_UTF_8_portuguese.h +6 -0
  152. data/ext/isomorfeus_ferret_ext/stem_UTF_8_romanian.c +990 -0
  153. data/ext/isomorfeus_ferret_ext/stem_UTF_8_romanian.h +6 -0
  154. data/ext/isomorfeus_ferret_ext/stem_UTF_8_russian.c +680 -0
  155. data/ext/isomorfeus_ferret_ext/stem_UTF_8_russian.h +6 -0
  156. data/ext/isomorfeus_ferret_ext/stem_UTF_8_spanish.c +1083 -0
  157. data/ext/isomorfeus_ferret_ext/stem_UTF_8_spanish.h +6 -0
  158. data/ext/isomorfeus_ferret_ext/stem_UTF_8_swedish.c +294 -0
  159. data/ext/isomorfeus_ferret_ext/stem_UTF_8_swedish.h +6 -0
  160. data/ext/isomorfeus_ferret_ext/stem_UTF_8_turkish.c +2191 -0
  161. data/ext/isomorfeus_ferret_ext/stem_UTF_8_turkish.h +6 -0
  162. data/ext/isomorfeus_ferret_ext/stem_api.c +66 -0
  163. data/ext/isomorfeus_ferret_ext/stem_api.h +26 -0
  164. data/ext/isomorfeus_ferret_ext/stem_header.h +57 -0
  165. data/ext/isomorfeus_ferret_ext/stem_modules.h +190 -0
  166. data/ext/isomorfeus_ferret_ext/stem_modules.txt +50 -0
  167. data/ext/isomorfeus_ferret_ext/stem_utilities.c +478 -0
  168. data/ext/isomorfeus_ferret_ext/test.c +850 -0
  169. data/ext/isomorfeus_ferret_ext/test.h +416 -0
  170. data/ext/isomorfeus_ferret_ext/test_1710.c +63 -0
  171. data/ext/isomorfeus_ferret_ext/test_analysis.c +1221 -0
  172. data/ext/isomorfeus_ferret_ext/test_array.c +272 -0
  173. data/ext/isomorfeus_ferret_ext/test_bitvector.c +600 -0
  174. data/ext/isomorfeus_ferret_ext/test_compound_io.c +170 -0
  175. data/ext/isomorfeus_ferret_ext/test_document.c +156 -0
  176. data/ext/isomorfeus_ferret_ext/test_except.c +244 -0
  177. data/ext/isomorfeus_ferret_ext/test_fields.c +522 -0
  178. data/ext/isomorfeus_ferret_ext/test_file_deleter.c +185 -0
  179. data/ext/isomorfeus_ferret_ext/test_filter.c +331 -0
  180. data/ext/isomorfeus_ferret_ext/test_fs_store.c +25 -0
  181. data/ext/isomorfeus_ferret_ext/test_global.c +299 -0
  182. data/ext/isomorfeus_ferret_ext/test_hash.c +485 -0
  183. data/ext/isomorfeus_ferret_ext/test_hashset.c +288 -0
  184. data/ext/isomorfeus_ferret_ext/test_helper.c +47 -0
  185. data/ext/isomorfeus_ferret_ext/test_highlighter.c +548 -0
  186. data/ext/isomorfeus_ferret_ext/test_index.c +2323 -0
  187. data/ext/isomorfeus_ferret_ext/test_lang.c +74 -0
  188. data/ext/isomorfeus_ferret_ext/test_mempool.c +102 -0
  189. data/ext/isomorfeus_ferret_ext/test_multimapper.c +64 -0
  190. data/ext/isomorfeus_ferret_ext/test_priorityqueue.c +213 -0
  191. data/ext/isomorfeus_ferret_ext/test_q_const_score.c +84 -0
  192. data/ext/isomorfeus_ferret_ext/test_q_filtered.c +61 -0
  193. data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +241 -0
  194. data/ext/isomorfeus_ferret_ext/test_q_parser.c +464 -0
  195. data/ext/isomorfeus_ferret_ext/test_q_span.c +575 -0
  196. data/ext/isomorfeus_ferret_ext/test_ram_store.c +77 -0
  197. data/ext/isomorfeus_ferret_ext/test_search.c +1874 -0
  198. data/ext/isomorfeus_ferret_ext/test_segments.c +167 -0
  199. data/ext/isomorfeus_ferret_ext/test_similarity.c +25 -0
  200. data/ext/isomorfeus_ferret_ext/test_sort.c +333 -0
  201. data/ext/isomorfeus_ferret_ext/test_store.c +591 -0
  202. data/ext/isomorfeus_ferret_ext/test_store.h +3 -0
  203. data/ext/isomorfeus_ferret_ext/test_term.c +351 -0
  204. data/ext/isomorfeus_ferret_ext/test_term_vectors.c +373 -0
  205. data/ext/isomorfeus_ferret_ext/test_test.c +83 -0
  206. data/ext/isomorfeus_ferret_ext/test_threading.c +188 -0
  207. data/ext/isomorfeus_ferret_ext/testhelper.c +561 -0
  208. data/ext/isomorfeus_ferret_ext/testhelper.h +25 -0
  209. data/ext/isomorfeus_ferret_ext/tests_all.h +87 -0
  210. data/ext/isomorfeus_ferret_ext/uchar-ucs4.rl +1854 -0
  211. data/ext/isomorfeus_ferret_ext/uchar-utf8.rl +1999 -0
  212. data/ext/isomorfeus_ferret_ext/url.rl +27 -0
  213. data/ext/isomorfeus_ferret_ext/word_list.h +15156 -0
  214. data/lib/isomorfeus/ferret/document.rb +132 -0
  215. data/lib/isomorfeus/ferret/field_symbol.rb +85 -0
  216. data/lib/isomorfeus/ferret/index/field_infos.rb +48 -0
  217. data/lib/isomorfeus/ferret/index/index.rb +970 -0
  218. data/lib/isomorfeus/ferret/monitor.rb +323 -0
  219. data/lib/isomorfeus/ferret/stdlib_patches.rb +151 -0
  220. data/lib/isomorfeus/ferret/version.rb +5 -0
  221. data/lib/isomorfeus-ferret.rb +8 -0
  222. metadata +307 -0
@@ -0,0 +1,600 @@
1
+ #include <time.h>
2
+ #include "testhelper.h"
3
+ #include "frt_bitvector.h"
4
+ #include "test.h"
5
+
6
+ #define BV_SIZE 1000
7
+ #define BV_INT 33
8
+
9
+ #define SET_BITS_MAX_CNT 100
10
+ static FrtBitVector *set_bits(FrtBitVector *bv, const char *bits)
11
+ {
12
+ static int bit_array[SET_BITS_MAX_CNT];
13
+ const int bit_cnt = s2l(bits, bit_array);
14
+ int i;
15
+ for (i = 0; i < bit_cnt; i++) {
16
+ frt_bv_set(bv, bit_array[i]);
17
+ }
18
+ return bv;
19
+ }
20
+
21
+ /*
22
+ static FrtBitVector *unset_bits(FrtBitVector *bv, char *bits)
23
+ {
24
+ static int bit_array[SET_BITS_MAX_CNT];
25
+ const int bit_cnt = s2l(bits, bit_array);
26
+ int i;
27
+ for (i = 0; i < bit_cnt; i++) {
28
+ frt_bv_unset(bv, bit_array[i]);
29
+ }
30
+ return bv;
31
+ }
32
+ */
33
+
34
+ /**
35
+ * Test basic FrtBitVector get/set/unset operations
36
+ */
37
+ static void test_bv(TestCase *tc, void *data)
38
+ {
39
+ int i;
40
+ FrtBitVector *bv = frt_bv_new();
41
+ (void)data; /* suppress unused argument warning */
42
+
43
+ Aiequal(0, bv->size);
44
+ Aiequal(0, bv->count);
45
+ Aiequal(0, frt_bv_recount(bv));
46
+
47
+ frt_bv_set(bv, 10);
48
+ Aiequal(1, frt_bv_get(bv, 10));
49
+ Aiequal(11, bv->size);
50
+ Aiequal(1, bv->count);
51
+ Aiequal(1, frt_bv_recount(bv));
52
+
53
+ frt_bv_set(bv, 10);
54
+ Aiequal(1, frt_bv_get(bv, 10));
55
+ Aiequal(11, bv->size);
56
+ Aiequal(1, bv->count);
57
+ Aiequal(1, frt_bv_recount(bv));
58
+
59
+ frt_bv_set(bv, 20);
60
+ Aiequal(1, frt_bv_get(bv, 20));
61
+ Aiequal(21, bv->size);
62
+ Aiequal(2, bv->count);
63
+ Aiequal(2, frt_bv_recount(bv));
64
+
65
+ frt_bv_unset(bv, 21);
66
+ Aiequal(0, frt_bv_get(bv, 21));
67
+ Aiequal(22, bv->size);
68
+ Aiequal(2, bv->count);
69
+ Aiequal(2, frt_bv_recount(bv));
70
+
71
+ frt_bv_unset(bv, 20);
72
+ Aiequal(0, frt_bv_get(bv, 20));
73
+ Aiequal(22, bv->size);
74
+ Aiequal(1, bv->count);
75
+ Aiequal(1, frt_bv_recount(bv));
76
+ Aiequal(1, frt_bv_get(bv, 10));
77
+
78
+ frt_bv_set(bv, 100);
79
+ Aiequal(1, frt_bv_get(bv, 100));
80
+ Aiequal(101, bv->size);
81
+ Aiequal(2, bv->count);
82
+ Aiequal(2, frt_bv_recount(bv));
83
+ Aiequal(1, frt_bv_get(bv, 10));
84
+
85
+ frt_bv_clear(bv);
86
+ Aiequal(0, frt_bv_get(bv, 10));
87
+ Aiequal(0, bv->size);
88
+ Aiequal(0, bv->count);
89
+ Aiequal(0, frt_bv_recount(bv));
90
+ frt_bv_unset(bv, 20);
91
+ Aiequal(21, bv->size);
92
+
93
+ /* test setting bits at intervals for a large number of bits */
94
+ frt_bv_clear(bv);
95
+ for (i = BV_INT; i < BV_SIZE; i += BV_INT) {
96
+ frt_bv_set(bv, i);
97
+ }
98
+ for (i = BV_INT; i < BV_SIZE; i += BV_INT) {
99
+ Aiequal(1, frt_bv_get(bv, i));
100
+ Aiequal(0, frt_bv_get(bv, i - 1));
101
+ Aiequal(0, frt_bv_get(bv, i + 1));
102
+ }
103
+
104
+ /* test setting all bits */
105
+ frt_bv_clear(bv);
106
+ for (i = 0; i < BV_SIZE; i++) {
107
+ frt_bv_set(bv, i);
108
+ }
109
+ for (i = 0; i < BV_SIZE; i++) {
110
+ Aiequal(1, frt_bv_get(bv, i));
111
+ }
112
+
113
+ /* test random bits */
114
+ frt_bv_clear(bv);
115
+ for (i = 0; i < BV_SIZE; i++) {
116
+ if ((rand() % 2) == 0) {
117
+ frt_bv_set(bv, i);
118
+ Aiequal(1, frt_bv_get(bv, i));
119
+ }
120
+ }
121
+
122
+ frt_bv_destroy(bv);
123
+ }
124
+
125
+ /**
126
+ * Test simple FrtBitVector scanning
127
+ */
128
+ static void test_bv_scan(TestCase *tc, void *data)
129
+ {
130
+ int i;
131
+ FrtBitVector *bv = frt_bv_new();
132
+ FrtBitVector *not_bv;
133
+ (void)data; /* suppress unused argument warning */
134
+
135
+ for (i = 6; i <= 10; i++) {
136
+ frt_bv_set(bv, i);
137
+ }
138
+ not_bv = frt_bv_not(bv);
139
+ for (i = 6; i <= 10; i++) {
140
+ Aiequal(i, frt_bv_scan_next(bv));
141
+ Aiequal(i, frt_bv_scan_next_unset(not_bv));
142
+ }
143
+ Aiequal(-1, frt_bv_scan_next(bv));
144
+ Aiequal(-1, frt_bv_scan_next_unset(bv));
145
+ frt_bv_destroy(bv);
146
+ frt_bv_destroy(not_bv);
147
+ }
148
+
149
+ #define test_bveq(_bv1, _bv2) \
150
+ do { \
151
+ FrtBitVector *_not_bv1, *_not_bv2; \
152
+ Assert(frt_bv_eq(_bv1, _bv2), "BitVectors are equal ->"); \
153
+ Assert(frt_bv_eq(_bv2, _bv1), "BitVectors are equal <-"); \
154
+ Assert(frt_bv_eq(_bv1, _bv1), "bv_eq on self should work"); \
155
+ Aiequal(frt_bv_hash(_bv1), frt_bv_hash(_bv2)); \
156
+ /* test flipped bitvectors */ \
157
+ _not_bv1 = frt_bv_not(_bv1); _not_bv2 = frt_bv_not(_bv2); \
158
+ frt_bv_set(_not_bv1, 1100); /* should make no difference */ \
159
+ Assert(frt_bv_eq(_not_bv1, _not_bv2), "!BitVectors are equal ->"); \
160
+ Assert(frt_bv_eq(_not_bv2, _not_bv1), "!BitVectors are equal -<"); \
161
+ Assert(frt_bv_eq(_not_bv1, _not_bv1), "bv_eq on self should work"); \
162
+ Aiequal(frt_bv_hash(_not_bv1), frt_bv_hash(_not_bv2)); \
163
+ frt_bv_destroy(_not_bv1); frt_bv_destroy(_not_bv2); \
164
+ } while (0)
165
+
166
+ #define test_bvneq(_bv1, _bv2) \
167
+ do { \
168
+ FrtBitVector *_not_bv1, *_not_bv2; \
169
+ Assert(!frt_bv_eq(_bv1, _bv2), "BitVectors are not equal ->"); \
170
+ Assert(!frt_bv_eq(_bv2, _bv1), "BitVectors are not equal <-"); \
171
+ Assert(frt_bv_hash(_bv1) != frt_bv_hash(_bv2), "BitVector hash not equal"); \
172
+ /* test flipped bitvectors */ \
173
+ _not_bv1 = frt_bv_not(_bv1); _not_bv2 = frt_bv_not(_bv2); \
174
+ Assert(!frt_bv_eq(_not_bv1, _not_bv2), "!BitVectors are not equal ->"); \
175
+ Assert(!frt_bv_eq(_not_bv2, _not_bv1), "!BitVectors are not equal <-"); \
176
+ Assert(frt_bv_hash(_not_bv1) != frt_bv_hash(_not_bv2), "Bitvector hash !=");\
177
+ frt_bv_destroy(_not_bv1); frt_bv_destroy(_not_bv2); \
178
+ } while (0)
179
+
180
+ static void test_bv_eq_hash(TestCase *tc, void *data)
181
+ {
182
+ static int const COUNT = 1000;
183
+ int i;
184
+ FrtBitVector *bv1 = frt_bv_new();
185
+ FrtBitVector *bv2 = frt_bv_new();
186
+ (void)data;
187
+
188
+ test_bveq(bv1, bv2);
189
+ Assert(frt_bv_eq(bv1, bv1), "bv_eq on self should work");
190
+
191
+ frt_bv_set(bv1, 1);
192
+ test_bvneq(bv1, bv2);
193
+
194
+ frt_bv_set(bv2, 11);
195
+ test_bvneq(bv1, bv2);
196
+
197
+ frt_bv_set(bv1, 11);
198
+ frt_bv_set(bv2, 1);
199
+ test_bveq(bv1, bv2);
200
+
201
+ /* This will increase size of bv1 to 1000 */
202
+ frt_bv_unset(bv1, 1000);
203
+ /* difference in size shouldn't matter */
204
+ test_bveq(bv1, bv2);
205
+
206
+ for (i = 0; i < COUNT; i++) {
207
+ int bit = rand() % COUNT;
208
+ frt_bv_set(bv1, bit);
209
+ frt_bv_set(bv2, bit);
210
+ }
211
+ test_bveq(bv1, bv2);
212
+
213
+ frt_bv_destroy(bv1);
214
+ frt_bv_destroy(bv2);
215
+
216
+ /* although the saet bits will be equal, the extension will be different*/
217
+ bv1 = set_bits(frt_bv_new(), "1, 3, 5");
218
+ bv2 = frt_bv_not_x(set_bits(frt_bv_new(), "0, 2, 4"));
219
+ frt_bv_set(bv2, 5);
220
+ test_bvneq(bv1, bv2);
221
+
222
+ frt_bv_destroy(bv2);
223
+ bv2 = set_bits(frt_bv_new(), "1, 3, 5");
224
+ bv1 = frt_bv_not_x(bv1);
225
+ bv2 = frt_bv_not_x(bv2);
226
+ frt_bv_unset(bv1, 1000);
227
+ test_bvneq(bv1, bv2);
228
+
229
+ frt_bv_destroy(bv1);
230
+ frt_bv_destroy(bv2);
231
+ }
232
+
233
+ static void test_bv_and(TestCase *tc, void *data)
234
+ {
235
+ # define AND_SIZE 1000
236
+ static const int and_cnt = 500;
237
+ FrtBitVector *and_bv;
238
+ FrtBitVector *bv1 = frt_bv_new();
239
+ FrtBitVector *bv2 = frt_bv_new();
240
+ FrtBitVector *not_bv1, *not_bv2, *or_bv, *not_and_bv;
241
+ char set1[AND_SIZE];
242
+ char set2[AND_SIZE];
243
+ int i;
244
+ int count = 0;
245
+ (void)data;
246
+
247
+ memset(set1, 0, AND_SIZE);
248
+ memset(set2, 0, AND_SIZE);
249
+ for (i = 0; i < and_cnt; i++) {
250
+ int bit = rand() % AND_SIZE;
251
+ frt_bv_set(bv1, bit);
252
+ set1[bit] = 1;
253
+ }
254
+ for (i = 0; i < and_cnt; i++) {
255
+ int bit = rand() % AND_SIZE;
256
+ frt_bv_set(bv2, bit);
257
+ if (1 == set1[bit] && !set2[bit]) {
258
+ count++;
259
+ set2[bit] = 1;
260
+ }
261
+ }
262
+
263
+ not_bv1 = frt_bv_not(bv1); not_bv2 = frt_bv_not(bv2);
264
+ and_bv = frt_bv_and(not_bv1, not_bv2);
265
+ not_and_bv = frt_bv_not(and_bv);
266
+ or_bv = frt_bv_or(bv1, bv2);
267
+ Assert(frt_bv_eq(not_and_bv, or_bv), "BitVectors should be equal");
268
+ frt_bv_destroy(not_bv1); frt_bv_destroy(not_bv2);
269
+ frt_bv_destroy(and_bv);
270
+ frt_bv_destroy(not_and_bv);
271
+ frt_bv_destroy(or_bv);
272
+
273
+ and_bv = frt_bv_and(bv1, bv2);
274
+
275
+ Aiequal(count, and_bv->count);
276
+ for (i = 0; i < AND_SIZE; i++) {
277
+ Aiequal(set2[i], frt_bv_get(and_bv, i));
278
+ }
279
+
280
+
281
+ bv1 = frt_bv_and_x(bv1, bv2);
282
+ Assert(frt_bv_eq(bv1, and_bv), "BitVectors should be equal");
283
+
284
+ frt_bv_destroy(bv2);
285
+ frt_bv_destroy(and_bv);
286
+
287
+ bv2 = frt_bv_new();
288
+ and_bv = frt_bv_and(bv1, bv2);
289
+
290
+ Assert(frt_bv_eq(bv2, and_bv), "ANDed FrtBitVector should be empty");
291
+
292
+
293
+ frt_bv_destroy(bv1);
294
+ frt_bv_destroy(bv2);
295
+ frt_bv_destroy(and_bv);
296
+
297
+ bv1 = frt_bv_new();
298
+ frt_bv_not_x(bv1);
299
+ bv2 = frt_bv_new();
300
+ frt_bv_set(bv2, 10);
301
+ frt_bv_set(bv2, 11);
302
+ frt_bv_set(bv2, 20);
303
+ and_bv = frt_bv_and(bv1, bv2);
304
+
305
+ Assert(frt_bv_eq(bv2, and_bv), "ANDed FrtBitVector should be equal");
306
+
307
+ frt_bv_destroy(bv1);
308
+ frt_bv_destroy(bv2);
309
+ frt_bv_destroy(and_bv);
310
+ }
311
+
312
+ static void test_bv_or(TestCase *tc, void *data)
313
+ {
314
+ # define OR_SIZE 1000
315
+ static const int or_cnt = 500;
316
+ FrtBitVector *or_bv;
317
+ FrtBitVector *bv1 = frt_bv_new();
318
+ FrtBitVector *bv2 = frt_bv_new();
319
+ char set[OR_SIZE];
320
+ int i;
321
+ int count = 0;
322
+ (void)data;
323
+
324
+ memset(set, 0, OR_SIZE);
325
+ for (i = 0; i < or_cnt; i++) {
326
+ int bit = rand() % OR_SIZE;
327
+ frt_bv_set(bv1, bit);
328
+ if (0 == set[bit]) {
329
+ count++;
330
+ set[bit] = 1;
331
+ }
332
+ }
333
+ for (i = 0; i < or_cnt; i++) {
334
+ int bit = rand() % OR_SIZE;
335
+ frt_bv_set(bv2, bit);
336
+ if (0 == set[bit]) {
337
+ count++;
338
+ set[bit] = 1;
339
+ }
340
+ }
341
+
342
+ or_bv = frt_bv_or(bv1, bv2);
343
+
344
+ Aiequal(count, or_bv->count);
345
+ for (i = 0; i < OR_SIZE; i++) {
346
+ Aiequal(set[i], frt_bv_get(or_bv, i));
347
+ }
348
+
349
+ bv1 = frt_bv_or_x(bv1, bv2);
350
+ Assert(frt_bv_eq(bv1, or_bv), "BitVectors should be equal");
351
+
352
+ frt_bv_destroy(bv2);
353
+ frt_bv_destroy(or_bv);
354
+
355
+ bv2 = frt_bv_new();
356
+ or_bv = frt_bv_or(bv1, bv2);
357
+
358
+ Assert(frt_bv_eq(bv1, or_bv), "ORed FrtBitVector equals bv1");
359
+
360
+ frt_bv_destroy(bv1);
361
+ frt_bv_destroy(bv2);
362
+ frt_bv_destroy(or_bv);
363
+ }
364
+
365
+ static void test_bv_xor(TestCase *tc, void *data)
366
+ {
367
+ # define XOR_SIZE 1000
368
+ static const int xor_cnt = 500;
369
+ FrtBitVector *xor_bv;
370
+ FrtBitVector *bv1 = frt_bv_new();
371
+ FrtBitVector *bv2 = frt_bv_new();
372
+ char set[XOR_SIZE];
373
+ char set1[XOR_SIZE];
374
+ char set2[XOR_SIZE];
375
+ int i;
376
+ int count = 0;
377
+ (void)data;
378
+
379
+ memset(set, 0, XOR_SIZE);
380
+ memset(set1, 0, XOR_SIZE);
381
+ memset(set2, 0, XOR_SIZE);
382
+ for (i = 0; i < xor_cnt; i++) {
383
+ int bit = rand() % XOR_SIZE;
384
+ frt_bv_set(bv1, bit);
385
+ set1[bit] = 1;
386
+ }
387
+ for (i = 0; i < xor_cnt; i++) {
388
+ int bit = rand() % XOR_SIZE;
389
+ frt_bv_set(bv2, bit);
390
+ set2[bit] = 1;
391
+ }
392
+ for (i = 0; i < XOR_SIZE; i++) {
393
+ if (set1[i] != set2[i]) {
394
+ set[i] = 1;
395
+ count++;
396
+ }
397
+ }
398
+
399
+ xor_bv = frt_bv_xor(bv1, bv2);
400
+
401
+ Aiequal(count, xor_bv->count);
402
+ for (i = 0; i < XOR_SIZE; i++) {
403
+ if (!Aiequal(set[i], frt_bv_get(xor_bv, i))) {
404
+ Tmsg("At position %d, bv1 is %d and bv2 is %d\n", i,
405
+ frt_bv_get(bv1, i), frt_bv_get(bv2, i));
406
+ }
407
+ }
408
+
409
+ bv1 = frt_bv_xor_x(bv1, bv2);
410
+ Assert(frt_bv_eq(bv1, xor_bv), "BitVectors should be equal");
411
+
412
+ frt_bv_destroy(bv2);
413
+ frt_bv_destroy(xor_bv);
414
+
415
+ bv2 = frt_bv_new();
416
+ xor_bv = frt_bv_xor(bv1, bv2);
417
+
418
+ Assert(frt_bv_eq(bv1, xor_bv), "XORed FrtBitVector equals bv1");
419
+
420
+ frt_bv_destroy(bv1);
421
+ frt_bv_destroy(bv2);
422
+ frt_bv_destroy(xor_bv);
423
+ }
424
+
425
+ static void test_bv_not(TestCase *tc, void *data)
426
+ {
427
+ FrtBitVector *bv = frt_bv_new(), *not_bv;
428
+ int i;
429
+ (void)data;
430
+ set_bits(bv, "1, 5, 25, 41, 97, 185");
431
+ Aiequal(186, bv->size);
432
+
433
+ not_bv = frt_bv_not(bv);
434
+ Aiequal(bv->count, not_bv->count);
435
+ for (i = 0; i < 300; i++) {
436
+ Aiequal(1 - frt_bv_get(bv, i), frt_bv_get(not_bv, i));
437
+ }
438
+
439
+ frt_bv_not_x(bv);
440
+ Assert(frt_bv_eq(bv, not_bv), "BitVectors equal");
441
+
442
+ frt_bv_destroy(bv);
443
+ frt_bv_destroy(not_bv);
444
+ }
445
+
446
+ static void test_bv_combined_boolean_ops(TestCase *tc, void *data)
447
+ {
448
+ FrtBitVector *bv1 = frt_bv_new();
449
+ FrtBitVector *bv2 = frt_bv_new();
450
+ FrtBitVector *bv3;
451
+ FrtBitVector *bv4;
452
+ FrtBitVector *bv5;
453
+ FrtBitVector *frt_bv_empty = frt_bv_new();
454
+ (void)data;
455
+
456
+ set_bits(bv1, "1, 5, 7");
457
+ set_bits(bv2, "1, 8, 20");
458
+
459
+ bv3 = frt_bv_not(bv1);
460
+ Aiequal(bv3->size, bv1->size);
461
+
462
+ bv4 = frt_bv_and(bv1, bv3);
463
+ Assert(frt_bv_eq(bv4, frt_bv_empty), "bv & ~bv == empty FrtBitVector");
464
+ frt_bv_destroy(bv4);
465
+
466
+ bv4 = frt_bv_and(bv2, bv3);
467
+ bv5 = set_bits(frt_bv_new(), "8, 20");
468
+ Assert(frt_bv_eq(bv4, bv5), "~[1,5,7] & [1,8,20] == [8,20]");
469
+ frt_bv_destroy(bv4);
470
+ frt_bv_destroy(bv5);
471
+
472
+ bv4 = frt_bv_or(bv1, bv3);
473
+ bv5 = frt_bv_not(frt_bv_empty);
474
+ Assert(frt_bv_eq(bv4, bv5), "bv | ~bv == all 1s");
475
+ frt_bv_destroy(bv4);
476
+ frt_bv_destroy(bv5);
477
+
478
+ bv4 = frt_bv_or(bv2, bv3);
479
+ bv5 = frt_bv_not_x(set_bits(frt_bv_new(), "5, 7"));
480
+ Assert(frt_bv_eq(bv4, bv5), "~[1,5,7] | [1,8,20] == ~[5, 7]");
481
+ frt_bv_destroy(bv4);
482
+ frt_bv_destroy(bv5);
483
+
484
+ bv4 = frt_bv_xor(bv1, bv3);
485
+ bv5 = frt_bv_not(frt_bv_empty);
486
+ Assert(frt_bv_eq(bv4, bv5), "bv ^ ~bv == full FrtBitVector");
487
+ frt_bv_destroy(bv4);
488
+ frt_bv_destroy(bv5);
489
+
490
+ bv4 = frt_bv_xor(bv2, bv3);
491
+ bv5 = frt_bv_not_x(set_bits(frt_bv_new(), "5, 7, 8, 20"));
492
+ Assert(frt_bv_eq(bv4, bv5), "~[1,5,7] ^ [1,8,20] == ~[5, 7, 8, 20]");
493
+ frt_bv_destroy(bv4);
494
+ frt_bv_destroy(bv5);
495
+
496
+ frt_bv_destroy(bv1);
497
+ frt_bv_destroy(bv2);
498
+ frt_bv_destroy(bv3);
499
+ frt_bv_destroy(frt_bv_empty);
500
+ }
501
+
502
+ #define BV_DENSE_SCAN_SIZE 2000
503
+ #define BV_SCAN_INC 97
504
+ #define BV_SCAN_SIZE BV_DENSE_SCAN_SIZE * BV_SCAN_INC
505
+ /**
506
+ * Stress test FrtBitVector Scanning as well as frt_bv_set_fast. This test has been
507
+ * run successfully with BV_DENSE_SCAN_SIZE set to 20000000 and BV_SCAN_INC
508
+ * set to 97. When running this test with high numbers, be sure use -q on the
509
+ * command line or the test will take a very long time.
510
+ */
511
+ static void test_bv_scan_stress(TestCase *tc, void *data)
512
+ {
513
+ int i;
514
+ FrtBitVector *bv = frt_bv_new_capa(BV_SCAN_SIZE);
515
+ FrtBitVector *not_bv;
516
+ (void)data; /* suppress unused argument warning */
517
+
518
+ for (i = BV_SCAN_INC; i < BV_SCAN_SIZE; i += BV_SCAN_INC) {
519
+ frt_bv_set_fast(bv, i);
520
+ Aiequal(frt_bv_get(bv, i), 1);
521
+ Aiequal(frt_bv_get(bv, i-1), 0);
522
+ Aiequal(frt_bv_get(bv, i+1), 0);
523
+ }
524
+
525
+ not_bv = frt_bv_not(bv);
526
+
527
+ for (i = BV_SCAN_INC; i < BV_SCAN_SIZE; i += BV_SCAN_INC) {
528
+ Aiequal(i, frt_bv_scan_next_from(bv, i - BV_SCAN_INC / 2));
529
+ Aiequal(i, frt_bv_scan_next_unset_from(not_bv, i - BV_SCAN_INC / 2));
530
+ }
531
+ Aiequal(-1, frt_bv_scan_next_from(bv, i - BV_SCAN_INC / 2));
532
+ Aiequal(-1, frt_bv_scan_next_unset_from(not_bv, i - BV_SCAN_INC / 2));
533
+
534
+ /* test scan_next_from where size is actually greater than the highest set
535
+ * bit */
536
+ frt_bv_unset(bv, bv->size);
537
+ frt_bv_set(not_bv, not_bv->size);
538
+
539
+ frt_bv_scan_reset(bv);
540
+ frt_bv_scan_reset(not_bv);
541
+ for (i = BV_SCAN_INC; i < BV_SCAN_SIZE; i += BV_SCAN_INC) {
542
+ Aiequal(i, frt_bv_scan_next_from(bv, i - BV_SCAN_INC / 2));
543
+ Aiequal(i, frt_bv_scan_next_unset_from(not_bv, i - BV_SCAN_INC / 2));
544
+ }
545
+ Aiequal(-1, frt_bv_scan_next_from(bv, i - BV_SCAN_INC / 2));
546
+ Aiequal(-1, frt_bv_scan_next_unset_from(not_bv, i - BV_SCAN_INC / 2));
547
+
548
+ frt_bv_scan_reset(bv);
549
+ frt_bv_scan_reset(not_bv);
550
+ for (i = BV_SCAN_INC; i < BV_SCAN_SIZE; i += BV_SCAN_INC) {
551
+ Aiequal(i, frt_bv_scan_next(bv));
552
+ Aiequal(i, frt_bv_scan_next_unset(not_bv));
553
+ }
554
+ Aiequal(-1, frt_bv_scan_next(bv));
555
+ Aiequal(-1, frt_bv_scan_next_unset(not_bv));
556
+
557
+ frt_bv_clear(bv);
558
+ frt_bv_destroy(not_bv);
559
+ for (i = 0; i < BV_DENSE_SCAN_SIZE; i++) {
560
+ frt_bv_set(bv, i);
561
+ }
562
+ not_bv = frt_bv_not(bv);
563
+
564
+ for (i = 0; i < BV_DENSE_SCAN_SIZE; i++) {
565
+ Aiequal(i, frt_bv_scan_next_from(bv, i));
566
+ Aiequal(i, frt_bv_scan_next_unset_from(not_bv, i));
567
+ }
568
+ Aiequal(-1, frt_bv_scan_next_from(bv, i));
569
+ Aiequal(-1, frt_bv_scan_next_unset_from(not_bv, i));
570
+
571
+ frt_bv_scan_reset(bv);
572
+ frt_bv_scan_reset(not_bv);
573
+ for (i = 0; i < BV_DENSE_SCAN_SIZE; i++) {
574
+ Aiequal(i, frt_bv_scan_next(bv));
575
+ Aiequal(i, frt_bv_scan_next_unset(not_bv));
576
+ }
577
+ Aiequal(-1, frt_bv_scan_next(bv));
578
+ Aiequal(-1, frt_bv_scan_next_unset(not_bv));
579
+
580
+ frt_bv_destroy(bv);
581
+ frt_bv_destroy(not_bv);
582
+ }
583
+
584
+
585
+ TestSuite *ts_bitvector(TestSuite *suite)
586
+ {
587
+ suite = ADD_SUITE(suite);
588
+
589
+ tst_run_test(suite, test_bv, NULL);
590
+ tst_run_test(suite, test_bv_eq_hash, NULL);
591
+ tst_run_test(suite, test_bv_and, NULL);
592
+ tst_run_test(suite, test_bv_or, NULL);
593
+ tst_run_test(suite, test_bv_xor, NULL);
594
+ tst_run_test(suite, test_bv_not, NULL);
595
+ tst_run_test(suite, test_bv_combined_boolean_ops, NULL);
596
+ tst_run_test(suite, test_bv_scan, NULL);
597
+ tst_run_test(suite, test_bv_scan_stress, NULL);
598
+
599
+ return suite;
600
+ }