#pragma once #include /* Small helper inspired by msgb */ struct ubit_buf { const ubit_t *buf; /*!< start of underlying buffer */ const ubit_t *data; /*!< next to be consumed bit */ size_t n_bits; /*!< number of total bits iin buffer */ }; /*! length of [remainig, to be processed] data in ubit_buf */ static inline size_t ubb_length(struct ubit_buf *ubb) { return ubb->n_bits - (ubb->data - ubb->buf); } /*! retrieve + remove a single ubit_t from start of ubit_buf */ static inline ubit_t ubb_pull_ubit(struct ubit_buf *ubb) { OSMO_ASSERT(ubb->data < ubb->buf + ubb->n_bits); return *ubb->data++; } static inline void ubb_pull(struct ubit_buf *ubb, size_t count) { OSMO_ASSERT(ubb_length(ubb) >= count); ubb->data += count; } /*! get pointer to next to be consumed bit */ static inline const ubit_t *ubb_data(struct ubit_buf *ubb) { return ubb->data; } static inline void ubb_init(struct ubit_buf *ubb, const ubit_t *bits, size_t n_bits) { ubb->buf = bits; ubb->data = ubb->buf; ubb->n_bits = n_bits; }