#include "packbits.hpp" #include "compat/assert.hpp" namespace floormat { using namespace floormat::detail_Pack; namespace { template using us_bits = Bits_; static_assert(!Storage{42}.check_zero()); constexpr bool test1() { constexpr size_t bits[] = { 5, 2, 1 }; constexpr size_t vals[] = { 8, 3, 1, 0 }; constexpr auto S0 = Storage{0b10111011}; constexpr auto S1 = Storage{0b00000101}; constexpr auto S2 = Storage{0b00000001}; constexpr auto S3 = Storage{0b00000000}; using P0 = std::decay_t; using P1 = P0::next; using P2 = P1::next; using P3 = P2::next; static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(S0.advance< 0>() == S0.value); static_assert(S0.advance() == S1.value); static_assert(S1.advance() == S2.value); static_assert(S2.advance() == S3.value); static_assert(S0.get() == (S0.value & (1<() == (S1.value & (1<() == (S2.value & (1<; using foo2 = us_bits<10>; using foo3 = us_bits<4>; using bar1 = check_size_overflow; static_assert(bar1::result); static_assert(bar1::size == 12); using bar2 = check_size_overflow; static_assert(bar2::result); static_assert(bar2::size == 10); using bar3 = check_size_overflow; static_assert(bar3::result); static_assert(bar3::size == 16); using foo4 = us_bits<1>; using bar4 = check_size_overflow; static_assert(!bar4::result); static_assert(bar4::size == 17); using foo5 = us_bits<20>; using bar5 = check_size_overflow; static_assert(!bar5::result); static_assert(bar5::size == 37); using foo6 = us_bits<40>; using bar6 = check_size_overflow; static_assert(!bar6::result); static_assert(bar6::size == 57); return true; } static_assert(test2()); constexpr bool test3() { constexpr auto S0 = Storage{0b1110100110001011}; constexpr auto S1 = Storage{0b1110}; constexpr auto S2 = Storage{0b1}; static_assert(S0.get<12>() == 0b100110001011); static_assert(S0.advance<12>() == S1.value); static_assert(S1.get<3>() == 0b110); static_assert(S1.advance<3>() == S2.value); static_assert(S2.get<1>() == 0b1); static_assert(S2.advance<1>() == 0); return true; } static_assert(test3()); } // namespace } // namespace floormat