blob: 224b44bcff2fbaabb5826411930d3d83d657e81b [file] [log] [blame]
Harald Welte78861c02020-05-14 13:28:07 +02001#pragma once
2#include <osmocom/core/bits.h>
3
4/* Small helper inspired by msgb */
5
6struct 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 */
13static 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 */
19static 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
25static 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 */
32static inline const ubit_t *ubb_data(struct ubit_buf *ubb)
33{
34 return ubb->data;
35}
36
37static 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}