@@ -19,11 +19,11 @@ template <std::size_t NumBits> struct storage {
1919 std::array<elem_t , num_elems> elems{};
2020
2121 constexpr storage () = default;
22- constexpr storage (std::array<elem_t , num_elems> const &new_elems)
22+ constexpr explicit storage (std::array<elem_t , num_elems> const &new_elems)
2323 : elems{new_elems} {}
2424
2525 template <std::size_t RhsNumBits>
26- constexpr storage (storage<RhsNumBits> const &rhs) {
26+ constexpr explicit storage (storage<RhsNumBits> const &rhs) {
2727 for (auto i = std::size_t {}; i < NumBits; i++) {
2828 set (i, rhs.get (i));
2929 }
@@ -76,25 +76,28 @@ template <std::size_t NumBits> struct storage {
7676template <typename T>
7777 requires (sizeof (T) <= 4 && std::signed_integral<std::remove_cvref_t <T>>)
7878[[nodiscard]] constexpr auto to_storage (T v) -> storage<sizeof(T) * 8> {
79- return {{static_cast <uint32_t >(static_cast <int32_t >(v))}};
79+ return storage<sizeof (T) * 8 >{
80+ {static_cast <uint32_t >(static_cast <int32_t >(v))}};
8081}
8182
8283template <typename T>
8384 requires (sizeof (T) <= 4 && std::unsigned_integral<std::remove_cvref_t <T>>)
8485[[nodiscard]] constexpr auto to_storage (T v) -> storage<(sizeof (T) * 8) + 1> {
85- return {{static_cast <uint32_t >(v)}};
86+ return storage<( sizeof (T) * 8 ) + 1 > {{static_cast <uint32_t >(v)}};
8687}
8788
8889template <typename T>
8990 requires (sizeof (T) == 8 && std::signed_integral<std::remove_cvref_t <T>>)
9091[[nodiscard]] constexpr auto to_storage (T v) -> storage<64> {
91- return {{static_cast <uint32_t >(v), static_cast <uint32_t >(v >> 32 )}};
92+ return storage<64 >{
93+ {static_cast <uint32_t >(v), static_cast <uint32_t >(v >> 32 )}};
9294}
9395
9496template <typename T>
9597 requires (sizeof (T) == 8 && std::unsigned_integral<std::remove_cvref_t <T>>)
9698[[nodiscard]] constexpr auto to_storage (T v) -> storage<65> {
97- return {{static_cast <uint32_t >(v), static_cast <uint32_t >(v >> 32 )}};
99+ return storage<65 >{
100+ {static_cast <uint32_t >(v), static_cast <uint32_t >(v >> 32 )}};
98101}
99102
100103template <std::size_t NumBits>
@@ -134,8 +137,8 @@ template <std::size_t NumBits>
134137 requires (NumBits > 32 && NumBits <= 64 )
135138[[nodiscard]] constexpr auto to_integral (storage<NumBits> const &value)
136139 -> int64_t {
137- return (static_cast <int64_t >(value.get (1 )) << 32 ) |
138- (static_cast <int64_t >(value.get (0 )));
140+ return (static_cast <uint64_t >(value.get (1 )) << 32u ) |
141+ (static_cast <uint64_t >(value.get (0 )));
139142}
140143
141144template <std::size_t NumBits>
0 commit comments