add static Lua-style functions: Bytearray.insert, Bytearray.remove, Bytearray.append
This commit is contained in:
parent
9169049530
commit
fb07c86ea6
@ -10,3 +10,6 @@ end
|
||||
for i, v in ipairs(arr) do
|
||||
assert(v == 10 - i)
|
||||
end
|
||||
|
||||
Bytearray.remove(arr, 2)
|
||||
assert(#arr == 9)
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user