discard """ output: '''1 2 3 4 5 6 89 90 90 0 0 1 0 1 2 0 2 3 1 0 4 1 1 5 1 2 6 1 3 7 after 6 6''' joinable: false """ import typetraits type myseq*[T] = object len, cap: int data: ptr UncheckedArray[T] # XXX make code memory safe for overflows in '*' var allocCount, deallocCount: int proc `=destroy`*[T](x: var myseq[T]) = if x.data != nil: when not supportsCopyMem(T): for i in 0..= x.cap: resize(x) result = addr(x.data[x.len]) inc x.len template add*[T](x: var myseq[T]; y: T) = reserveSlot(x)[] = y proc shrink*[T](x: var myseq[T]; newLen: int) = assert newLen <= x.len assert newLen >= 0 when not supportsCopyMem(T): for i in countdown(x.len - 1, newLen - 1): `=destroy`(x.data[i]) x.len = newLen proc grow*[T](x: var myseq[T]; newLen: int; value: T) = if newLen <= x.len: return assert newLen >= 0 if x.cap == 0: x.cap = newLen else: x.cap = max(newLen, (x.cap * 3) shr 1) if x.data == nil: inc allocCount x.data = cast[type(x.data)](realloc(x.data, x.cap * sizeof(T))) for i in x.len..