Skip to content

Commit 724064b

Browse files
authored
Improve BitStream Methods
1 parent fdcd326 commit 724064b

File tree

3 files changed

+82
-152
lines changed

3 files changed

+82
-152
lines changed

src/SLNet/BitStream.lua

+80-150
Original file line numberDiff line numberDiff line change
@@ -1,159 +1,89 @@
1-
local BitStream = {}
2-
3-
BitStream.UINT8 = 0; BitStream.UINT16 = 1; BitStream.UINT32 = 2;
4-
BitStream.INT8 = 3; BitStream.INT16 = 4; BitStream.INT32 = 5;
5-
BitStream.FLOAT = 6; BitStream.BOOL = 7; BitStream.STRING = 8;
6-
7-
function BitStream:new(bytes)
8-
local bitStream =
9-
{
10-
WritePointer = 1,
11-
ReadPointer = 1,
12-
BytesData = '',
13-
BSCheckPoint = true
14-
}
15-
16-
if type(bytes) == 'string' then
17-
bitStream.BytesData = bytes
18-
bitStream.ReadPointer = #bytes + 1
19-
bitStream.WritePointer = #bytes + 1
20-
end
21-
22-
function bitStream:import(bytes)
23-
bytes = type(bytes) == 'string' and bytes or '\0'
24-
25-
local wpointer = bitStream.WritePointer
26-
local saveData = string.sub(bitStream.BytesData, wpointer, #bitStream.BytesData)
27-
bitStream.BytesData = string.sub(bitStream.BytesData, 0, wpointer - 1)
28-
bitStream.BytesData = bitStream.BytesData .. bytes .. saveData
29-
30-
return bitStream
31-
end
32-
function bitStream:export()
33-
return bitStream.BytesData
34-
end
35-
36-
function bitStream:setReadPointer(pos)
37-
pos = type(pos) == 'number' and pos or 1
38-
if pos < 1 then pos = 1 end
39-
bitStream.ReadPointer = pos
40-
return bitStream
41-
end
42-
function bitStream:setWritePointer(pos)
43-
pos = type(pos) == 'number' and pos or 1
44-
if pos < 1 then pos = 1 end
45-
bitStream.WritePointer = pos
46-
return bitStream
47-
end
1+
local sizes = {
2+
[UINT8] = 1, [UINT16] = 2, [UINT32] = 4,
3+
[INT8] = 1, [INT16] = 2, [INT32] = 4,
4+
[FLOAT] = 4, [BOOL] = 1
5+
}
6+
local function get_size(srcType)
7+
return sizes[srcType] or 0
8+
end
489

49-
function bitStream.getReadPointer()
50-
return bitStream.ReadPointer
51-
end
52-
function bitStream.getWritePointer()
53-
return bitStream.WritePointer
10+
local BSClass =
11+
{
12+
WritePointer = 1,
13+
ReadPointer = 1,
14+
BytesData = '',
15+
__tostring = function()
16+
return 'BitStream'
5417
end
55-
56-
function bitStream:write(srcType, src)
57-
local wpointer = bitStream.WritePointer
58-
local saveData = string.sub(bitStream.BytesData, wpointer, #bitStream.BytesData)
59-
bitStream.BytesData = string.sub(bitStream.BytesData, 0, wpointer - 1)
60-
61-
if srcType == BitStream.UINT8 then
62-
src = type(src) == 'number' and src or 0
63-
bitStream.BytesData = bitStream.BytesData
64-
.. BitCoder:encode(BitStream.UINT8, src)
65-
bitStream.WritePointer = bitStream.WritePointer + 1
66-
elseif srcType == BitStream.UINT16 then
67-
src = type(src) == 'number' and src or 0
68-
bitStream.BytesData = bitStream.BytesData
69-
.. BitCoder:encode(BitStream.UINT16, src)
70-
bitStream.WritePointer = bitStream.WritePointer + 2
71-
elseif srcType == BitStream.UINT32 then
72-
src = type(src) == 'number' and src or 0
73-
bitStream.BytesData = bitStream.BytesData
74-
.. BitCoder:encode(BitStream.UINT32, src)
75-
bitStream.WritePointer = bitStream.WritePointer + 4
76-
elseif srcType == BitStream.INT8 then
77-
src = type(src) == 'number' and src or 0
78-
bitStream.BytesData = bitStream.BytesData
79-
.. BitCoder:encode(BitStream.INT8, src)
80-
bitStream.WritePointer = bitStream.WritePointer + 1
81-
elseif srcType == BitStream.INT16 then
82-
src = type(src) == 'number' and src or 0
83-
bitStream.BytesData = bitStream.BytesData
84-
.. BitCoder:encode(BitStream.INT16, src)
85-
bitStream.WritePointer = bitStream.WritePointer + 2
86-
elseif srcType == BitStream.INT32 then
87-
src = type(src) == 'number' and src or 0
88-
bitStream.BytesData = bitStream.BytesData
89-
.. BitCoder:encode(BitStream.INT32, src)
90-
bitStream.WritePointer = bitStream.WritePointer + 4
91-
elseif srcType == BitStream.FLOAT then
92-
src = type(src) == 'number' and src or 0.0
93-
local res = BitCoder:encode(BitStream.FLOAT, src)
94-
bitStream.BytesData = bitStream.BytesData .. res
95-
bitStream.WritePointer = bitStream.WritePointer + #res
96-
elseif srcType == BitStream.BOOL then
97-
src = type(src) == 'boolean' and src or false
98-
bitStream.BytesData = bitStream.BytesData
99-
.. BitCoder:encode(BitStream.BOOL, src)
100-
bitStream.WritePointer = bitStream.WritePointer + 1
101-
elseif srcType == BitStream.STRING then
102-
src = type(src) == 'string' and src or '\0'
103-
bitStream.BytesData = bitStream.BytesData .. src
104-
bitStream.WritePointer = bitStream.WritePointer + #src
105-
end
106-
107-
bitStream.BytesData = bitStream.BytesData .. saveData
108-
return bitStream
18+
}
19+
20+
function BSClass:getReadPointer() return self.ReadPointer end
21+
function BSClass:getWritePointer() return self.WritePointer end
22+
function BSClass:export() return self.BytesData end
23+
function BSClass:import(bytes)
24+
bytes = type(bytes) == 'string' and bytes or '\0'
25+
local wpointer = self.WritePointer
26+
local saveData = string.sub(self.BytesData, wpointer, #self.BytesData)
27+
self.BytesData = string.sub(self.BytesData, 0, wpointer - 1)
28+
self.BytesData = self.BytesData .. bytes .. saveData
29+
return self
30+
end
31+
function BSClass:write(srcType, src)
32+
local wpointer = self.WritePointer
33+
local saveData = string.sub(self.BytesData, wpointer, #self.BytesData)
34+
self.BytesData = string.sub(self.BytesData, 0, wpointer - 1)
35+
if srcType >= UINT8 and srcType <= FLOAT then
36+
src = type(src) == 'number' and src or 0
37+
self.BytesData = self.BytesData
38+
.. BitCoder:encode(srcType, src)
39+
self.WritePointer = self.WritePointer + get_size(srcType)
40+
elseif srcType == BOOL then
41+
src = type(src) == 'boolean' and src or false
42+
self.BytesData = self.BytesData
43+
.. BitCoder:encode(srcType, src)
44+
self.WritePointer = self.WritePointer + get_size(srcType)
45+
elseif srcType == STRING then
46+
src = type(src) == 'string' and src or '\0'
47+
self.BytesData = self.BytesData .. src
48+
self.WritePointer = self.WritePointer + #src
10949
end
50+
self.BytesData = self.BytesData .. saveData
51+
return self
52+
end
53+
function BSClass:read(srcType, src)
54+
local part, rpointer = '', self.ReadPointer
55+
if srcType >= UINT8 and srcType <= BOOL then
56+
self.ReadPointer = self.ReadPointer + get_size(srcType)
57+
part = string.sub(self.BytesData, rpointer, self.ReadPointer - 1)
58+
elseif srcType == STRING then
59+
self.ReadPointer = self.ReadPointer + tonumber(src)
60+
part = string.sub(self.BytesData, rpointer, self.ReadPointer - 1)
61+
end; return BitCoder:decode(srcType, part)
62+
end
63+
function BSClass:setReadPointer(pos)
64+
pos = type(pos) == 'number' and pos or 1
65+
if pos < 1 then pos = 1 end
66+
self.ReadPointer = pos
67+
return self
68+
end
69+
function BSClass:setWritePointer(pos)
70+
pos = type(pos) == 'number' and pos or 1
71+
if pos < 1 then pos = 1 end
72+
self.WritePointer = pos
73+
return self
74+
end
11075

111-
function bitStream:read(srcType, src) -- for example, bitStream:read(BitStream.STRING, 15(string len))
112-
local rpointer = bitStream.ReadPointer
113-
114-
if srcType == BitStream.UINT8 then
115-
bitStream.ReadPointer = bitStream.ReadPointer + 1
116-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
117-
return BitCoder:decode(BitStream.UINT8, part)
118-
elseif srcType == BitStream.UINT16 then
119-
bitStream.ReadPointer = bitStream.ReadPointer + 2
120-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
121-
return BitCoder:decode(BitStream.UINT16, part)
122-
elseif srcType == BitStream.UINT32 then
123-
bitStream.ReadPointer = bitStream.ReadPointer + 4
124-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
125-
return BitCoder:decode(BitStream.UINT32, part)
126-
elseif srcType == BitStream.INT8 then
127-
bitStream.ReadPointer = bitStream.ReadPointer + 1
128-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
129-
return BitCoder:decode(BitStream.INT8, part)
130-
elseif srcType == BitStream.INT16 then
131-
bitStream.ReadPointer = bitStream.ReadPointer + 2
132-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
133-
return BitCoder:decode(BitStream.INT16, part)
134-
elseif srcType == BitStream.INT32 then
135-
bitStream.ReadPointer = bitStream.ReadPointer + 4
136-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
137-
return BitCoder:decode(BitStream.INT32, part)
138-
elseif srcType == BitStream.FLOAT then
139-
bitStream.ReadPointer = bitStream.ReadPointer + 4
140-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
141-
return BitCoder:decode(BitStream.FLOAT, part)
142-
elseif srcType == BitStream.BOOL then
143-
bitStream.ReadPointer = bitStream.ReadPointer + 1
144-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
145-
return BitCoder:decode(BitStream.BOOL, part)
146-
elseif srcType == BitStream.STRING then
147-
src = type(src) == 'number' and src or 1
148-
bitStream.ReadPointer = bitStream.ReadPointer + src
149-
local part = string.sub(bitStream.BytesData, rpointer, bitStream.ReadPointer - 1)
150-
return BitCoder:decode(BitStream.STRING, part)
151-
end
76+
BSClass.__index = BSClass
15277

153-
return 0
78+
local BitStream = {}
79+
function BitStream:new(bytes)
80+
local temp = {}
81+
if bytes then
82+
bytes = type(bytes) == 'string' and bytes or '\0'
83+
temp.BytesData = bytes
15484
end
155-
156-
return bitStream
85+
setmetatable(temp, BSClass)
86+
return temp
15787
end
15888

15989
return BitStream

src/SLNet/SLPeer/client.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function SLPeer.SLNetSend(handle, packetID, bitStream, priority)
1414
if not bitStream then
1515
bitStream = BitStream:new()
1616
end
17-
if not bitStream.BSCheckPoint then
17+
if tostring(bitStream) ~= 'BitStream' then
1818
error('SLPeer::SLNetSend: Argument #2: bitstream argument should be filled by SL:BitStream!')
1919
return false
2020
end

src/SLNet/SLPeer/server.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function SLPeer.SLNetSend(handle, packetID, bitStream, addr, port, priority)
1313
if not bitStream then
1414
bitStream = BitStream:new()
1515
end
16-
if not bitStream.BSCheckPoint then
16+
if tostring(bitStream) ~= 'BitStream' then
1717
error('SLPeer::SLNetSend: Argument #2: bitstream argument should be filled by SL:BitStream!')
1818
return false
1919
end

0 commit comments

Comments
 (0)