Coverage for /home/runner/work/zserio/zserio/compiler/extensions/python/runtime/src/zserio/bitsizeof.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2024-12-05 10:43 +0000

1""" 

2The module provides help methods to calculate size of nontrivial types. 

3""" 

4 

5import typing 

6 

7from zserio.bitbuffer import BitBuffer 

8from zserio.exception import PythonRuntimeException 

9from zserio.limits import INT64_MIN 

10 

11 

12def bitsizeof_varint16(value: int) -> int: 

13 """ 

14 Gets bit size of variable 16-bit signed integer value. 

15 

16 :param value: Value to use for bit size calculation. 

17 :returns: Bit size of the value. 

18 :raises PythonRuntimeException: Throws if given value is out of range for varint16 type. 

19 """ 

20 

21 return _bitsizeof_varnum(abs(value), VARINT16_MAX_VALUES, "varint16") 

22 

23 

24def bitsizeof_varint32(value: int) -> int: 

25 """ 

26 Gets bit size of variable 32-bit signed integer value. 

27 

28 :param value: Value to use for bit size calculation. 

29 :returns: Bit size of the value. 

30 :raises PythonRuntimeException: Throws if given value is out of range for varint32 type. 

31 """ 

32 

33 return _bitsizeof_varnum(abs(value), VARINT32_MAX_VALUES, "varint32") 

34 

35 

36def bitsizeof_varint64(value: int) -> int: 

37 """ 

38 Gets bit size of variable 64-bit signed integer value. 

39 

40 :param value: Value to use for bit size calculation. 

41 :returns: Bit size of the value. 

42 :raises PythonRuntimeException: Throws if given value is out of range for varint64 type. 

43 """ 

44 

45 return _bitsizeof_varnum(abs(value), VARINT64_MAX_VALUES, "varint64") 

46 

47 

48def bitsizeof_varint(value: int) -> int: 

49 """ 

50 Gets bit size of variable signed integer value (up to 9 bytes). 

51 

52 :param value: Value to use for bit size calculation. 

53 :returns: Bit size of the value. 

54 :raises PythonRuntimeException: Throws if given value is out of range for varint type. 

55 """ 

56 

57 if value == INT64_MIN: 

58 return 8 # INT64_MIN is stored as -0 

59 return _bitsizeof_varnum(abs(value), VARINT_MAX_VALUES, "varint") 

60 

61 

62def bitsizeof_varuint16(value: int) -> int: 

63 """ 

64 Gets bit size of variable 16-bit unsigned integer value. 

65 

66 :param value: Value to use for bit size calculation. 

67 :returns: Bit size of the value. 

68 :raises PythonRuntimeException: Throws if given value is out of range for varuint16 type. 

69 """ 

70 

71 return _bitsizeof_varnum(value, VARUINT16_MAX_VALUES, "varuint16") 

72 

73 

74def bitsizeof_varuint32(value: int) -> int: 

75 """ 

76 Gets bit size of variable 32-bit unsigned integer value. 

77 

78 :param value: Value to use for bit size calculation. 

79 :returns: Bit size of the value. 

80 :raises PythonRuntimeException: Throws if given value is out of range for varuint32 type. 

81 """ 

82 

83 return _bitsizeof_varnum(value, VARUINT32_MAX_VALUES, "varuint32") 

84 

85 

86def bitsizeof_varuint64(value: int) -> int: 

87 """ 

88 Gets bit size of variable 64-bit unsigned integer value. 

89 

90 :param value: Value to use for bit size calculation. 

91 :returns: Bit size of the value. 

92 :raises PythonRuntimeException: Throws if given value is out of range for varuint64 type. 

93 """ 

94 

95 return _bitsizeof_varnum(value, VARUINT64_MAX_VALUES, "varuint64") 

96 

97 

98def bitsizeof_varuint(value: int) -> int: 

99 """ 

100 Gets bit size of variable unsigned integer value (up to 9 bytes). 

101 

102 :param value: Value to use for bit size calculation. 

103 :returns: Bit size of the value. 

104 :raises PythonRuntimeException: Throws if given value is out of range for varuint type. 

105 """ 

106 

107 return _bitsizeof_varnum(value, VARUINT_MAX_VALUES, "varuint") 

108 

109 

110def bitsizeof_varsize(value: int) -> int: 

111 """ 

112 Gets bit size of variable size integer value. 

113 

114 :param value: Value to use for bit size calculation. 

115 :returns: Bit size of the value. 

116 :raises PythonRuntimeException: Throws if given value is out of range for varsize type. 

117 """ 

118 

119 return _bitsizeof_varnum(value, VARSIZE_MAX_VALUES, "varsize") 

120 

121 

122def bitsizeof_bytes(value: bytearray) -> int: 

