From 5aec138c3832a65bad4b2bdaa7ca36cf5c279ac8 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 11 Feb 2023 09:53:00 -0800 Subject: Avoid copies when writing to buffer. --- buffer.sml | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/buffer.sml b/buffer.sml index 03292bb..19cd99a 100644 --- a/buffer.sml +++ b/buffer.sml @@ -1,20 +1,20 @@ structure Buffer = struct - fun append (a : Word8ArraySlice.slice) (b : Word8VectorSlice.slice) : Word8ArraySlice.slice = + fun append (a : Word8ArraySlice.slice) (b : Word8ArraySlice.slice) : Word8ArraySlice.slice = let - val bLen = Word8VectorSlice.length b + val bLen = Word8ArraySlice.length b val (base, i, aLen) = Word8ArraySlice.base a val baseLen = Word8Array.length base in if i + aLen + bLen <= baseLen then - (Word8ArraySlice.copyVec { src = b, dst = base, di = i + aLen } ; + (Word8ArraySlice.copy { src = b, dst = base, di = i + aLen } ; Word8ArraySlice.slice (base, i, SOME (aLen + bLen))) else let val newBuf = Word8Array.array (baseLen * 2 + bLen, Word8.fromInt 0) in Word8ArraySlice.copy { src = a, dst = newBuf, di = 0 } ; - Word8ArraySlice.copyVec { src = b, dst = newBuf, di = aLen } ; + Word8ArraySlice.copy { src = b, dst = newBuf, di = aLen } ; Word8ArraySlice.slice (newBuf, 0, SOME (aLen + bLen)) end end @@ -24,27 +24,26 @@ struct in (BinIO.mkOutstream (BinIO.StreamIO.mkOutstream - (BinPrimIO.augmentWriter - (BinPrimIO.WR - { name = "buffer" - , chunkSize = 1 - , writeVec = - SOME - (fn a => - (buffer := append (!buffer) a ; - Word8VectorSlice.length a)) - , writeArr = NONE - , writeVecNB = NONE - , writeArrNB = NONE - , block = SOME (fn () => ()) - , canOutput = SOME (fn () => true) - , getPos = NONE - , setPos = NONE - , endPos = NONE - , verifyPos = NONE - , close = fn () => () - , ioDesc = NONE - }), + (BinPrimIO.WR + { name = "buffer" + , chunkSize = 1 + , writeVec = NONE + , writeArr = + SOME + (fn a => + (buffer := append (!buffer) a ; + Word8ArraySlice.length a)) + , writeVecNB = NONE + , writeArrNB = NONE + , block = NONE + , canOutput = NONE + , getPos = NONE + , setPos = NONE + , endPos = NONE + , verifyPos = NONE + , close = fn () => () + , ioDesc = NONE + }, IO.NO_BUF)), buffer) end -- cgit v1.3.1