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