mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-02 20:58:15 +00:00
big: Prettify internal_cmp_digit.
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
@echo off
|
@echo off
|
||||||
:odin run . -vet
|
odin run . -vet
|
||||||
: -o:size
|
: -o:size
|
||||||
:odin build . -build-mode:shared -show-timings -o:minimal -no-bounds-check
|
:odin build . -build-mode:shared -show-timings -o:minimal -no-bounds-check
|
||||||
:odin build . -build-mode:shared -show-timings -o:size -no-bounds-check
|
:odin build . -build-mode:shared -show-timings -o:size -no-bounds-check
|
||||||
:odin build . -build-mode:shared -show-timings -o:size
|
:odin build . -build-mode:shared -show-timings -o:size
|
||||||
odin build . -build-mode:shared -show-timings -o:speed -no-bounds-check
|
:odin build . -build-mode:shared -show-timings -o:speed -no-bounds-check
|
||||||
:odin build . -build-mode:shared -show-timings -o:speed
|
:odin build . -build-mode:shared -show-timings -o:speed
|
||||||
|
|
||||||
python test.py
|
:python test.py
|
||||||
@@ -89,6 +89,7 @@ int_compare_digit :: proc(a: ^Int, b: DIGIT) -> (comparison: int, err: Error) {
|
|||||||
|
|
||||||
return #force_inline internal_cmp_digit(a, b), nil;
|
return #force_inline internal_cmp_digit(a, b), nil;
|
||||||
}
|
}
|
||||||
|
int_cmp_digit :: int_compare_digit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare the magnitude of two `Int`s, unsigned.
|
Compare the magnitude of two `Int`s, unsigned.
|
||||||
|
|||||||
+19
-25
@@ -1046,40 +1046,34 @@ internal_compare :: proc { internal_int_compare, internal_int_compare_digit, };
|
|||||||
internal_cmp :: internal_compare;
|
internal_cmp :: internal_compare;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare an `Int` to an unsigned number upto the size of the backing type.
|
Compare an `Int` to an unsigned number upto `DIGIT & _MASK`.
|
||||||
|
Returns -1 if `a` < `b`, 0 if `a` == `b` and 1 if `b` > `a`.
|
||||||
|
|
||||||
Returns -1 if `a` < `b`, 0 if `a` == `b` and 1 if `b` > `a`.
|
Expects: `a` and `b` both to be valid `Int`s, i.e. initialized and not `nil`.
|
||||||
|
|
||||||
Expects `a` and `b` both to be valid `Int`s, i.e. initialized and not `nil`.
|
|
||||||
*/
|
*/
|
||||||
internal_int_compare_digit :: #force_inline proc(a: ^Int, b: DIGIT) -> (comparison: int) {
|
internal_int_compare_digit :: #force_inline proc(a: ^Int, b: DIGIT) -> (comparison: int) {
|
||||||
/*
|
a_is_negative := #force_inline internal_is_negative(a);
|
||||||
Compare based on sign.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if #force_inline internal_is_negative(a) { return -1; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
Compare based on magnitude.
|
|
||||||
*/
|
|
||||||
if a.used > 1 { return +1; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
Compare the only digit in `a` to `b`.
|
|
||||||
*/
|
|
||||||
switch {
|
switch {
|
||||||
case a.digit[0] < b:
|
/*
|
||||||
return -1;
|
Compare based on sign first.
|
||||||
case a.digit[0] == b:
|
*/
|
||||||
return 0;
|
case a_is_negative: return -1;
|
||||||
case a.digit[0] > b:
|
/*
|
||||||
return +1;
|
Then compare on magnitude.
|
||||||
case:
|
*/
|
||||||
|
case a.used > 1: return +1;
|
||||||
|
/*
|
||||||
|
We have only one digit. Compare it against `b`.
|
||||||
|
*/
|
||||||
|
case a.digit[0] < b: return -1;
|
||||||
|
case a.digit[0] == b: return 0;
|
||||||
|
case a.digit[0] > b: return +1;
|
||||||
/*
|
/*
|
||||||
Unreachable.
|
Unreachable.
|
||||||
Just here because Odin complains about a missing return value at the bottom of the proc otherwise.
|
Just here because Odin complains about a missing return value at the bottom of the proc otherwise.
|
||||||
*/
|
*/
|
||||||
return;
|
case: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal_compare_digit :: proc { internal_int_compare_digit, };
|
internal_compare_digit :: proc { internal_int_compare_digit, };
|
||||||
|
|||||||
Reference in New Issue
Block a user