aboutsummaryrefslogtreecommitdiff
path: root/src/cache.h
diff options
context:
space:
mode:
authorAllusive_ <[email protected]>2023-08-01 09:00:18 +1000
committerGitHub <[email protected]>2023-08-01 09:00:18 +1000
commit0147e7dd165f837662a480938e2083a5ac707586 (patch)
tree3e38624c86c7119703cddb524ac01278491c8a3f /src/cache.h
parentAdd files via upload (diff)
downloadcompfy-0147e7dd165f837662a480938e2083a5ac707586.tar.xz
compfy-0147e7dd165f837662a480938e2083a5ac707586.zip
Add files via upload
Diffstat (limited to 'src/cache.h')
-rw-r--r--src/cache.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/cache.h b/src/cache.h
new file mode 100644
index 0000000..3ca054f
--- /dev/null
+++ b/src/cache.h
@@ -0,0 +1,32 @@
+#pragma once
+
+struct cache;
+
+typedef void *(*cache_getter_t)(void *user_data, const char *key, int *err);
+typedef void (*cache_free_t)(void *user_data, void *data);
+
+/// Create a cache with `getter`, and a free function `f` which is used to free the cache
+/// value when they are invalidated.
+///
+/// `user_data` will be passed to `getter` and `f` when they are called.
+struct cache *new_cache(void *user_data, cache_getter_t getter, cache_free_t f);
+
+/// Fetch a value from the cache. If the value doesn't present in the cache yet, the
+/// getter will be called, and the returned value will be stored into the cache.
+void *cache_get(struct cache *, const char *key, int *err);
+
+/// Invalidate a value in the cache.
+void cache_invalidate(struct cache *, const char *key);
+
+/// Invalidate all values in the cache.
+void cache_invalidate_all(struct cache *);
+
+/// Invalidate all values in the cache and free it. Returns the user data passed to
+/// `new_cache`
+void *cache_free(struct cache *);
+
+/// Insert a key-value pair into the cache. Only used for internal testing. Takes
+/// ownership of `data`
+///
+/// If `key` already exists in the cache, this function will abort the program.
+void cache_set(struct cache *c, const char *key, void *data);