netkit/buffer/vector

本模块实现了一个可增长的缓冲区 VectorBuffer 。该缓冲区可以根据需要成倍增长,直到某个临界值。当到达 临界值时,继续增长将引起异常。

Types

VectorBuffer = object of RootObj
  value: seq[byte]
  endPos: Natural
  capacity: Natural
  minCapacity: Natural
  maxCapacity: Natural
一个可增长的缓冲区。   Source Edit

Procs

proc initVectorBuffer(minCapacity: Natural = BufferSize;
                     maxCapacity: Natural = BufferSize * 8): VectorBuffer {...}{.raises: [],
    tags: [].}
初始化一个 VectorBuffer` 。 ``minCapacity 指定最小容量,``maxCapacity`` 指定最大容量。   Source Edit
proc capacity(b: VectorBuffer): Natural {...}{.raises: [], tags: [].}
返回缓冲区的当前容量。   Source Edit
proc minCapacity(b: VectorBuffer): Natural {...}{.raises: [], tags: [].}
返回缓冲区的最小容量。   Source Edit
proc maxCapacity(b: VectorBuffer): Natural {...}{.raises: [], tags: [].}
返回缓冲区的最大容量。   Source Edit
proc len(b: VectorBuffer): Natural {...}{.raises: [], tags: [].}
返回缓冲区存储的数据长度。   Source Edit
proc reset(b: var VectorBuffer): Natural {...}{.raises: [], tags: [].}
重置缓冲区,恢复到初始容量,同时清空所有已存储的数据。   Source Edit
proc expand(b: var VectorBuffer) {...}{.raises: [OverflowError], tags: [].}
扩展缓冲区的容量,使其增长一倍。如果超过了最大容量,则抛出 OverflowError 。   Source Edit
proc next(b: var VectorBuffer): (pointer, Natural) {...}{.raises: [], tags: [].}

返回下一个安全的可存储区域。返回值包括可存储区域的地址和长度。

例子:

var source = "Hello World"
var (regionPtr, regionLen) = buffer.next()
var length = min(regionLen, s.len)
copyMem(regionPtr, source.cstring, length) 
  Source Edit
proc pack(b: var VectorBuffer; size: Natural): Natural {...}{.raises: [], tags: [].}

告诉缓冲区,由当前存储位置向后 size 长度的字节晋升为数据。返回实际晋升的长度。

当调用 next() 时,仅仅向缓冲区内部的存储空间写入数据,但是缓冲区无法得知写入了多少数据。 pack() 告诉缓冲区写入的数据长度。

每当调用 next() 时,都应当立刻调用 pack()

例子:

var source = "Hello World"
var (regionPtr, regionLen) = buffer.next()
var length = min(regionLen, s.len)
copyMem(regionPtr, source.cstring, length)
var n = buffer.pack(length)
  Source Edit
proc add(b: var VectorBuffer; source: pointer; size: Natural): Natural {...}{.raises: [],
    tags: [].}

source 复制最多 size 长度的数据,存储到缓冲区。返回实际存储的长度。这个函数是 next() pack() 组合调用的简化版本,区别是额外执行一次复制。

当您非常看重性能时,使用 next pack 组合调用;当您比较看重使用方便时,使用 add

var source = "Hello World"
var n = buffer.add(source.cstring, source.len)
  Source Edit
proc get(b: var VectorBuffer; dest: pointer; size: Natural; start: Natural): Natural {...}{.
    raises: [], tags: [].}
start 开始,获取最多 size 长度的数据,将它们复制到目标空间 dest ,返回实际复制的数量。   Source Edit
proc clear(b: var VectorBuffer): Natural {...}{.raises: [], tags: [].}
删除所有已存储的数据。   Source Edit