17 #include "gu_buffer.hpp"
18 #include "gu_throw.hpp"
20 #include "gu_macros.h"
35 template <
typename UI>
36 inline size_t uleb128_size(UI value)
41 for (; value != 0; value >>= 7, ++i) {}
56 template <
typename UI>
57 inline size_t uleb128_encode(UI value,
63 assert (offset < buflen);
64 buf[offset] = value & 0x7f;
71 if (gu_unlikely(offset >= buflen)) gu_throw_fatal;
73 assert(offset < buflen);
75 buf[offset] = value & 0x7f;
83 if (gu_unlikely(offset >= buflen)) gu_throw_fatal;
85 assert(offset < buflen);
87 buf[offset] = value & 0x7f;
89 if (gu_unlikely(value != 0))
101 template <
typename UI>
102 inline size_t uleb128_encode(UI value,
106 return uleb128_encode(value, buf, buflen, 0);
111 extern void uleb128_decode_checks (
const byte_t* buf,
126 template <
typename UI>
127 inline size_t uleb128_decode(
const byte_t* buf,
134 if (gu_unlikely(offset >= buflen)) gu_throw_fatal;
138 value = buf[offset] & 0x7f;
141 while (buf[offset] & 0x80)
147 ssize_t left_bits((
sizeof(UI) << 3) - shift);
148 if (gu_unlikely(offset >= buflen || left_bits < 7))
149 uleb128_decode_checks (buf, buflen, offset, left_bits);
151 value |= (UI(buf[offset] & 0x7f) << shift);
161 value |= (UI(buf[offset] & 0x7f) << shift);
162 if (gu_likely((buf[offset] & 0x80) == 0))
172 ssize_t left_bits((
sizeof(UI) << 3) - shift);
173 if (gu_unlikely(offset >= buflen || left_bits < 7))
174 uleb128_decode_checks (buf, buflen, offset, left_bits);
182 template <
typename UI>
183 inline size_t uleb128_decode(
const byte_t* buf,
187 return uleb128_decode(buf, buflen, 0, value);