MCPcopy Create free account
hub / github.com/Vectorized/function-selector-miner / write_decimal

Function write_decimal

src/sponge.rs:104–148  ·  view source on GitHub ↗
(out: &mut [u8], mut x: u64)

Source from the content-addressed store, hash-verified

102/// This function is unsafe because it uses `copy_nonoverlapping`.
103#[inline(always)]
104unsafe fn write_decimal<const N: usize>(out: &mut [u8], mut x: u64) -> usize {
105 let mut buf = [0u8; 64];
106
107 let buf_ptr = if N == 0 {
108 buf.as_mut_ptr()
109 } else {
110 out.as_mut_ptr().add(32)
111 };
112 let lut_ptr = DEC_DIGITS_LUT.as_ptr();
113
114 let mut curr = 32;
115
116 while x >= 10000 {
117 let rem = (x % 10000) as usize;
118 x /= 10000;
119
120 let d1 = (rem / 100) << 1;
121 let d2 = (rem % 100) << 1;
122 curr -= 4;
123
124 std::ptr::copy_nonoverlapping(lut_ptr.add(d1), buf_ptr.add(curr), 2);
125 std::ptr::copy_nonoverlapping(lut_ptr.add(d2), buf_ptr.add(curr + 2), 2);
126 }
127
128 let mut x = x as usize;
129
130 if x >= 100 {
131 let d1 = (x % 100) << 1;
132 x /= 100;
133 curr -= 2;
134 std::ptr::copy_nonoverlapping(lut_ptr.add(d1), buf_ptr.add(curr), 2);
135 }
136
137 if x < 10 {
138 curr -= 1;
139 *buf_ptr.add(curr) = (x as u8) + b'0';
140 } else {
141 let d1 = x << 1;
142 curr -= 2;
143 std::ptr::copy_nonoverlapping(lut_ptr.add(d1), buf_ptr.add(curr), 2);
144 }
145
146 std::ptr::copy_nonoverlapping(buf_ptr.add(curr), out.as_mut_ptr(), 32);
147 32 - curr
148}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected