diff options
| author | Chris Heyes <rumcode@icloud.com> | 2019-11-01 19:18:33 +0000 |
|---|---|---|
| committer | Chris Heyes <rumcode@icloud.com> | 2019-11-01 19:18:33 +0000 |
| commit | 153e7525b5d64f12deb318d50aee1d9dbeb1fc8e (patch) | |
| tree | b8ac88c0788af31bcb3c5041d78306c2120714f6 /src/range_cache.cpp | |
| parent | d85893954dccc7833e3d954db641d9fd2a3c7451 (diff) | |
| parent | 44a303e5778fb8564964d53523634f34f8589489 (diff) | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/range_cache.cpp')
| -rw-r--r-- | src/range_cache.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/range_cache.cpp b/src/range_cache.cpp new file mode 100644 index 000000000..9701fb432 --- /dev/null +++ b/src/range_cache.cpp @@ -0,0 +1,70 @@ + +// Integers only +struct RangeValue { + i64 lo; + i64 hi; +}; + +struct RangeCache { + Array<RangeValue> ranges; +}; + + +RangeCache range_cache_make(gbAllocator a) { + RangeCache cache = {}; + array_init(&cache.ranges, a); + return cache; +} + +void range_cache_destroy(RangeCache *c) { + array_free(&c->ranges); +} + +bool range_cache_add_index(RangeCache *c, i64 index) { + for_array(i, c->ranges) { + RangeValue v = c->ranges[i]; + if (v.lo <= index && index <= v.hi) { + return false; + } + } + RangeValue v = {index, index}; + array_add(&c->ranges, v); + return true; +} + + +bool range_cache_add_range(RangeCache *c, i64 lo, i64 hi) { + GB_ASSERT(lo <= hi); + for_array(i, c->ranges) { + RangeValue v = c->ranges[i]; + if (hi < v.lo) { + continue; + } + if (lo > v.hi) { + continue; + } + + if (v.hi < hi) { + v.hi = hi; + } + if (lo < v.lo) { + v.lo = lo; + } + c->ranges[i] = v; + return false; + } + RangeValue v = {lo, hi}; + array_add(&c->ranges, v); + return true; +} + + +bool range_cache_index_exists(RangeCache *c, i64 index) { + for_array(i, c->ranges) { + RangeValue v = c->ranges[i]; + if (v.lo <= index && index <= v.hi) { + return true; + } + } + return false; +} |