Warp/src/Index/Util/Buffer/Dedicated.luau

125 lines
2.9 KiB
Lua
Raw Normal View History

2024-03-13 01:01:27 +00:00
--!strict
--!native
--!optimize 2
local DedicatedBuffer = {}
DedicatedBuffer.__index = DedicatedBuffer
local create = buffer.create
local copy = buffer.copy
2024-03-16 16:49:23 +00:00
local writei8 = buffer.writei8
local writei16 = buffer.writei16
local writei32 = buffer.writei32
2024-03-13 01:01:27 +00:00
local writeu8 = buffer.writeu8
2024-03-16 16:49:23 +00:00
local writeu16 = buffer.writeu16
local writeu32 = buffer.writeu32
local writef32 = buffer.writef32
local writef64 = buffer.writef64
local writestring = buffer.writestring
2024-03-13 01:01:27 +00:00
local default = {
point = 0,
2024-03-16 16:49:23 +00:00
next = 0,
size = 128,
bufferSize = 128,
2024-03-13 01:01:27 +00:00
}
2024-03-17 09:04:48 +00:00
function DedicatedBuffer.copy(self: any, offset: number, b: buffer?, src: buffer?, srcOffset: number?, count: number?)
if not b then
copy(create(count or default.size), offset, src or self.buffer, srcOffset, count)
else
copy(b, offset, src or self.buffer, srcOffset, count)
end
end
2024-03-13 01:01:27 +00:00
function DedicatedBuffer.alloc(self: any, byte: number)
local size: number = self.size
local b: buffer = self.buffer
while self.point + byte >= size do
size = math.floor(size * 1.5)
end
local newBuffer: buffer = create(size)
copy(newBuffer, 0, b)
b = newBuffer
2024-03-16 16:49:23 +00:00
self.point = self.next
self.next += byte
2024-03-13 01:01:27 +00:00
end
function DedicatedBuffer.build(self: any): buffer
local p: number = self.point
local build: buffer = create(p)
copy(build, 0, self.buffer, 0, p)
return build
end
2024-03-16 16:49:23 +00:00
function DedicatedBuffer.wi8(self: any, val: number)
DedicatedBuffer.alloc(self, 1)
writei8(self.buffer, self.point, val)
end
function DedicatedBuffer.wi16(self: any, val: number)
DedicatedBuffer.alloc(self, 2)
writei16(self.buffer, self.point, val)
end
function DedicatedBuffer.wi32(self: any, val: number)
DedicatedBuffer.alloc(self, 4)
writei32(self.buffer, self.point, val)
end
function DedicatedBuffer.wu8(self: any, val: number)
2024-03-13 01:01:27 +00:00
DedicatedBuffer.alloc(self, 1)
writeu8(self.buffer, self.point, val)
2024-03-16 16:49:23 +00:00
end
function DedicatedBuffer.wu16(self: any, val: number)
DedicatedBuffer.alloc(self, 2)
writeu16(self.buffer, self.point, val)
end
function DedicatedBuffer.wu32(self: any, val: number)
DedicatedBuffer.alloc(self, 4)
writeu32(self.buffer, self.point, val)
end
function DedicatedBuffer.wf32(self: any, val: number)
DedicatedBuffer.alloc(self, 4)
writef32(self.buffer, self.point, val)
end
function DedicatedBuffer.wf64(self: any, val: number)
DedicatedBuffer.alloc(self, 8)
writef64(self.buffer, self.point, val)
end
function DedicatedBuffer.wstring(self: any, val: string)
DedicatedBuffer.alloc(self, #val)
writestring(self.buffer, self.point, val)
2024-03-13 01:01:27 +00:00
end
function DedicatedBuffer.flush(self: any)
self.point = default.point
2024-03-16 16:49:23 +00:00
self.next = default.next
2024-03-13 01:01:27 +00:00
self.size = default.size
2024-03-16 16:49:23 +00:00
self.buffer = create(default.bufferSize)
2024-03-13 01:01:27 +00:00
end
function DedicatedBuffer.new()
return setmetatable({
point = default.point,
2024-03-16 16:49:23 +00:00
next = default.next,
2024-03-13 01:01:27 +00:00
size = default.size,
2024-03-16 16:49:23 +00:00
buffer = create(default.bufferSize)
2024-03-13 01:01:27 +00:00
}, DedicatedBuffer)
end
function DedicatedBuffer.remove(self: any)
self:flush()
setmetatable(self, nil)
end
return DedicatedBuffer.new :: typeof(DedicatedBuffer.new)