unite stringutils and ndstring
This commit is contained in:
parent
159f256a84
commit
20022c405a
|
@ -1,7 +1,5 @@
|
|||
# The hash table implementation for string interning and globals
|
||||
|
||||
import ndstring
|
||||
|
||||
import bitops
|
||||
|
||||
const tableMaxLoad = 0.75
|
||||
|
@ -116,7 +114,7 @@ proc tableGet*[U, V](tbl: Table[U, V], key: U, val: var V): bool =
|
|||
val = entry[].value
|
||||
return true
|
||||
|
||||
proc tableFindString*(tbl: Table[NdString, NdString], chars: ptr char, len: int, hash: int): NdString =
|
||||
proc tableFindString*[U, V](tbl: Table[U, V], chars: ptr char, len: int, hash: int): U =
|
||||
if tbl.count == 0:
|
||||
return nil
|
||||
var index = hash.bitand(tbl.cap - 1)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import hashtable
|
||||
|
||||
type
|
||||
NdString* = ptr object
|
||||
|
@ -17,7 +18,52 @@ proc fnv1a*(ndStr: NdString): int =
|
|||
hash *= 16777619
|
||||
return hash.int
|
||||
|
||||
proc fnv1a*(str: string): int =
|
||||
var hash = 2166136261'u32
|
||||
for i in countup(0, str.len - 1):
|
||||
hash = hash xor (str[i]).uint32
|
||||
hash *= 16777619
|
||||
return hash.int
|
||||
|
||||
|
||||
# equals
|
||||
|
||||
proc equal*(left, right: NdString): bool =
|
||||
left == right
|
||||
|
||||
var ndStrings = newTable[NdString, NdString]()
|
||||
|
||||
proc newString*(str: string): NdString =
|
||||
let strlen = str.len()
|
||||
let hash = str.fnv1a()
|
||||
|
||||
let interned = ndStrings.tableFindString(str[0].unsafeAddr, strlen, hash)
|
||||
if interned != nil:
|
||||
return interned
|
||||
|
||||
let len = 8 + strlen
|
||||
result = cast[NdString](alloc(len))
|
||||
result.len = strlen.uint32
|
||||
result.hash = hash.uint32
|
||||
copyMem(result.chars[0].unsafeAddr, str[0].unsafeAddr, strlen)
|
||||
|
||||
discard ndStrings.tableSet(result, nil)
|
||||
|
||||
proc resetInternedStrings* =
|
||||
ndStrings.free()
|
||||
ndStrings = newTable[NdString, NdString]()
|
||||
|
||||
proc `$`*(ndStr: NdString): string =
|
||||
result = newString(ndStr.len.int)
|
||||
copyMem(result[0].unsafeAddr, ndStr.chars[0].unsafeAddr, ndStr.len.int)
|
||||
|
||||
proc `&`*(left, right: NdString): NdString =
|
||||
# TODO optimize this later when strings will be benchmarked
|
||||
newString($left & $right)
|
||||
|
||||
proc getLength*(ndStr: NdString): int =
|
||||
ndStr.len.int
|
||||
|
||||
proc getIndex*(ndStr: NdString, index: int): NdString =
|
||||
# TODO optimize this later
|
||||
newString($($ndStr)[index])
|
|
@ -1,47 +0,0 @@
|
|||
import hashtable
|
||||
import ndstring
|
||||
|
||||
# string extension, NOTE identical implementation in ndstring.nim
|
||||
proc fnv1a*(str: string): int =
|
||||
var hash = 2166136261'u32
|
||||
for i in countup(0, str.len - 1):
|
||||
hash = hash xor (str[i]).uint32
|
||||
hash *= 16777619
|
||||
return hash.int
|
||||
|
||||
var ndStrings = newTable[NdString, NdString]()
|
||||
|
||||
proc newString*(str: string): NdString =
|
||||
let strlen = str.len()
|
||||
let hash = str.fnv1a()
|
||||
|
||||
let interned = ndStrings.tableFindString(str[0].unsafeAddr, strlen, hash)
|
||||
if interned != nil:
|
||||
return interned
|
||||
|
||||
let len = 8 + strlen
|
||||
result = cast[NdString](alloc(len))
|
||||
result.len = strlen.uint32
|
||||
result.hash = hash.uint32
|
||||
copyMem(result.chars[0].unsafeAddr, str[0].unsafeAddr, strlen)
|
||||
|
||||
discard ndStrings.tableSet(result, nil)
|
||||
|
||||
proc resetInternedStrings* =
|
||||
ndStrings.free()
|
||||
ndStrings = newTable[NdString, NdString]()
|
||||
|
||||
proc `$`*(ndStr: NdString): string =
|
||||
result = newString(ndStr.len.int)
|
||||
copyMem(result[0].unsafeAddr, ndStr.chars[0].unsafeAddr, ndStr.len.int)
|
||||
|
||||
proc `&`*(left, right: NdString): NdString =
|
||||
# TODO optimize this later when strings will be benchmarked
|
||||
newString($left & $right)
|
||||
|
||||
proc getLength*(ndStr: NdString): int =
|
||||
ndStr.len.int
|
||||
|
||||
proc getIndex*(ndStr: NdString, index: int): NdString =
|
||||
# TODO optimize this later
|
||||
newString($($ndStr)[index])
|
|
@ -2,7 +2,6 @@ import strformat
|
|||
import bitops
|
||||
|
||||
import ndstring
|
||||
import stringutils
|
||||
import ndlist
|
||||
import hashtable
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@ import pointerutils
|
|||
|
||||
import types/stack
|
||||
import types/ndstring
|
||||
import types/stringutils
|
||||
import bitops # needed for value's templates
|
||||
import types/value
|
||||
import types/hashtable
|
||||
|
|
Loading…
Reference in New Issue