diff --git a/dev/tests/bytearray.lua b/dev/tests/bytearray.lua index 7b407cba..1a12bdeb 100644 --- a/dev/tests/bytearray.lua +++ b/dev/tests/bytearray.lua @@ -22,3 +22,6 @@ assert(#arr == 13) for i=1,10 do assert(arr[i] == 10 - i) end +print(#arr, arr:get_capacity()) +arr:trim() +assert(#arr == arr:get_capacity()) diff --git a/res/modules/internal/bytearray.lua b/res/modules/internal/bytearray.lua index e319751b..2481c4dd 100644 --- a/res/modules/internal/bytearray.lua +++ b/res/modules/internal/bytearray.lua @@ -24,6 +24,18 @@ local function grow_buffer(self, elems) free(prev) end +local function trim_buffer(self) + if self.size == self.capacity then + return + end + local size = self.size + local prev = self.bytes + self.bytes = malloc(size) + FFI.copy(self.bytes, prev, self.size) + self.capacity = size + free(prev) +end + local function count_elements(b) local elems = 1 if _type(b) ~= "number" then @@ -88,23 +100,33 @@ local function remove(self, index, elems) self.size = self.size - elems end +local function clear(self) + self.size = 0 +end + +local function reserve(self, new_capacity) + if new_capacity <= self.capacity then + return + end + local prev = self.bytes + self.bytes = malloc(new_capacity) + FFI.copy(self.bytes, prev, self.size) + self.capacity = new_capacity + free(prev) +end + +local function get_capacity(self) + return self.capacity +end + local bytearray_methods = { append=append, insert=insert, remove=remove, - clear=function(self) - self.size = 0 - end, - reserve=function(self, new_capacity) - if new_capacity <= self.capacity then - return - end - local prev = self.bytes - self.bytes = malloc(new_capacity) - FFI.copy(self.bytes, prev, self.size) - self.capacity = new_capacity - free(prev) - end, + trim=trim_buffer, + clear=clear, + reserve=reserve, + get_capacity=get_capacity, } local bytearray_mt = { @@ -172,6 +194,10 @@ local FFIBytearray = { append = append, insert = insert, remove = remove, + trim = trim_buffer, + clear = clear, + reserve = reserve, + get_capacity = get_capacity, } local function FFIBytearray_as_string(bytes)