summary refs log tree commit diff stats
path: root/lib/system/cellseqs_v1.nim
blob: 1a305aa428d62019c494864ed7cf351f19ad0f48 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#
#
#            Nim's Runtime Library
#        (c) Copyright 2019 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

# ------------------- cell seq handling ---------------------------------------

type
  PCellArray = ptr UncheckedArray[PCell]
  CellSeq {.final, pure.} = object
    len, cap: int
    d: PCellArray

proc contains(s: CellSeq, c: PCell): bool {.inline.} =
  for i in 0 ..< s.len:
    if s.d[i] == c:
      return true
  return false

proc resize(s: var CellSeq) =
  s.cap = s.cap * 3 div 2
  let d = cast[PCellArray](alloc(s.cap * sizeof(PCell)))
  copyMem(d, s.d, s.len * sizeof(PCell))
  dealloc(s.d)
  s.d = d

proc add(s: var CellSeq, c: PCell) {.inline.} =
  if s.len >= s.cap:
    resize(s)
  s.d[s.len] = c
  inc(s.len)

proc init(s: var CellSeq, cap: int = 1024) =
  s.len = 0
  s.cap = cap
  s.d = cast[PCellArray](alloc0(cap * sizeof(PCell)))

proc deinit(s: var CellSeq) =
  dealloc(s.d)
  s.d = nil
  s.len = 0
  s.cap = 0