diff options
Diffstat (limited to 'examples/vec.ct')
| -rw-r--r-- | examples/vec.ct | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/examples/vec.ct b/examples/vec.ct new file mode 100644 index 0000000..f44fec0 --- /dev/null +++ b/examples/vec.ct @@ -0,0 +1,62 @@ +typedef vectorable { + std; + /* this would be needed for comparisons like find() or something */ + comparable; +} + +typedef vec (t vectorable) { + void std_vector; + len usize; + buf *t; +} + +pub define vec(t) { struct (vector[t]) } + +pub init(mut v *vector) +{ + v.len = 0; + v.buf = null; +} + +pub length(v *vec) usize { return v.len; } + +pub index(v *vec, i usize) *#(v.buf) +{ + assert(i < v.len, "index %zu out of bounds\n", i); + return &v.buf[i]; +} + +pub index(v *vec, i isize) *#v.buf +{ + if i < 0 { + assert(-i < v.len, "reverse index %zi out of bounds\n", i); + return &v.buf[v.len + i]; + } + + assert(i < v.len, "index %zi out of bounds\n", i); + return &v.buf[i]; +} + +pub prepend(mut *vec, e *#v.buf) { insert(v, e, 0uz); } +pub append(mut v *vec, e *#v.buf) { insert(v, e, v.len) } + +pub preplace(mut v *vec, e *#v.buf) { place(v, e, 0uz); } +pub applace(mut v *vec, e *#v.buf) { place(v, e, v.len - 1); } + +pub place(mut v *vec, e *#v.buf, i usize) +{ +} + +pub insert(mut v *vec, e *#v.buf, i usize) +{ +} + +pub deinit(mut v *vec) +{ + for i usize : v { + deinit(v[i]); + v[i] = null; + } + + dealloc(v.buf); +} |
