Iros
 
Loading...
Searching...
No Matches
bit_set.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/types/prelude.h"
8
9namespace di::bit {
10template<size_t extent>
11class [[gnu::packed]] BitSet {
12public:
13 constexpr BitSet() { m_storage.fill(0); }
14
15 BitSet(BitSet const&) = default;
16 auto operator=(BitSet const&) -> BitSet& = default;
17
18 constexpr auto operator[](size_t index) {
19 DI_ASSERT(index < extent);
20 auto byte_index = index / 8U;
21 auto bit_index = index % 8U;
22 return detail::BitProxyReference(m_storage.data() + byte_index, bit_index);
23 }
24 constexpr auto operator[](size_t index) const -> bool {
25 DI_ASSERT(index < extent);
26 auto byte_index = index / 8U;
27 auto bit_index = index % 8U;
28 return detail::BitProxyReference(const_cast<u8*>(m_storage.data()) + byte_index, bit_index);
29 }
30
31 constexpr auto size() const -> size_t { return extent; }
32
33private:
34 Array<u8, math::divide_round_up(extent, 8U)> m_storage;
35};
36}
37
38namespace di {
39using bit::BitSet;
40}
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr auto size() const -> size_t
Definition bit_set.h:31
constexpr auto operator[](size_t index) const -> bool
Definition bit_set.h:24
BitSet(BitSet const &)=default
constexpr auto operator[](size_t index)
Definition bit_set.h:18
constexpr BitSet()
Definition bit_set.h:13
auto operator=(BitSet const &) -> BitSet &=default
Definition bit_proxy_reference.h:6
Definition bit_proxy_reference.h:5
constexpr auto divide_round_up
Definition divide_round_up.h:17
__UINT8_TYPE__ u8
Definition integers.h:9
Definition zstring_parser.h:9
Definition span_fixed_size.h:37