diff --git a/dev/tests/bytearray.lua b/dev/tests/bytearray.lua index e20d4318..79d8a89b 100644 --- a/dev/tests/bytearray.lua +++ b/dev/tests/bytearray.lua @@ -10,3 +10,6 @@ end for i, v in ipairs(arr) do assert(v == 10 - i) end + +Bytearray.remove(arr, 2) +assert(#arr == 9) diff --git a/res/modules/internal/bytearray.lua b/res/modules/internal/bytearray.lua index 03a2578d..fabfaee7 100644 --- a/res/modules/internal/bytearray.lua +++ b/res/modules/internal/bytearray.lua @@ -47,37 +47,50 @@ local function append(self, b) self.size = self.size + elems end +local function insert(self, index, b) + if index == nil then + index = self.size + 1 + end + if index <= 0 or index > self.size + 1 then + return + end + local elems = count_elements(b) + if self.size + elems > self.capacity then + grow_buffer(self, elems) + end + for i=self.size, index - 1, -1 do + self.bytes[i + elems] = self.bytes[i] + end + if _type(b) == "number" then + self.bytes[index - 1] = b + else + for i=1, #b do + self.bytes[index + i - 2] = b[i] + end + end + self.size = self.size + elems +end + +local function remove(self, index, elems) + if index <= 0 or index > self.size then + return + end + if elems == nil then + elems = 1 + end + if index + elems > self.size then + elems = self.size - index + 1 + end + for i=index, self.size - elems do + self.bytes[i] = self.bytes[i + elems] + end + self.size = self.size - elems +end + local bytearray_methods = { append=append, - insert=function(self, index, b) - local elems = count_elements(b) - if self.size + elems >= self.capacity then - grow_buffer(self, elems) - end - if _type(b) == "number" then - self.bytes[index] = b - else - for i=1, #b do - self.bytes[index + i - 1] = b[i] - end - end - self.size = self.size + elems - end, - remove=function(self, index, elems) - if index <= 0 or index > self.size then - return - end - if elems == nil then - elems = 1 - end - if index + elems > self.size then - elems = self.size - index + 1 - end - for i=index, self.size - elems do - self.bytes[i] = self.bytes[i + elems] - end - self.size = self.size - elems - end, + insert=insert, + remove=remove, clear=function(self) self.size = 0 end, @@ -133,27 +146,32 @@ local bytearray_mt = { local bytearray_type = FFI.metatype("bytearray_t", bytearray_mt) -local function FFIBytearray (n) - local t = type(n) - if t == "string" then - local buffer = malloc(#n) - FFI.copy(buffer, n, #n) - return bytearray_type(buffer, #n, #n) - elseif t == "table" then - local capacity = math.max(#n, MIN_CAPACITY) - local buffer = malloc(capacity) - for i=1,#n do - buffer[i - 1] = n[i] +local FFIBytearray = { + __call = function (n) + local t = type(n) + if t == "string" then + local buffer = malloc(#n) + FFI.copy(buffer, n, #n) + return bytearray_type(buffer, #n, #n) + elseif t == "table" then + local capacity = math.max(#n, MIN_CAPACITY) + local buffer = malloc(capacity) + for i=1,#n do + buffer[i - 1] = n[i] + end + return bytearray_type(buffer, #n, capacity) end - return bytearray_type(buffer, #n, capacity) - end - n = n or 0 - if n < MIN_CAPACITY then - return bytearray_type(malloc(MIN_CAPACITY), n, MIN_CAPACITY) - else - return bytearray_type(malloc(n), n, n) - end -end + n = n or 0 + if n < MIN_CAPACITY then + return bytearray_type(malloc(MIN_CAPACITY), n, MIN_CAPACITY) + else + return bytearray_type(malloc(n), n, n) + end + end, + append = append, + insert = insert, + remove = remove, +} local function FFIBytearray_as_string(bytes) local t = type(bytes) @@ -171,6 +189,6 @@ local function FFIBytearray_as_string(bytes) end return { - FFIBytearray = FFIBytearray, + FFIBytearray = setmetatable(FFIBytearray, FFIBytearray), FFIBytearray_as_string = FFIBytearray_as_string } diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 558ba0f2..5fa9ca29 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -266,6 +266,7 @@ end local bytearray = require "core:internal/bytearray" Bytearray = bytearray.FFIBytearray Bytearray_as_string = bytearray.FFIBytearray_as_string +Bytearray_construct = Bytearray.__call ffi = nil math.randomseed(time.uptime() * 1536227939) diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index ba0cd3d7..7d545d49 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -747,7 +747,7 @@ namespace lua { } inline int create_bytearray(lua::State* L, const void* bytes, size_t size) { - lua::requireglobal(L, "Bytearray"); + lua::requireglobal(L, "Bytearray_construct"); lua::pushlstring( L, std::string_view(reinterpret_cast(bytes), size) );