add static Lua-style functions: Bytearray.insert, Bytearray.remove, Bytearray.append

This commit is contained in:
MihailRis 2025-04-12 13:24:55 +03:00
parent 9169049530
commit fb07c86ea6
4 changed files with 73 additions and 51 deletions

View File

@ -10,3 +10,6 @@ end
for i, v in ipairs(arr) do
assert(v == 10 - i)
end
Bytearray.remove(arr, 2)
assert(#arr == 9)

View File

@ -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
}

View File

@ -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)

View File

@ -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<const char*>(bytes), size)
);