@@ -161,13 +161,8 @@ constexpr type_t muldiv(const type_t& value, const type_t& multiplier, const typ
161161template <typename native_t , uint_t size>
162162template <uint_t other_size, std::enable_if_t <(other_size < size), int >>
163163constexpr long_uint_t <native_t , size>::long_uint_t (const long_uint_t <native_t , other_size>& that) noexcept
164+ : digits(make_array<size>(that.digits, [](const auto & digits, uint_t idx) { return digits[idx]; }))
164165{
165- constexpr uint_t value_size = std::min (size, other_size);
166-
167- for (uint_t n = 0 ; n < value_size; ++n)
168- digits[n] = that.digits [n];
169- for (uint_t n = value_size; n < std::size (digits); ++n)
170- digits[n] = native_t (0 );
171166}
172167
173168template <typename native_t , uint_t size>
@@ -179,17 +174,18 @@ constexpr long_uint_t<native_t, size>::long_uint_t(native_array_t digits) noexce
179174template <typename native_t , uint_t size>
180175template <typename type_t , std::enable_if_t <std::is_unsigned_v<type_t >, int >>
181176constexpr long_uint_t <native_t , size>::long_uint_t (type_t value) noexcept
182- {
177+ : digits(make_array<size>(digits, [&value](const auto & /* digits*/ , uint_t idx) {
178+
183179 constexpr uint_t value_size = std::min (size, (byte_count_v<type_t > + byte_count_v<native_t > - 1 ) / byte_count_v<native_t >);
184- const native_t extension = 0 ;
185180
186- for (uint_t n = 0 ; n < value_size; ++n) {
181+ if (idx >= value_size)
182+ return native_t (0 );
187183
188- digits[n] = value & ~native_t (0 );
189- value >>= std::min (bit_count_v<type_t > - 1 , bit_count_v<native_t >);
190- }
191- for ( uint_t n = value_size; n < std::size (digits); ++n )
192- digits[n] = extension;
184+ const native_t digit = value & ~native_t (0 );
185+ value >>= std::min (bit_count_v<type_t > - 1 , bit_count_v<native_t >);
186+ return digit;
187+ }) )
188+ {
193189}
194190
195191template <typename native_t , uint_t size>
@@ -237,12 +233,7 @@ template<typename native_t, uint_t size>
237233template <uint_t other_size, std::enable_if_t <(other_size < size), int >>
238234constexpr long_uint_t <native_t , size>::operator long_uint_t <native_t , other_size>() const noexcept
239235{
240- long_uint_t <native_t , other_size> tmp;
241-
242- for (uint_t n = 0 ; n < other_size; ++n)
243- tmp.digits [n] = digits[n];
244-
245- return tmp;
236+ return make_array<other_size>(digits, [](const auto & digits, uint_t idx) { return digits[idx]; });
246237}
247238
248239
@@ -336,8 +327,8 @@ constexpr bool long_uint_t<native_t, size>::operator>=(const long_uint_t& that)
336327template <typename native_t , uint_t size>
337328constexpr long_uint_t <native_t , size> long_uint_t <native_t , size>::operator ~() const noexcept
338329{
339- return make_array (digits, [](uint_t /* idx */ , native_t value ) {
340- return ~value ;
330+ return make_array<size> (digits, [](const auto & digits, uint_t idx ) {
331+ return ~digits[idx] ;
341332 });
342333}
343334
@@ -576,8 +567,8 @@ constexpr long_uint_t<native_t, size> long_uint_t<native_t, size>::operator-() c
576567{
577568 bool borrow = true ;
578569
579- return make_array (digits, [&borrow](uint_t /* idx */ , native_t value ) {
580- return ~subb<native_t >(value , 0 , borrow);
570+ return make_array<size> (digits, [&borrow](const auto & digits, uint_t idx ) {
571+ return ~subb<native_t >(digits[idx] , 0 , borrow);
581572 });
582573}
583574
0 commit comments