#include "packbits.hpp" #include "compat/assert.hpp" namespace floormat { using namespace floormat::detail_Pack; namespace { template struct check_size_overflow; template struct check_size_overflow, Xs...> { static_assert(std::is_same_v); static constexpr auto acc = Sum + size_t{N}; using next_check = check_size_overflow; static constexpr auto size = next_check::size; static constexpr bool result = next_check::result; }; template struct check_size_overflow { static constexpr size_t size = Sum; static constexpr bool result = Sum <= sizeof(T)*8; }; template constexpr inline T lowbits = (T{1} << N)-T{1}; template using us_bits = Bits_; static_assert(!Storage{65535}.check_zero()); static_assert(Storage{65535}.advance<16>() == 0); static_assert(Storage::next<16>{ Storage{65535}.advance<16>() }.check_zero()); static_assert(Storage::next<16>{}.Capacity == 14); 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()); static_assert(std::is_same_v< make_tuple_type, std::tuple >); constexpr bool test4() { using Tuple = std::tuple; Tuple tuple{}; assign_tuple2(tuple, Storage{(uint32_t)-1}, std::make_index_sequence<3>{}, Bits_{}, Bits_{}, Bits_{}); auto [a, b, c] = tuple; static_assert(lowbits != 0); fm_assert(a == lowbits); fm_assert(b == lowbits); fm_assert(c & 1); //Assign::do_tuple(tuple, Storage{(uint32_t)-1}); return true; } static_assert(test4()); constexpr bool test5() { auto st = Storage{0xB16B00B5}; uint32_t a, b, c; using Tuple = std::tuple; auto t = Tuple{a, b, c}; //assign_tuple, Tuple, return true; } static_assert(test4()); } // namespace } // namespace floormat