test-multi-byte-level 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #!/bin/sh
  2. . $(dirname $(readlink -f $0))/framework.sh
  3. # Check that building a single-byte trie works
  4. testsuccessequal "\
  5. ┌────────────────────────────────────────────────────┐
  6. │ Initial trie │
  7. └────────────────────────────────────────────────────┘
  8. ├── V
  9. │ ├── e
  10. │ │ ├── r
  11. │ │ │ ├── y
  12. │ │ │ │ ├── L
  13. │ │ │ │ │ ├── o
  14. │ │ │ │ │ │ ├── n
  15. │ │ │ │ │ │ │ ├── g
  16. │ │ │ │ │ │ │ │ ├── W
  17. │ │ │ │ │ │ │ │ │ ├── o
  18. │ │ │ │ │ │ │ │ │ │ ├── r
  19. │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord
  20. ├── W
  21. │ ├── o
  22. │ │ ├── r
  23. │ │ │ ├── d → Word
  24. │ │ │ │ ├── -
  25. │ │ │ │ │ ├── _
  26. │ │ │ │ │ │ ├── 0 → Word-_0
  27. │ │ │ │ ├── 2 → Label
  28. ┌────────────────────────────────────────────────────┐
  29. │ Rebuilt trie │
  30. └────────────────────────────────────────────────────┘
  31. ├── V
  32. │ ├── e
  33. │ │ ├── r
  34. │ │ │ ├── y
  35. │ │ │ │ ├── L
  36. │ │ │ │ │ ├── o
  37. │ │ │ │ │ │ ├── n
  38. │ │ │ │ │ │ │ ├── g
  39. │ │ │ │ │ │ │ │ ├── W
  40. │ │ │ │ │ │ │ │ │ ├── o
  41. │ │ │ │ │ │ │ │ │ │ ├── r
  42. │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord
  43. ├── W
  44. │ ├── o
  45. │ │ ├── r
  46. │ │ │ ├── d → Word
  47. │ │ │ │ ├── -
  48. │ │ │ │ │ ├── _
  49. │ │ │ │ │ │ ├── 0 → Word-_0
  50. │ │ │ │ ├── 2 → Label
  51. ┌────────────────────────────────────────────────────┐
  52. │ Trie for words of length 4 │
  53. └────────────────────────────────────────────────────┘
  54. ├── W
  55. │ ├── o
  56. │ │ ├── r
  57. │ │ │ ├── d → Word
  58. ┌────────────────────────────────────────────────────┐
  59. │ Trie for words of length 5 │
  60. └────────────────────────────────────────────────────┘
  61. ├── W
  62. │ ├── o
  63. │ │ ├── r
  64. │ │ │ ├── d
  65. │ │ │ │ ├── 2 → Label
  66. ┌────────────────────────────────────────────────────┐
  67. │ Trie for words of length 7 │
  68. └────────────────────────────────────────────────────┘
  69. ├── W
  70. │ ├── o
  71. │ │ ├── r
  72. │ │ │ ├── d
  73. │ │ │ │ ├── -
  74. │ │ │ │ │ ├── _
  75. │ │ │ │ │ │ ├── 0 → Word-_0
  76. ┌────────────────────────────────────────────────────┐
  77. │ Trie for words of length 12 │
  78. └────────────────────────────────────────────────────┘
  79. ├── V
  80. │ ├── e
  81. │ │ ├── r
  82. │ │ │ ├── y
  83. │ │ │ │ ├── L
  84. │ │ │ │ │ ├── o
  85. │ │ │ │ │ │ ├── n
  86. │ │ │ │ │ │ │ ├── g
  87. │ │ │ │ │ │ │ │ ├── W
  88. │ │ │ │ │ │ │ │ │ ├── o
  89. │ │ │ │ │ │ │ │ │ │ ├── r
  90. │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord" triehash --multi-byte=0 -l tree /dev/stdin
  91. # Two byte optimization
  92. testsuccessequal "\
  93. ┌────────────────────────────────────────────────────┐
  94. │ Initial trie │
  95. └────────────────────────────────────────────────────┘
  96. ├── Ve
  97. │ ├── ry
  98. │ │ ├── Lo
  99. │ │ │ ├── ng
  100. │ │ │ │ ├── Wo
  101. │ │ │ │ │ ├── rd → VeryLongWord
  102. ├── Wo
  103. │ ├── rd → Word
  104. │ │ ├── -_
  105. │ │ │ ├── 0 → Word-_0
  106. │ │ ├── 2 → Label
  107. ┌────────────────────────────────────────────────────┐
  108. │ Rebuilt trie │
  109. └────────────────────────────────────────────────────┘
  110. ├── Ve
  111. │ ├── ry
  112. │ │ ├── Lo
  113. │ │ │ ├── ng
  114. │ │ │ │ ├── Wo
  115. │ │ │ │ │ ├── rd → VeryLongWord
  116. ├── Wo
  117. │ ├── rd → Word
  118. │ │ ├── -
  119. │ │ │ ├── _0 → Word-_0
  120. │ │ ├── 2 → Label
  121. ┌────────────────────────────────────────────────────┐
  122. │ Trie for words of length 4 │
  123. └────────────────────────────────────────────────────┘
  124. ├── Wo
  125. │ ├── rd → Word
  126. ┌────────────────────────────────────────────────────┐
  127. │ Trie for words of length 5 │
  128. └────────────────────────────────────────────────────┘
  129. ├── Wo
  130. │ ├── rd
  131. │ │ ├── 2 → Label
  132. ┌────────────────────────────────────────────────────┐
  133. │ Trie for words of length 7 │
  134. └────────────────────────────────────────────────────┘
  135. ├── Wo
  136. │ ├── rd
  137. │ │ ├── -_
  138. │ │ │ ├── 0 → Word-_0
  139. ┌────────────────────────────────────────────────────┐
  140. │ Trie for words of length 12 │
  141. └────────────────────────────────────────────────────┘
  142. ├── Ve
  143. │ ├── ry
  144. │ │ ├── Lo
  145. │ │ │ ├── ng
  146. │ │ │ │ ├── Wo
  147. │ │ │ │ │ ├── rd → VeryLongWord" triehash --multi-byte=1 -l tree /dev/stdin
  148. # Four byte optimization
  149. testsuccessequal "\
  150. ┌────────────────────────────────────────────────────┐
  151. │ Initial trie │
  152. └────────────────────────────────────────────────────┘
  153. ├── Very
  154. │ ├── Long
  155. │ │ ├── Word → VeryLongWord
  156. ├── Word → Word
  157. │ ├── -
  158. │ │ ├── _
  159. │ │ │ ├── 0 → Word-_0
  160. │ ├── 2 → Label
  161. ┌────────────────────────────────────────────────────┐
  162. │ Rebuilt trie │
  163. └────────────────────────────────────────────────────┘
  164. ├── Very
  165. │ ├── Long
  166. │ │ ├── Word → VeryLongWord
  167. ├── Word → Word
  168. │ ├── -
  169. │ │ ├── _
  170. │ │ │ ├── 0 → Word-_0
  171. │ ├── 2 → Label
  172. ┌────────────────────────────────────────────────────┐
  173. │ Trie for words of length 4 │
  174. └────────────────────────────────────────────────────┘
  175. ├── Word → Word
  176. ┌────────────────────────────────────────────────────┐
  177. │ Trie for words of length 5 │
  178. └────────────────────────────────────────────────────┘
  179. ├── Word
  180. │ ├── 2 → Label
  181. ┌────────────────────────────────────────────────────┐
  182. │ Trie for words of length 7 │
  183. └────────────────────────────────────────────────────┘
  184. ├── Word
  185. │ ├── -
  186. │ │ ├── _
  187. │ │ │ ├── 0 → Word-_0
  188. ┌────────────────────────────────────────────────────┐
  189. │ Trie for words of length 12 │
  190. └────────────────────────────────────────────────────┘
  191. ├── Very
  192. │ ├── Long
  193. │ │ ├── Word → VeryLongWord" triehash --multi-byte=2 -l tree /dev/stdin
  194. # Eigh byte optimization
  195. testsuccessequal "\
  196. ┌────────────────────────────────────────────────────┐
  197. │ Initial trie │
  198. └────────────────────────────────────────────────────┘
  199. ├── VeryLong
  200. │ ├── W
  201. │ │ ├── o
  202. │ │ │ ├── r
  203. │ │ │ │ ├── d → VeryLongWord
  204. ├── W
  205. │ ├── o
  206. │ │ ├── r
  207. │ │ │ ├── d → Word
  208. │ │ │ │ ├── -
  209. │ │ │ │ │ ├── _
  210. │ │ │ │ │ │ ├── 0 → Word-_0
  211. │ │ │ │ ├── 2 → Label
  212. ┌────────────────────────────────────────────────────┐
  213. │ Rebuilt trie │
  214. └────────────────────────────────────────────────────┘
  215. ├── V
  216. │ ├── eryLongW
  217. │ │ ├── o
  218. │ │ │ ├── r
  219. │ │ │ │ ├── d → VeryLongWord
  220. ├── W
  221. │ ├── o
  222. │ │ ├── r
  223. │ │ │ ├── d → Word
  224. │ │ │ │ ├── -
  225. │ │ │ │ │ ├── _
  226. │ │ │ │ │ │ ├── 0 → Word-_0
  227. │ │ │ │ ├── 2 → Label
  228. ┌────────────────────────────────────────────────────┐
  229. │ Trie for words of length 4 │
  230. └────────────────────────────────────────────────────┘
  231. ├── W
  232. │ ├── o
  233. │ │ ├── r
  234. │ │ │ ├── d → Word
  235. ┌────────────────────────────────────────────────────┐
  236. │ Trie for words of length 5 │
  237. └────────────────────────────────────────────────────┘
  238. ├── W
  239. │ ├── o
  240. │ │ ├── r
  241. │ │ │ ├── d
  242. │ │ │ │ ├── 2 → Label
  243. ┌────────────────────────────────────────────────────┐
  244. │ Trie for words of length 7 │
  245. └────────────────────────────────────────────────────┘
  246. ├── W
  247. │ ├── o
  248. │ │ ├── r
  249. │ │ │ ├── d
  250. │ │ │ │ ├── -
  251. │ │ │ │ │ ├── _
  252. │ │ │ │ │ │ ├── 0 → Word-_0
  253. ┌────────────────────────────────────────────────────┐
  254. │ Trie for words of length 12 │
  255. └────────────────────────────────────────────────────┘
  256. ├── VeryLong
  257. │ ├── W
  258. │ │ ├── o
  259. │ │ │ ├── r
  260. │ │ │ │ ├── d → VeryLongWord" triehash --multi-byte=3 -l tree /dev/stdin
  261. # Check that building a multi-byte trie works
  262. testsuccessequal "\
  263. ┌────────────────────────────────────────────────────┐
  264. │ Initial trie │
  265. └────────────────────────────────────────────────────┘
  266. ├── VeryLong
  267. │ ├── Word → VeryLongWord
  268. ├── Word → Word
  269. │ ├── -
  270. │ │ ├── _
  271. │ │ │ ├── 0 → Word-_0
  272. │ ├── 2 → Label
  273. ┌────────────────────────────────────────────────────┐
  274. │ Rebuilt trie │
  275. └────────────────────────────────────────────────────┘
  276. ├── Very
  277. │ ├── LongWord → VeryLongWord
  278. ├── Word → Word
  279. │ ├── -
  280. │ │ ├── _
  281. │ │ │ ├── 0 → Word-_0
  282. │ ├── 2 → Label
  283. ┌────────────────────────────────────────────────────┐
  284. │ Trie for words of length 4 │
  285. └────────────────────────────────────────────────────┘
  286. ├── Word → Word
  287. ┌────────────────────────────────────────────────────┐
  288. │ Trie for words of length 5 │
  289. └────────────────────────────────────────────────────┘
  290. ├── Word
  291. │ ├── 2 → Label
  292. ┌────────────────────────────────────────────────────┐
  293. │ Trie for words of length 7 │
  294. └────────────────────────────────────────────────────┘
  295. ├── Word
  296. │ ├── -
  297. │ │ ├── _
  298. │ │ │ ├── 0 → Word-_0
  299. ┌────────────────────────────────────────────────────┐
  300. │ Trie for words of length 12 │
  301. └────────────────────────────────────────────────────┘
  302. ├── VeryLong
  303. │ ├── Word → VeryLongWord" triehash -l tree /dev/stdin
  304. ###### CHANGE THE WORDS FOR THE FOLLOWING TESTS #######
  305. WORDS="Word"
  306. # Check that we are generating the proper multi-byte and fallback sessions
  307. testsuccessequal "#include \"/dev/null\"
  308. #ifdef __GNUC__
  309. typedef uint16_t __attribute__((aligned (1))) triehash_uu16;
  310. typedef char static_assert16[__alignof__(triehash_uu16) == 1 ? 1 : -1];
  311. typedef uint32_t __attribute__((aligned (1))) triehash_uu32;
  312. typedef char static_assert32[__alignof__(triehash_uu32) == 1 ? 1 : -1];
  313. typedef uint64_t __attribute__((aligned (1))) triehash_uu64;
  314. typedef char static_assert64[__alignof__(triehash_uu64) == 1 ? 1 : -1];
  315. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  316. #define onechar(c, s, l) (((uint64_t)(c)) << (s))
  317. #else
  318. #define onechar(c, s, l) (((uint64_t)(c)) << (l-8-s))
  319. #endif
  320. #if (!defined(__ARM_ARCH) || defined(__ARM_FEATURE_UNALIGNED)) && !defined(TRIE_HASH_NO_MULTI_BYTE)
  321. #define TRIE_HASH_MULTI_BYTE
  322. #endif
  323. #endif /*GNUC */
  324. #ifdef TRIE_HASH_MULTI_BYTE
  325. static enum PerfectKey PerfectHash4(const char *string)
  326. {
  327. switch(*((triehash_uu32*) &string[0])) {
  328. case 0| onechar('W', 0, 32)| onechar('o', 8, 32)| onechar('r', 16, 32)| onechar('d', 24, 32):
  329. return Word;
  330. }
  331. return Unknown;
  332. }
  333. #else
  334. static enum PerfectKey PerfectHash4(const char *string)
  335. {
  336. switch(string[0]) {
  337. case 'W':
  338. switch(string[1]) {
  339. case 'o':
  340. switch(string[2]) {
  341. case 'r':
  342. switch(string[3]) {
  343. case 'd':
  344. return Word;
  345. }
  346. }
  347. }
  348. }
  349. return Unknown;
  350. }
  351. #endif /* TRIE_HASH_MULTI_BYTE */
  352. enum PerfectKey PerfectHash(const char *string, size_t length)
  353. {
  354. switch (length) {
  355. case 4:
  356. return PerfectHash4(string);
  357. default:
  358. return Unknown;
  359. }
  360. }" triehash -H /dev/null /dev/stdin
  361. # Check that we are generating no multi-byte session
  362. testsuccessequal "#include \"/dev/null\"
  363. static enum PerfectKey PerfectHash4(const char *string)
  364. {
  365. switch(string[0]) {
  366. case 'W':
  367. switch(string[1]) {
  368. case 'o':
  369. switch(string[2]) {
  370. case 'r':
  371. switch(string[3]) {
  372. case 'd':
  373. return Word;
  374. }
  375. }
  376. }
  377. }
  378. return Unknown;
  379. }
  380. enum PerfectKey PerfectHash(const char *string, size_t length)
  381. {
  382. switch (length) {
  383. case 4:
  384. return PerfectHash4(string);
  385. default:
  386. return Unknown;
  387. }
  388. }" triehash --multi-byte=0 -H /dev/null /dev/stdin