| 81 | |
| 82 | template <typename IntegerType> |
| 83 | size_t encodeVariableLengthInt (void* destBuffer, IntegerType valueToEncode) |
| 84 | { |
| 85 | size_t size = 0; |
| 86 | auto n = static_cast<typename std::make_unsigned<IntegerType>::type> (valueToEncode); |
| 87 | auto dest = static_cast<uint8_t*> (destBuffer); |
| 88 | |
| 89 | for (;;) |
| 90 | { |
| 91 | auto byte = static_cast<uint8_t> (n & static_cast<IntegerType> (127)); |
| 92 | n >>= 7; |
| 93 | |
| 94 | if (n == 0) |
| 95 | { |
| 96 | dest[size] = byte; |
| 97 | return size + 1; |
| 98 | } |
| 99 | |
| 100 | dest[size++] = static_cast<uint8_t> (byte | 0x80u); |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | template <typename IntegerType> |
| 105 | IntegerType decodeVariableLengthInt (const void* encodedData, size_t availableSize, size_t& bytesUsed) |