2023-08-24 15:19:52 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-08-25 15:08:19 -07:00
|
|
|
# import std/atomics
|
|
|
|
|
import threading/smartptrs
|
2023-08-24 15:19:52 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
type
|
2023-08-25 15:08:19 -07:00
|
|
|
DataBufferHolder* = object
|
2023-08-24 15:19:52 -07:00
|
|
|
buf: ptr UncheckedArray[byte]
|
|
|
|
|
size: int
|
2023-08-24 15:51:25 -07:00
|
|
|
|
2023-08-25 15:08:19 -07:00
|
|
|
DataBuffer* = SharedPtr[DataBufferHolder]
|
2023-08-24 15:51:25 -07:00
|
|
|
KeyBuffer* = DataBuffer
|
|
|
|
|
ValueBuffer* = DataBuffer
|
2023-08-24 16:29:25 -07:00
|
|
|
StringBuffer* = DataBuffer
|
2023-08-24 17:33:32 -07:00
|
|
|
CatchableErrorBuffer* = object
|
|
|
|
|
msg: StringBuffer
|
2023-08-24 15:19:52 -07:00
|
|
|
|
2023-08-25 15:08:19 -07:00
|
|
|
proc `=destroy`*(x: var DataBufferHolder) =
|
2023-08-24 15:19:52 -07:00
|
|
|
## copy pointer implementation
|
2023-08-25 15:08:19 -07:00
|
|
|
if x.buf != nil:
|
|
|
|
|
when isMainModule or true:
|
|
|
|
|
echo "buffer: FREE: ", repr x.buf.pointer
|
|
|
|
|
deallocShared(x.buf)
|
2023-08-24 15:19:52 -07:00
|
|
|
|
2023-08-25 15:08:19 -07:00
|
|
|
proc len*(a: DataBuffer): int = a[].size
|
2023-08-24 15:25:15 -07:00
|
|
|
|
2023-08-24 15:19:52 -07:00
|
|
|
proc new*(tp: typedesc[DataBuffer], size: int = 0): DataBuffer =
|
2023-08-25 15:08:19 -07:00
|
|
|
newSharedPtr(DataBufferHolder(
|
|
|
|
|
buf: cast[typeof(result[].buf)](allocShared0(size)),
|
2023-08-24 15:19:52 -07:00
|
|
|
size: size,
|
2023-08-25 15:08:19 -07:00
|
|
|
))
|
2023-08-24 15:19:52 -07:00
|
|
|
|
|
|
|
|
proc new*[T: byte | char](tp: typedesc[DataBuffer], data: openArray[T]): DataBuffer =
|
|
|
|
|
## allocate new buffer and copies indata from openArray
|
|
|
|
|
##
|
|
|
|
|
result = DataBuffer.new(data.len)
|
|
|
|
|
if data.len() > 0:
|
2023-08-25 15:08:19 -07:00
|
|
|
copyMem(result[].buf, unsafeAddr data[0], data.len)
|
2023-08-24 16:29:25 -07:00
|
|
|
|
|
|
|
|
proc toSeq*[T: byte | char](a: DataBuffer, tp: typedesc[T]): seq[T] =
|
|
|
|
|
result = newSeq[T](a.len)
|
2023-08-25 15:08:19 -07:00
|
|
|
copyMem(addr result[0], unsafeAddr a[].buf[0], a.len)
|
2023-08-24 16:29:25 -07:00
|
|
|
|
2023-08-24 17:33:32 -07:00
|
|
|
proc toString*(data: DataBuffer): string =
|
2023-08-24 16:29:25 -07:00
|
|
|
result = newString(data.len())
|
|
|
|
|
if data.len() > 0:
|
2023-08-25 15:08:19 -07:00
|
|
|
copyMem(addr result[0], unsafeAddr data[].buf[0], data.len)
|
2023-08-24 17:33:32 -07:00
|
|
|
|
|
|
|
|
proc toCatchable*(data: CatchableErrorBuffer): ref CatchableError =
|
|
|
|
|
result = (ref CatchableError)(msg: data.msg.toString())
|
|
|
|
|
|
|
|
|
|
proc toBuffer*(err: ref Exception): CatchableErrorBuffer =
|
|
|
|
|
return CatchableErrorBuffer(
|
|
|
|
|
msg: StringBuffer.new(err.msg)
|
|
|
|
|
)
|