diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-06-26 14:41:47 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-07-08 17:59:10 -0400 |
| commit | d1e68c3ca84844a96d4897c857861b40751965cc (patch) | |
| tree | 8866451296719e1c1c0850bb31a213d081c22352 /src/range_set.cpp | |
| parent | 3e8af78895d313f0706389da2ad7e5c60df95964 (diff) | |
| download | zig-d1e68c3ca84844a96d4897c857861b40751965cc.tar.gz zig-d1e68c3ca84844a96d4897c857861b40751965cc.zip | |
better bigint/bigfloat implementation
Diffstat (limited to 'src/range_set.cpp')
| -rw-r--r-- | src/range_set.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/src/range_set.cpp b/src/range_set.cpp index 6158f52a00..83f34d505a 100644 --- a/src/range_set.cpp +++ b/src/range_set.cpp @@ -1,11 +1,11 @@ #include "range_set.hpp" -AstNode *rangeset_add_range(RangeSet *rs, BigNum *first, BigNum *last, AstNode *source_node) { +AstNode *rangeset_add_range(RangeSet *rs, BigInt *first, BigInt *last, AstNode *source_node) { for (size_t i = 0; i < rs->src_range_list.length; i += 1) { RangeWithSrc *range_with_src = &rs->src_range_list.at(i); Range *range = &range_with_src->range; - if ((bignum_cmp_gte(first, &range->first) && bignum_cmp_lte(first, &range->last)) || - (bignum_cmp_gte(last, &range->first) && bignum_cmp_lte(last, &range->last))) + if ((bigint_cmp(first, &range->first) != CmpLT && bigint_cmp(first, &range->last) != CmpGT) || + (bigint_cmp(last, &range->first) != CmpLT && bigint_cmp(last, &range->last) != CmpGT)) { return range_with_src->source_node; } @@ -16,24 +16,22 @@ AstNode *rangeset_add_range(RangeSet *rs, BigNum *first, BigNum *last, AstNode * } -static bool add_range(ZigList<Range> *list, Range *new_range, BigNum *one) { +static bool add_range(ZigList<Range> *list, Range *new_range, BigInt *one) { for (size_t i = 0; i < list->length; i += 1) { Range *range = &list->at(i); - BigNum first_minus_one; - if (bignum_sub(&first_minus_one, &range->first, one)) - zig_unreachable(); + BigInt first_minus_one; + bigint_sub(&first_minus_one, &range->first, one); - if (bignum_cmp_eq(&new_range->last, &first_minus_one)) { + if (bigint_cmp(&new_range->last, &first_minus_one) == CmpEQ) { range->first = new_range->first; return true; } - BigNum last_plus_one; - if (bignum_add(&last_plus_one, &range->last, one)) - zig_unreachable(); + BigInt last_plus_one; + bigint_add(&last_plus_one, &range->last, one); - if (bignum_cmp_eq(&new_range->first, &last_plus_one)) { + if (bigint_cmp(&new_range->first, &last_plus_one) == CmpEQ) { range->last = new_range->last; return true; } @@ -42,7 +40,7 @@ static bool add_range(ZigList<Range> *list, Range *new_range, BigNum *one) { return false; } -bool rangeset_spans(RangeSet *rs, BigNum *first, BigNum *last) { +bool rangeset_spans(RangeSet *rs, BigInt *first, BigInt *last) { ZigList<Range> cur_list_value = {0}; ZigList<Range> other_list_value = {0}; ZigList<Range> *cur_list = &cur_list_value; @@ -54,8 +52,8 @@ bool rangeset_spans(RangeSet *rs, BigNum *first, BigNum *last) { cur_list->append({range->first, range->last}); } - BigNum one; - bignum_init_unsigned(&one, 1); + BigInt one; + bigint_init_unsigned(&one, 1); bool changes_made = true; while (changes_made) { @@ -73,9 +71,9 @@ bool rangeset_spans(RangeSet *rs, BigNum *first, BigNum *last) { if (cur_list->length != 1) return false; Range *range = &cur_list->at(0); - if (bignum_cmp_neq(&range->first, first)) + if (bigint_cmp(&range->first, first) != CmpEQ) return false; - if (bignum_cmp_neq(&range->last, last)) + if (bigint_cmp(&range->last, last) != CmpEQ) return false; return true; } |
