aboutsummaryrefslogtreecommitdiff
path: root/src/range_cache.cpp
diff options
context:
space:
mode:
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;
+}