#include "packbits.hpp" #include "compat/assert.hpp" namespace floormat { using namespace floormat::detail_Pack; namespace { constexpr bool test1() { constexpr size_t left[] = { 8, 3, 2, 1, 0 }; constexpr size_t rest[] = { 0, 5, 6, 7, 8 }; constexpr size_t bits[] = { 5, 2, 1, 1 }; constexpr size_t vals[] = { 8, 3, 1, 0 }; constexpr auto S0 = Storage{0b10111011uz}; constexpr auto S1 = Storage{0b00000101uz}; constexpr auto S2 = Storage{0b00000010uz}; constexpr auto S3 = Storage{0b00000001uz}; constexpr auto S4 = Storage{0b00000000uz}; static_assert(S0.Capacity == 8 - rest[0]); static_assert(S1.Capacity == 8 - rest[1]); static_assert(S2.Capacity == 8 - rest[2]); static_assert(S3.Capacity == 8 - rest[3]); static_assert(S4.Capacity == 8 - rest[4]); static_assert(S0.advance() == S1.value); static_assert(S1.advance() == S2.value); static_assert(S2.advance() == S3.value); static_assert(S3.advance() == S4.value); using P0 = std::decay_t; using P1 = P0::next; using P2 = P1::next; using P3 = P2::next; static_assert(P0::Capacity == vals[0]); static_assert(P1::Capacity == vals[1]); static_assert(P2::Capacity == vals[2]); static_assert(P3::Capacity == vals[3]); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); static_assert(std::is_same_v>); return true; } static_assert(test1()); namespace test2 { template using ibits = Bits_; using foo1 = ibits<2>; using foo2 = ibits<10>; using foo3 = ibits<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 = ibits<1>; using bar4 = check_size_overflow; static_assert(!bar4::result); static_assert(bar4::size == 17); using foo5 = ibits<20>; using bar5 = check_size_overflow; static_assert(!bar5::result); static_assert(bar5::size == 37); using foo6 = ibits<40>; using bar6 = check_size_overflow; static_assert(!bar6::result); static_assert(bar6::size == 57); } // namespace test2 } // namespace } // namespace floormat