|
@@ -227,13 +227,19 @@ def TagByteSize(field_number):
|
|
# Private helper function for the *ByteSize() functions above.
|
|
# Private helper function for the *ByteSize() functions above.
|
|
|
|
|
|
def _VarUInt64ByteSizeNoTag(uint64):
|
|
def _VarUInt64ByteSizeNoTag(uint64):
|
|
- """Returns the bytes required to serialize a single varint.
|
|
|
|
|
|
+ """Returns the number of bytes required to serialize a single varint
|
|
|
|
+ using boundary value comparisons. (unrolled loop optimization -WPierce)
|
|
uint64 must be unsigned.
|
|
uint64 must be unsigned.
|
|
"""
|
|
"""
|
|
|
|
+ if uint64 <= 0x7f: return 1
|
|
|
|
+ if uint64 <= 0x3fff: return 2
|
|
|
|
+ if uint64 <= 0x1fffff: return 3
|
|
|
|
+ if uint64 <= 0xfffffff: return 4
|
|
|
|
+ if uint64 <= 0x7ffffffff: return 5
|
|
|
|
+ if uint64 <= 0x3ffffffffff: return 6
|
|
|
|
+ if uint64 <= 0x1ffffffffffff: return 7
|
|
|
|
+ if uint64 <= 0xffffffffffffff: return 8
|
|
|
|
+ if uint64 <= 0x7fffffffffffffff: return 9
|
|
if uint64 > UINT64_MAX:
|
|
if uint64 > UINT64_MAX:
|
|
raise message.EncodeError('Value out of range: %d' % uint64)
|
|
raise message.EncodeError('Value out of range: %d' % uint64)
|
|
- bytes = 1
|
|
|
|
- while uint64 > 0x7f:
|
|
|
|
- bytes += 1
|
|
|
|
- uint64 >>= 7
|
|
|
|
- return bytes
|
|
|
|
|
|
+ return 10
|