#define UNIT r4_bitptr #include #include class bitptr { std::byte *_ptr; int _offset; bool _valid = true; public: bitptr() : _valid( false ) {} bitptr( std::byte *p, int o ) : _ptr( p ), _offset( o ) { assert( o >= 0 && o <= 7 ); } static auto one() { return std::byte( 1 ); } bool get() const { return bool( *_ptr & one() << _offset ); } void set( bool b ) const { *_ptr = ( *_ptr & ~( one() << _offset ) ) | std::byte( b ) << _offset; } void advance( int n = 1 ) { _offset += n; _ptr += _offset / 8; _offset %= 8; } bool valid() const { return _valid; } }; class const_bitptr { bitptr _ptr; public: const_bitptr() = default; const_bitptr( const std::byte *p, int o ) : _ptr( const_cast< std::byte * >( p ), o ) {} bool get() const { return _ptr.get(); } void set( bool b ) const { return _ptr.set( b ); } void advance( int n = 1 ) { _ptr.advance( n ); } bool valid() const { return _ptr.valid(); } }; #include "test_main.cpp"