123 """ 

124 Gets bit size of bytes. 

125 

126 :param value: Bytes value to use for bit size calculation. 

127 :raises PythonRuntimeException: Throws if given string is too long. 

128 """ 

129 

130 return bitsizeof_varsize(len(value)) + len(value) * 8 

131 

132 

133def bitsizeof_string(string: str) -> int: 

134 """ 

135 Gets bit size of string. 

136 

137 :param string: String value to use for bit size calculation. 

138 :raises PythonRuntimeException: Throws if given string is too long. 

139 """ 

140 

141 string_bytes = string.encode("utf-8") 

142 return bitsizeof_varsize(len(string_bytes)) + len(string_bytes) * 8 

143 

144 

145def bitsizeof_bitbuffer(bitbuffer: BitBuffer) -> int: 

146 """ 

147 Gets the bit size of bit buffer which is stored in bit stream. 

148 

149 :param bitbuffer: Bit buffer for calculation. 

150 :returns: Length of bit buffer in bits. 

151 :raises PythonRuntimeException: Throws if given bit buffer is too long. 

152 """ 

153 bitbuffer_size = bitbuffer.bitsize 

154 

155 # bit buffer consists of varsize for bit size followed by the bits 

156 return bitsizeof_varsize(bitbuffer_size) + bitbuffer_size 

157 

158 

159def _bitsizeof_varnum(value: int, max_values: typing.Sequence[int], varint_name: str) -> int: 

160 if value >= 0: 

161 abs_value = abs(value) 

162 for i, max_value in enumerate(max_values): 

163 if abs_value <= max_value: 

164 return (i + 1) * 8 

165 

166 raise PythonRuntimeException(f"bitsizeof: Value '{value}' is out of range for '{varint_name}'!") 

167 

168 

169VARINT16_MAX_VALUES = [(1 << (6)) - 1, (1 << (6 + 8)) - 1] 

170 

171VARINT32_MAX_VALUES = [ 

172 (1 << (6)) - 1, 

173 (1 << (6 + 7)) - 1, 

174 (1 << (6 + 7 + 7)) - 1, 

175 (1 << (6 + 7 + 7 + 8)) - 1, 

176] 

177 

178VARINT64_MAX_VALUES = [ 

179 (1 << (6)) - 1, 

180 (1 << (6 + 7)) - 1, 

181 (1 << (6 + 7 + 7)) - 1, 

182 (1 << (6 + 7 + 7 + 7)) - 1, 

183 (1 << (6 + 7 + 7 + 7 + 7)) - 1, 

184 (1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1, 

185 (1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

186 (1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1, 

187] 

188 

189VARINT_MAX_VALUES = [ 

190 (1 << (6)) - 1, 

191 (1 << (6 + 7)) - 1, 

192 (1 << (6 + 7 + 7)) - 1, 

193 (1 << (6 + 7 + 7 + 7)) - 1, 

194 (1 << (6 + 7 + 7 + 7 + 7)) - 1, 

195 (1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1, 

196 (1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

197 (1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

198 (1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1, 

199] 

200 

201VARUINT16_MAX_VALUES = [(1 << (7)) - 1, (1 << (7 + 8)) - 1] 

202 

203VARUINT32_MAX_VALUES = [ 

204 (1 << (7)) - 1, 

205 (1 << (7 + 7)) - 1, 

206 (1 << (7 + 7 + 7)) - 1, 

207 (1 << (7 + 7 + 7 + 8)) - 1, 

208] 

209 

210VARUINT64_MAX_VALUES = [ 

211 (1 << (7)) - 1, 

212 (1 << (7 + 7)) - 1, 

213 (1 << (7 + 7 + 7)) - 1, 

214 (1 << (7 + 7 + 7 + 7)) - 1, 

215 (1 << (7 + 7 + 7 + 7 + 7)) - 1, 

216 (1 << (7 + 7 + 7 + 7 + 7 + 7)) - 1, 

217 (1 << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

218 (1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1, 

219] 

220 

221VARUINT_MAX_VALUES = [ 

222 (1 << (7)) - 1, 

223 (1 << (7 + 7)) - 1, 

224 (1 << (7 + 7 + 7)) - 1, 

225 (1 << (7 + 7 + 7 + 7)) - 1, 

226 (1 << (7 + 7 + 7 + 7 + 7)) - 1, 

227 (1 << (7 + 7 + 7 + 7 + 7 + 7)) - 1, 

228 (1 << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

229 (1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1, 

230 (1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1, 

231] 

232 

233VARSIZE_MAX_VALUES = [ 

234 (1 << (7)) - 1, 

235 (1 << (7 + 7)) - 1, 

236 (1 << (7 + 7 + 7)) - 1, 

237 (1 << (7 + 7 + 7 + 7)) - 1, 

238 (1 << (2 + 7 + 7 + 7 + 8)) - 1, 

239]