summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cache.cpp32
-rw-r--r--src/cache.hpp5
2 files changed, 36 insertions, 1 deletions
diff --git a/src/cache.cpp b/src/cache.cpp
index c5cc6a4d..c7b4792e 100644
--- a/src/cache.cpp
+++ b/src/cache.cpp
@@ -65,6 +65,37 @@ void Cache<Key, Value>::Store(Key &&key, Value &&value) {
}
template <typename Key, typename Value>
+void Cache<Key, Value>::Remove(const Key &key) {
+ std::lock_guard<std::mutex> lock(cache_mutex_);
+#if __cplusplus >= 201402L
+ cache_.erase(key);
+#else
+ auto it = cache_.begin();
+ while (it != cache_.end()) {
+ if ((*it).first == key) {
+ it = cache_.erase(it);
+ }
+ else ++it;
+ }
+#endif
+}
+
+template <typename Key, typename Value>
+template <int I1, int I2>
+void Cache<Key, Value>::RemoveBySubset(const Key key) {
+ std::lock_guard<std::mutex> lock(cache_mutex_);
+ auto it = cache_.begin();
+ while (it != cache_.end()) {
+ const auto current_key = (*it).first;
+ if ((std::get<I1>(key) == std::get<I1>(current_key)) &&
+ (std::get<I2>(key) == std::get<I2>(current_key))) {
+ it = cache_.erase(it);
+ }
+ else ++it;
+ }
+}
+
+template <typename Key, typename Value>
void Cache<Key, Value>::Invalidate() {
std::lock_guard<std::mutex> lock(cache_mutex_);
@@ -88,6 +119,7 @@ template std::string BinaryCache::Get(const BinaryKeyRef &, bool *) const;
template class Cache<ProgramKey, Program>;
template Program ProgramCache::Get(const ProgramKeyRef &, bool *) const;
+template void ProgramCache::RemoveBySubset<1, 2>(const ProgramKey); // by precision and routine name
// =================================================================================================
diff --git a/src/cache.hpp b/src/cache.hpp
index c3675f07..f3685b03 100644
--- a/src/cache.hpp
+++ b/src/cache.hpp
@@ -42,6 +42,10 @@ public:
void Store(Key &&key, Value &&value);
void Invalidate();
+ // Removes all entries with a given key
+ void Remove(const Key &key);
+ template <int I1, int I2> void RemoveBySubset(const Key key); // currently only supports 2 indices
+
static Cache<Key, Value> &Instance();
private:
@@ -72,7 +76,6 @@ typedef Cache<BinaryKey, std::string> BinaryCache;
extern template class Cache<BinaryKey, std::string>;
extern template std::string BinaryCache::Get(const BinaryKeyRef &, bool *) const;
-
// =================================================================================================
// The key struct for the cache of compiled OpenCL programs (context-dependent)