mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Karsten Blees](/assets/img/avatar_default.png)
Interning short strings with high probability of duplicates can reduce the memory footprint and speed up comparisons. Add strintern() and memintern() APIs that use a hashmap to manage the pool of unique, interned strings. Note: strintern(getenv()) could be used to sanitize git's use of getenv(), in case we ever encounter a platform where a call to getenv() invalidates previous getenv() results (which is allowed by POSIX). Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
254 lines
3.6 KiB
Bash
Executable file
254 lines
3.6 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='test hashmap and string hash functions'
|
|
. ./test-lib.sh
|
|
|
|
test_hashmap() {
|
|
echo "$1" | test-hashmap $3 > actual &&
|
|
echo "$2" > expect &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
test_expect_success 'hash functions' '
|
|
|
|
test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" &&
|
|
test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" &&
|
|
test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" &&
|
|
test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727"
|
|
|
|
'
|
|
|
|
test_expect_success 'put' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
put foobarfrotz value4
|
|
size" "NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
64 4"
|
|
|
|
'
|
|
|
|
test_expect_success 'put (case insensitive)' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
size" "NULL
|
|
NULL
|
|
NULL
|
|
64 3" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'replace' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key1 value2
|
|
put fooBarFrotz value3
|
|
put fooBarFrotz value4
|
|
size" "NULL
|
|
value1
|
|
NULL
|
|
value3
|
|
64 2"
|
|
|
|
'
|
|
|
|
test_expect_success 'replace (case insensitive)' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put Key1 value2
|
|
put fooBarFrotz value3
|
|
put foobarfrotz value4
|
|
size" "NULL
|
|
value1
|
|
NULL
|
|
value3
|
|
64 2" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'get' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
put foobarfrotz value4
|
|
get key1
|
|
get key2
|
|
get fooBarFrotz
|
|
get notInMap" "NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
value1
|
|
value2
|
|
value3
|
|
NULL"
|
|
|
|
'
|
|
|
|
test_expect_success 'get (case insensitive)' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
get Key1
|
|
get keY2
|
|
get foobarfrotz
|
|
get notInMap" "NULL
|
|
NULL
|
|
NULL
|
|
value1
|
|
value2
|
|
value3
|
|
NULL" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'add' '
|
|
|
|
test_hashmap "add key1 value1
|
|
add key1 value2
|
|
add fooBarFrotz value3
|
|
add fooBarFrotz value4
|
|
get key1
|
|
get fooBarFrotz
|
|
get notInMap" "value2
|
|
value1
|
|
value4
|
|
value3
|
|
NULL"
|
|
|
|
'
|
|
|
|
test_expect_success 'add (case insensitive)' '
|
|
|
|
test_hashmap "add key1 value1
|
|
add Key1 value2
|
|
add fooBarFrotz value3
|
|
add foobarfrotz value4
|
|
get key1
|
|
get Foobarfrotz
|
|
get notInMap" "value2
|
|
value1
|
|
value4
|
|
value3
|
|
NULL" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'remove' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
remove key1
|
|
remove key2
|
|
remove notInMap
|
|
size" "NULL
|
|
NULL
|
|
NULL
|
|
value1
|
|
value2
|
|
NULL
|
|
64 1"
|
|
|
|
'
|
|
|
|
test_expect_success 'remove (case insensitive)' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
remove Key1
|
|
remove keY2
|
|
remove notInMap
|
|
size" "NULL
|
|
NULL
|
|
NULL
|
|
value1
|
|
value2
|
|
NULL
|
|
64 1" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'iterate' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
iterate" "NULL
|
|
NULL
|
|
NULL
|
|
key2 value2
|
|
key1 value1
|
|
fooBarFrotz value3"
|
|
|
|
'
|
|
|
|
test_expect_success 'iterate (case insensitive)' '
|
|
|
|
test_hashmap "put key1 value1
|
|
put key2 value2
|
|
put fooBarFrotz value3
|
|
iterate" "NULL
|
|
NULL
|
|
NULL
|
|
fooBarFrotz value3
|
|
key2 value2
|
|
key1 value1" ignorecase
|
|
|
|
'
|
|
|
|
test_expect_success 'grow / shrink' '
|
|
|
|
rm -f in &&
|
|
rm -f expect &&
|
|
for n in $(test_seq 51)
|
|
do
|
|
echo put key$n value$n >> in &&
|
|
echo NULL >> expect
|
|
done &&
|
|
echo size >> in &&
|
|
echo 64 51 >> expect &&
|
|
echo put key52 value52 >> in &&
|
|
echo NULL >> expect
|
|
echo size >> in &&
|
|
echo 256 52 >> expect &&
|
|
for n in $(test_seq 12)
|
|
do
|
|
echo remove key$n >> in &&
|
|
echo value$n >> expect
|
|
done &&
|
|
echo size >> in &&
|
|
echo 256 40 >> expect &&
|
|
echo remove key40 >> in &&
|
|
echo value40 >> expect &&
|
|
echo size >> in &&
|
|
echo 64 39 >> expect &&
|
|
cat in | test-hashmap > out &&
|
|
test_cmp expect out
|
|
|
|
'
|
|
|
|
test_expect_success 'string interning' '
|
|
|
|
test_hashmap "intern value1
|
|
intern Value1
|
|
intern value2
|
|
intern value2
|
|
" "value1
|
|
Value1
|
|
value2
|
|
value2"
|
|
|
|
'
|
|
|
|
test_done
|