Skip to content

Commit 5778e06

Browse files
committed
common/amount: add ceil division operation on msat
Changelog-None Signed-off-by: Lagrang3 <[email protected]>
1 parent db179e1 commit 5778e06

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

common/amount.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,13 @@ struct amount_msat amount_msat_div(struct amount_msat msat, u64 div)
532532
return msat;
533533
}
534534

535+
struct amount_msat amount_msat_div_ceil(struct amount_msat msat, u64 div)
536+
{
537+
u64 res = msat.millisatoshis / div;
538+
msat.millisatoshis = res + (div * res == msat.millisatoshis ? 0 : 1);
539+
return msat;
540+
}
541+
535542
struct amount_sat amount_sat_div(struct amount_sat sat, u64 div)
536543
{
537544
sat.satoshis /= div;

common/amount.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,13 @@ WARN_UNUSED_RESULT bool amount_sat_add_sat_s64(struct amount_sat *val,
104104
WARN_UNUSED_RESULT bool amount_msat_accumulate(struct amount_msat *a,
105105
struct amount_msat b);
106106

107+
/* returns floor(msat/div) */
107108
struct amount_msat amount_msat_div(struct amount_msat msat, u64 div);
109+
110+
/* returns ceil(msat/div) */
111+
struct amount_msat amount_msat_div_ceil(struct amount_msat msat, u64 div);
112+
113+
/* returns floor(sat/div) */
108114
struct amount_sat amount_sat_div(struct amount_sat sat, u64 div);
109115

110116
bool amount_sat_mul(struct amount_sat *res, struct amount_sat sat, u64 mul);

common/test/run-amount.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,75 @@ static void test_amount_with_fee(void)
163163
2100000001234567890ULL);
164164
}
165165

166+
static void test_case_amount_div(u64 input, u64 div, u64 expected)
167+
{
168+
struct amount_msat msat = amount_msat(input);
169+
struct amount_msat expected_msat = amount_msat(expected);
170+
struct amount_msat result_msat = amount_msat_div(msat, div);
171+
assert(amount_msat_eq(result_msat, expected_msat));
172+
}
173+
174+
static void test_case_amount_div_ceil(u64 input, u64 div, u64 expected)
175+
{
176+
struct amount_msat msat = amount_msat(input);
177+
struct amount_msat expected_msat = amount_msat(expected);
178+
struct amount_msat result_msat = amount_msat_div_ceil(msat, div);
179+
assert(amount_msat_eq(result_msat, expected_msat));
180+
}
181+
182+
static void test_amount_div(void)
183+
{
184+
test_case_amount_div(1, 1, 1);
185+
test_case_amount_div(1, 2, 0);
186+
test_case_amount_div(1, 3, 0);
187+
188+
test_case_amount_div(2, 1, 2);
189+
test_case_amount_div(2, 2, 1);
190+
test_case_amount_div(2, 3, 0);
191+
192+
test_case_amount_div(3, 1, 3);
193+
test_case_amount_div(3, 2, 1);
194+
test_case_amount_div(3, 3, 1);
195+
test_case_amount_div(3, 4, 0);
196+
197+
test_case_amount_div(10, 1, 10);
198+
test_case_amount_div(10, 2, 5);
199+
test_case_amount_div(10, 3, 3);
200+
test_case_amount_div(10, 4, 2);
201+
test_case_amount_div(10, 5, 2);
202+
test_case_amount_div(10, 6, 1);
203+
test_case_amount_div(10, 7, 1);
204+
test_case_amount_div(10, 8, 1);
205+
test_case_amount_div(10, 9, 1);
206+
test_case_amount_div(10, 10, 1);
207+
test_case_amount_div(10, 11, 0);
208+
209+
test_case_amount_div_ceil(1, 1, 1);
210+
test_case_amount_div_ceil(1, 2, 1);
211+
test_case_amount_div_ceil(1, 3, 1);
212+
213+
test_case_amount_div_ceil(2, 1, 2);
214+
test_case_amount_div_ceil(2, 2, 1);
215+
test_case_amount_div_ceil(2, 3, 1);
216+
217+
test_case_amount_div_ceil(3, 1, 3);
218+
test_case_amount_div_ceil(3, 2, 2);
219+
test_case_amount_div_ceil(3, 3, 1);
220+
test_case_amount_div_ceil(3, 4, 1);
221+
222+
test_case_amount_div_ceil(10, 1, 10);
223+
test_case_amount_div_ceil(10, 2, 5);
224+
test_case_amount_div_ceil(10, 3, 4);
225+
test_case_amount_div_ceil(10, 4, 3);
226+
test_case_amount_div_ceil(10, 5, 2);
227+
test_case_amount_div_ceil(10, 6, 2);
228+
test_case_amount_div_ceil(10, 7, 2);
229+
test_case_amount_div_ceil(10, 8, 2);
230+
test_case_amount_div_ceil(10, 9, 2);
231+
test_case_amount_div_ceil(10, 10, 1);
232+
test_case_amount_div_ceil(10, 11, 1);
233+
}
234+
166235
#define FAIL_MSAT(msatp, str) \
167236
assert(!parse_amount_msat((msatp), (str), strlen(str)))
168237
#define PASS_MSAT(msatp, str, val) \
@@ -330,5 +399,6 @@ int main(int argc, char *argv[])
330399
}
331400

332401
test_amount_with_fee();
402+
test_amount_div();
333403
common_shutdown();
334404
}

0 commit comments

Comments
 (0)