diff options
Diffstat (limited to 'tnslc/vector.tnsl')
-rw-r--r-- | tnslc/vector.tnsl | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/tnslc/vector.tnsl b/tnslc/vector.tnsl new file mode 100644 index 0000000..9b89081 --- /dev/null +++ b/tnslc/vector.tnsl @@ -0,0 +1,87 @@ +# Define vector struct +struct Vector { + ~void data, + int + size, + count, + _elsz +} + +# Consts used in impl +int VECT_DEFAULT_SIZE = 4 +int VECT_MAX_GROW = 128 + +# Methods on the struct +/; method Vector + + # Initialize a new vector with elements + # 'elsz' bytes long + /; init (int elsz) + self.size = VECT_DEFAULT_SIZE + self._elsz = elsz + self.count = 0 + self.data = _alloc(elsz * VECT_DEFAULT_SIZE) + ;/ + + # Grow the size of the vector by 'size' elements + /; _grow (int size) + /; if (size > VECT_MAX_GROW) + size = VECT_MAX_GROW + ;/ + + self.size = self.size + size + self.data = _realloc(self.data, self.size * self._elsz) + ;/ + + # Shrink the size of the vector by 'size' elements + /; _shrink (int size) + /; if (self.size - size < 0) + self.size = 1 + ;; else + self.size = self.size - size + ;/ + + /; if (self.count < self.size) + self.count = self.size + ;/ + + self.data = _realloc(self.data, self.size * self._elsz) + ;/ + + # Push an element onto the end of the vector + /; push (~void data) + /; if (count == size - 1) + self._grow(self.size) + ;/ + + /; loop (int i = 0; i < self._elsz) [i++] + (self.data + i)` = (data + i)` + ;/ + + self.count++ + ;/ + + # Pop an element off of the end of the vector + /; pop + self.count-- + + /; if (self.count < self.size / 2) + self._shrink(self.size / 3) + ;/ + ;/ + + # Get a pointer to the start of an element in the vector + /; get (int index) [~void] + return self.data + ;/ + + # Free all memory associated with the vector + /; end + _delete(self.data) + self.size = 0 + self._elsz = 0 + self.count = 0 + ;/ + +;/ + |