From c4d721381242aa564cdde7b7e37998a2007fe1ca Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 30 Jul 2025 20:20:26 +0200 Subject: [PATCH 1/2] add `sink` overload for memory input In many cases where a temporary `seq` is involved, this is no less efficient than `unsafeMemoryInput` but certainly more safe. Unfortunately, this convenience cannot easily be extended to `write` and friends due to the lack of [sink overloading](https://github.com/nim-lang/Nim/issues/25081). --- faststreams/inputs.nim | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/faststreams/inputs.nim b/faststreams/inputs.nim index e331520..441ffc7 100644 --- a/faststreams/inputs.nim +++ b/faststreams/inputs.nim @@ -469,7 +469,7 @@ func unsafeMemoryInput*(mem: openArray[byte]): InputStreamHandle = endAddr: offset(head, mem.len)), spanEndPos: mem.len) -func unsafeMemoryInput*(str: string): InputStreamHandle = +func unsafeMemoryInput*(str: openArray[char]): InputStreamHandle = unsafeMemoryInput str.toOpenArrayByte(0, str.len - 1) proc len*(s: InputStream): Option[Natural] {.raises: [IOError].} = @@ -487,19 +487,30 @@ when fsAsyncSupport: func memoryInput*(buffers: PageBuffers): InputStreamHandle = makeHandle InputStream(buffers: buffers) -func memoryInput*(data: openArray[byte]): InputStreamHandle = - let stream = if data.len > 0: - let buffers = PageBuffers.init(data.len) - buffers.write(data) +func memoryInput*(data: sink seq[byte]): InputStreamHandle = + let len = data.len + let stream = + if len > 0: + let store = new seq[byte] + store[] = move(data) - InputStream(buffers: buffers) - else: - InputStream() + let page = PageRef.init(store, 0) + page.commit(len) + + let buffers = PageBuffers.init(len) + buffers.queue.addLast page + + InputStream(buffers: buffers) + else: + InputStream() makeHandle stream +func memoryInput*(data: openArray[byte]): InputStreamHandle = + memoryInput(@data) + func memoryInput*(data: openArray[char]): InputStreamHandle = - memoryInput data.toOpenArrayByte(0, data.high()) + memoryInput(@data.toOpenArrayByte(0, data.high())) func resetBuffers*(s: InputStream, buffers: PageBuffers) = # This should be used only on safe memory input streams From c7ea010a2da6bb1312e43bc1f2c389b104aee817 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Thu, 31 Jul 2025 10:56:52 +0200 Subject: [PATCH 2/2] fmt --- faststreams/inputs.nim | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/faststreams/inputs.nim b/faststreams/inputs.nim index 441ffc7..8a26356 100644 --- a/faststreams/inputs.nim +++ b/faststreams/inputs.nim @@ -488,21 +488,22 @@ func memoryInput*(buffers: PageBuffers): InputStreamHandle = makeHandle InputStream(buffers: buffers) func memoryInput*(data: sink seq[byte]): InputStreamHandle = - let len = data.len - let stream = - if len > 0: - let store = new seq[byte] - store[] = move(data) + let + len = data.len + stream = + if len > 0: + let store = new seq[byte] + store[] = move(data) - let page = PageRef.init(store, 0) - page.commit(len) + let page = PageRef.init(store, 0) + page.commit(len) - let buffers = PageBuffers.init(len) - buffers.queue.addLast page + let buffers = PageBuffers.init(len) + buffers.queue.addLast page - InputStream(buffers: buffers) - else: - InputStream() + InputStream(buffers: buffers) + else: + InputStream() makeHandle stream