aboutsummaryrefslogtreecommitdiff
path: root/src/range_cache.cpp
diff options
context:
space:
mode:
authorChris Heyes <rumcode@icloud.com>2019-11-01 19:18:33 +0000
committerChris Heyes <rumcode@icloud.com>2019-11-01 19:18:33 +0000
commit153e7525b5d64f12deb318d50aee1d9dbeb1fc8e (patch)
treeb8ac88c0788af31bcb3c5041d78306c2120714f6 /src/range_cache.cpp
parentd85893954dccc7833e3d954db641d9fd2a3c7451 (diff)
parent44a303e5778fb8564964d53523634f34f8589489 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/range_cache.cpp')
-rw-r--r--src/range_cache.cpp70
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;
+}