123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- #!/bin/sh
- . $(dirname $(readlink -f $0))/framework.sh
- # Check that building a single-byte trie works
- testsuccessequal "\
- ┌────────────────────────────────────────────────────┐
- │ Initial trie │
- └────────────────────────────────────────────────────┘
- ├── V
- │ ├── e
- │ │ ├── r
- │ │ │ ├── y
- │ │ │ │ ├── L
- │ │ │ │ │ ├── o
- │ │ │ │ │ │ ├── n
- │ │ │ │ │ │ │ ├── g
- │ │ │ │ │ │ │ │ ├── W
- │ │ │ │ │ │ │ │ │ ├── o
- │ │ │ │ │ │ │ │ │ │ ├── r
- │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Rebuilt trie │
- └────────────────────────────────────────────────────┘
- ├── V
- │ ├── e
- │ │ ├── r
- │ │ │ ├── y
- │ │ │ │ ├── L
- │ │ │ │ │ ├── o
- │ │ │ │ │ │ ├── n
- │ │ │ │ │ │ │ ├── g
- │ │ │ │ │ │ │ │ ├── W
- │ │ │ │ │ │ │ │ │ ├── o
- │ │ │ │ │ │ │ │ │ │ ├── r
- │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 4 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 5 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 7 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 12 │
- └────────────────────────────────────────────────────┘
- ├── V
- │ ├── e
- │ │ ├── r
- │ │ │ ├── y
- │ │ │ │ ├── L
- │ │ │ │ │ ├── o
- │ │ │ │ │ │ ├── n
- │ │ │ │ │ │ │ ├── g
- │ │ │ │ │ │ │ │ ├── W
- │ │ │ │ │ │ │ │ │ ├── o
- │ │ │ │ │ │ │ │ │ │ ├── r
- │ │ │ │ │ │ │ │ │ │ │ ├── d → VeryLongWord" triehash --multi-byte=0 -l tree /dev/stdin
- # Two byte optimization
- testsuccessequal "\
- ┌────────────────────────────────────────────────────┐
- │ Initial trie │
- └────────────────────────────────────────────────────┘
- ├── Ve
- │ ├── ry
- │ │ ├── Lo
- │ │ │ ├── ng
- │ │ │ │ ├── Wo
- │ │ │ │ │ ├── rd → VeryLongWord
- ├── Wo
- │ ├── rd → Word
- │ │ ├── -_
- │ │ │ ├── 0 → Word-_0
- │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Rebuilt trie │
- └────────────────────────────────────────────────────┘
- ├── Ve
- │ ├── ry
- │ │ ├── Lo
- │ │ │ ├── ng
- │ │ │ │ ├── Wo
- │ │ │ │ │ ├── rd → VeryLongWord
- ├── Wo
- │ ├── rd → Word
- │ │ ├── -
- │ │ │ ├── _0 → Word-_0
- │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 4 │
- └────────────────────────────────────────────────────┘
- ├── Wo
- │ ├── rd → Word
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 5 │
- └────────────────────────────────────────────────────┘
- ├── Wo
- │ ├── rd
- │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 7 │
- └────────────────────────────────────────────────────┘
- ├── Wo
- │ ├── rd
- │ │ ├── -_
- │ │ │ ├── 0 → Word-_0
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 12 │
- └────────────────────────────────────────────────────┘
- ├── Ve
- │ ├── ry
- │ │ ├── Lo
- │ │ │ ├── ng
- │ │ │ │ ├── Wo
- │ │ │ │ │ ├── rd → VeryLongWord" triehash --multi-byte=1 -l tree /dev/stdin
- # Four byte optimization
- testsuccessequal "\
- ┌────────────────────────────────────────────────────┐
- │ Initial trie │
- └────────────────────────────────────────────────────┘
- ├── Very
- │ ├── Long
- │ │ ├── Word → VeryLongWord
- ├── Word → Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Rebuilt trie │
- └────────────────────────────────────────────────────┘
- ├── Very
- │ ├── Long
- │ │ ├── Word → VeryLongWord
- ├── Word → Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 4 │
- └────────────────────────────────────────────────────┘
- ├── Word → Word
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 5 │
- └────────────────────────────────────────────────────┘
- ├── Word
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 7 │
- └────────────────────────────────────────────────────┘
- ├── Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 12 │
- └────────────────────────────────────────────────────┘
- ├── Very
- │ ├── Long
- │ │ ├── Word → VeryLongWord" triehash --multi-byte=2 -l tree /dev/stdin
- # Eigh byte optimization
- testsuccessequal "\
- ┌────────────────────────────────────────────────────┐
- │ Initial trie │
- └────────────────────────────────────────────────────┘
- ├── VeryLong
- │ ├── W
- │ │ ├── o
- │ │ │ ├── r
- │ │ │ │ ├── d → VeryLongWord
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Rebuilt trie │
- └────────────────────────────────────────────────────┘
- ├── V
- │ ├── eryLongW
- │ │ ├── o
- │ │ │ ├── r
- │ │ │ │ ├── d → VeryLongWord
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 4 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d → Word
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 5 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d
- │ │ │ │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 7 │
- └────────────────────────────────────────────────────┘
- ├── W
- │ ├── o
- │ │ ├── r
- │ │ │ ├── d
- │ │ │ │ ├── -
- │ │ │ │ │ ├── _
- │ │ │ │ │ │ ├── 0 → Word-_0
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 12 │
- └────────────────────────────────────────────────────┘
- ├── VeryLong
- │ ├── W
- │ │ ├── o
- │ │ │ ├── r
- │ │ │ │ ├── d → VeryLongWord" triehash --multi-byte=3 -l tree /dev/stdin
- # Check that building a multi-byte trie works
- testsuccessequal "\
- ┌────────────────────────────────────────────────────┐
- │ Initial trie │
- └────────────────────────────────────────────────────┘
- ├── VeryLong
- │ ├── Word → VeryLongWord
- ├── Word → Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Rebuilt trie │
- └────────────────────────────────────────────────────┘
- ├── Very
- │ ├── LongWord → VeryLongWord
- ├── Word → Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 4 │
- └────────────────────────────────────────────────────┘
- ├── Word → Word
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 5 │
- └────────────────────────────────────────────────────┘
- ├── Word
- │ ├── 2 → Label
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 7 │
- └────────────────────────────────────────────────────┘
- ├── Word
- │ ├── -
- │ │ ├── _
- │ │ │ ├── 0 → Word-_0
- ┌────────────────────────────────────────────────────┐
- │ Trie for words of length 12 │
- └────────────────────────────────────────────────────┘
- ├── VeryLong
- │ ├── Word → VeryLongWord" triehash -l tree /dev/stdin
- ###### CHANGE THE WORDS FOR THE FOLLOWING TESTS #######
- WORDS="Word"
- # Check that we are generating the proper multi-byte and fallback sessions
- testsuccessequal "#include \"/dev/null\"
- #ifdef __GNUC__
- typedef uint16_t __attribute__((aligned (1))) triehash_uu16;
- typedef char static_assert16[__alignof__(triehash_uu16) == 1 ? 1 : -1];
- typedef uint32_t __attribute__((aligned (1))) triehash_uu32;
- typedef char static_assert32[__alignof__(triehash_uu32) == 1 ? 1 : -1];
- typedef uint64_t __attribute__((aligned (1))) triehash_uu64;
- typedef char static_assert64[__alignof__(triehash_uu64) == 1 ? 1 : -1];
- #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- #define onechar(c, s, l) (((uint64_t)(c)) << (s))
- #else
- #define onechar(c, s, l) (((uint64_t)(c)) << (l-8-s))
- #endif
- #if (!defined(__ARM_ARCH) || defined(__ARM_FEATURE_UNALIGNED)) && !defined(TRIE_HASH_NO_MULTI_BYTE)
- #define TRIE_HASH_MULTI_BYTE
- #endif
- #endif /*GNUC */
- #ifdef TRIE_HASH_MULTI_BYTE
- static enum PerfectKey PerfectHash4(const char *string)
- {
- switch(*((triehash_uu32*) &string[0])) {
- case 0| onechar('W', 0, 32)| onechar('o', 8, 32)| onechar('r', 16, 32)| onechar('d', 24, 32):
- return Word;
- }
- return Unknown;
- }
- #else
- static enum PerfectKey PerfectHash4(const char *string)
- {
- switch(string[0]) {
- case 'W':
- switch(string[1]) {
- case 'o':
- switch(string[2]) {
- case 'r':
- switch(string[3]) {
- case 'd':
- return Word;
- }
- }
- }
- }
- return Unknown;
- }
- #endif /* TRIE_HASH_MULTI_BYTE */
- enum PerfectKey PerfectHash(const char *string, size_t length)
- {
- switch (length) {
- case 4:
- return PerfectHash4(string);
- default:
- return Unknown;
- }
- }" triehash -H /dev/null /dev/stdin
- # Check that we are generating no multi-byte session
- testsuccessequal "#include \"/dev/null\"
- static enum PerfectKey PerfectHash4(const char *string)
- {
- switch(string[0]) {
- case 'W':
- switch(string[1]) {
- case 'o':
- switch(string[2]) {
- case 'r':
- switch(string[3]) {
- case 'd':
- return Word;
- }
- }
- }
- }
- return Unknown;
- }
- enum PerfectKey PerfectHash(const char *string, size_t length)
- {
- switch (length) {
- case 4:
- return PerfectHash4(string);
- default:
- return Unknown;
- }
- }" triehash --multi-byte=0 -H /dev/null /dev/stdin
|