nondescript/types/ndstring.nim

29 lines
824 B
Nim

type
NdString* = ptr object
len: uint32
chars: UncheckedArray[char]
proc newString*(str: string): NdString =
let strlen = str.len()
let len = 4 + strlen
result = cast[NdString](alloc(len))
result.len = strlen.uint32
copyMem(result.chars[0].unsafeAddr, str[0].unsafeAddr, strlen)
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 free*(ndStr: var NdString) =
dealloc(ndStr)
proc hash*(ndStr: NdString): int =
var hash = 2166136261'u32
for i in countup(0, ndStr.len.int - 1):
hash = hash xor (ndStr.chars[i]).uint32
hash *= 16777619
return hash.int