@@ -1763,6 +1763,8 @@ pub const Mutable = struct {
1763
1763
/// result = @depositBits(source, mask)
1764
1764
///
1765
1765
/// Asserts that `source` and `mask` are positive
1766
+ /// The value in `result` may use the same number of or less limbs than `mask`.
1767
+ /// `result` is assumed to have sufficient length to store the result.
1766
1768
pub fn depositBits (result : * Mutable , source : Const , mask : Const ) void {
1767
1769
assert (source .positive );
1768
1770
assert (mask .positive );
@@ -1771,10 +1773,14 @@ pub const Mutable = struct {
1771
1773
@memset (result .limbs , 0 );
1772
1774
1773
1775
var shift : usize = 0 ;
1774
- for (mask .limbs , result . limbs ) | mask_limb , * result_limb | {
1776
+ for (mask .limbs , 0 .. ) | mask_limb , i | {
1775
1777
const shift_bits : Log2Limb = @intCast (shift % limb_bits );
1776
1778
const shift_limbs = shift / limb_bits ;
1777
1779
1780
+ if (shift_limbs >= source .limbs .len ) break ;
1781
+
1782
+ const result_limb = & result .limbs [i ];
1783
+
1778
1784
var source_limb = source .limbs [shift_limbs ] >> shift_bits ;
1779
1785
if (shift_bits != 0 and shift_limbs + 1 < source .limbs .len ) {
1780
1786
source_limb += source .limbs [shift_limbs + 1 ] << @intCast (limb_bits - shift_bits );
@@ -1793,15 +1799,19 @@ pub const Mutable = struct {
1793
1799
/// result = @extractBits(source, mask)
1794
1800
///
1795
1801
/// Asserts that `source` and `mask` are positive
1802
+ /// The value in `result` may use the same number of or less limbs than `mask`.
1803
+ /// `result` is assumed to have sufficient length to store the result.
1796
1804
pub fn extractBits (result : * Mutable , source : Const , mask : Const ) void {
1797
1805
assert (source .positive );
1798
1806
assert (mask .positive );
1799
1807
1800
1808
result .positive = true ;
1801
1809
@memset (result .limbs , 0 );
1802
1810
1811
+ const len = @min (source .limbs .len , mask .limbs .len );
1812
+
1803
1813
var shift : usize = 0 ;
1804
- for (source .limbs , mask .limbs ) | source_limb , mask_limb | {
1814
+ for (source .limbs [0 .. len ] , mask .limbs [0 .. len ] ) | source_limb , mask_limb | {
1805
1815
const pext_limb = @extractBits (source_limb , mask_limb );
1806
1816
const shift_bits : Log2Limb = @intCast (shift % limb_bits );
1807
1817
const shift_limbs = shift / limb_bits ;
0 commit comments