From 03f71498fc413e650f8f1a6010be741972c2d3d6 Mon Sep 17 00:00:00 2001 From: munna0908 <88337208+munna0908@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:44:18 +0530 Subject: [PATCH] feat: enhance encode/decode procs for multithreading support (#20) * update encode proc signature * add new decode proc * remove old encode/decode procs * fix tests --- leopard/leopard.nim | 35 ++++++------ tests/helpers.nim | 80 +++++++++++++++++--------- tests/testleopard.nim | 129 ++++++++++++++++++++++++++---------------- 3 files changed, 150 insertions(+), 94 deletions(-) diff --git a/leopard/leopard.nim b/leopard/leopard.nim index 615f7ad..71d23ee 100644 --- a/leopard/leopard.nim +++ b/leopard/leopard.nim @@ -48,8 +48,8 @@ type func encode*( self: var LeoEncoder, - data, - parity: var openArray[seq[byte]]): Result[void, cstring] = + data,parity: ptr UncheckedArray[ptr UncheckedArray[byte]], + dataLen,parityLen: int ): Result[void, cstring] = ## Encode a list of buffers in `data` into a number of `bufSize` sized ## `parity` buffers ## @@ -57,10 +57,10 @@ func encode*( ## `parity` - list of parity `buffers` of size `bufSize` ## - if data.len != self.buffers: + if dataLen != self.buffers: return err("Number of data buffers should match!") - if parity.len != self.parity: + if parityLen != self.parity: return err("Number of parity buffers should match!") # zero encode work buffer to avoid corrupting with previous run @@ -68,7 +68,7 @@ func encode*( zeroMem(self.workBufferPtr[i], self.bufSize) # copy data into aligned buffer - for i in 0.. 0: - copyMem(self.dataBufferPtr[i], addr data[i][0], self.bufSize) + for i in 0.. 0: + if i < parityLen and not parity[i].isNil: copyMem(self.workBufferPtr[i], addr parity[i][0], self.bufSize) parityPtr[i] = self.workBufferPtr[i] else: diff --git a/tests/helpers.nim b/tests/helpers.nim index 847e901..3b43899 100644 --- a/tests/helpers.nim +++ b/tests/helpers.nim @@ -24,22 +24,22 @@ proc randomCRCPacket*(data: var openArray[byte]) = copyMem(addr data[4], unsafeAddr crc, sizeof(crc)) -proc checkCRCPacket*(data: openArray[byte]): bool = - if data.len < 16: - for d in data[1..data.high]: - if d != data[0]: +proc checkCRCPacket*(data: ptr UncheckedArray[byte], len: int): bool = + if len < 16: + for i in 1.. 0: - dropRandomIdx(dataBuf, dataLosses) + dropRandomIdx(dataBuf,buffers, dataLosses) if parityLosses > 0: - dropRandomIdx(parityBuf, parityLosses) + dropRandomIdx(parityBuf,parity,parityLosses) - decoder.decode(dataBuf, parityBuf, recoveredBuf).tryGet() + decoder.decode(dataBuf, parityBuf, recoveredBuf,buffers,parity,buffers).tryGet() - for i, d in dataBuf: - if d.len <= 0: - if not checkCRCPacket(recoveredBuf[i]): + for i in 0..