Harald Welte | 78861c0 | 2020-05-14 13:28:07 +0200 | [diff] [blame] | 1 | #pragma once |
| 2 | #include <osmocom/core/bits.h> |
| 3 | |
| 4 | /* Small helper inspired by msgb */ |
| 5 | |
| 6 | struct ubit_buf { |
| 7 | const ubit_t *buf; /*!< start of underlying buffer */ |
| 8 | const ubit_t *data; /*!< next to be consumed bit */ |
| 9 | size_t n_bits; /*!< number of total bits iin buffer */ |
| 10 | }; |
| 11 | |
| 12 | /*! length of [remainig, to be processed] data in ubit_buf */ |
| 13 | static inline size_t ubb_length(struct ubit_buf *ubb) |
| 14 | { |
| 15 | return ubb->n_bits - (ubb->data - ubb->buf); |
| 16 | } |
| 17 | |
| 18 | /*! retrieve + remove a single ubit_t from start of ubit_buf */ |
| 19 | static inline ubit_t ubb_pull_ubit(struct ubit_buf *ubb) |
| 20 | { |
| 21 | OSMO_ASSERT(ubb->data < ubb->buf + ubb->n_bits); |
| 22 | return *ubb->data++; |
| 23 | } |
| 24 | |
| 25 | static inline void ubb_pull(struct ubit_buf *ubb, size_t count) |
| 26 | { |
| 27 | OSMO_ASSERT(ubb_length(ubb) >= count); |
| 28 | ubb->data += count; |
| 29 | } |
| 30 | |
| 31 | /*! get pointer to next to be consumed bit */ |
| 32 | static inline const ubit_t *ubb_data(struct ubit_buf *ubb) |
| 33 | { |
| 34 | return ubb->data; |
| 35 | } |
| 36 | |
| 37 | static inline void ubb_init(struct ubit_buf *ubb, const ubit_t *bits, size_t n_bits) |
| 38 | { |
| 39 | ubb->buf = bits; |
| 40 | ubb->data = ubb->buf; |
| 41 | ubb->n_bits = n_bits; |
| 42 | } |