From 85cc740de031e3d4cbba73dc86e52c25b778a513 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Thu, 9 Jan 2014 21:57:37 +0000 Subject: [PATCH] Use Buffer values for storing highlighting caches --- src/highlighters.cc | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/highlighters.cc b/src/highlighters.cc index 7bfa30cd..32fb5c99 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -150,7 +150,8 @@ class RegexColorizer { public: RegexColorizer(Regex regex, ColorSpec colors) - : m_regex(std::move(regex)), m_colors(std::move(colors)) + : m_regex{std::move(regex)}, m_colors{std::move(colors)}, + m_cache_id{ValueId::get_free_id()} { } @@ -175,17 +176,20 @@ private: struct MatchesCache { BufferRange m_range; - size_t m_timestamp; + size_t m_timestamp = 0; std::vector>> m_matches; }; - std::unordered_map m_caches; Regex m_regex; ColorSpec m_colors; + ValueId m_cache_id; MatchesCache& update_cache_ifn(const Buffer& buffer, const BufferRange& range) { - MatchesCache& cache = m_caches[&buffer]; + Value& cache_val = buffer.values()[m_cache_id]; + if (not cache_val) + cache_val = Value(MatchesCache{}); + MatchesCache& cache = cache_val.as(); if (buffer.timestamp() == cache.m_timestamp and range.first >= cache.m_range.first and @@ -503,7 +507,8 @@ public: RegionHighlighter(Regex begin, Regex end, HighlightFunc func) : m_begin(std::move(begin)), m_end(std::move(end)), - m_func(std::move(func)) + m_func(std::move(func)), + m_cache_id{ValueId::get_free_id()} {} void operator()(const Context& context, DisplayBuffer& display_buffer) @@ -516,17 +521,21 @@ private: Regex m_begin; Regex m_end; HighlightFunc m_func; + ValueId m_cache_id; struct RegionCache { size_t timestamp = -1; std::vector> regions; }; - std::unordered_map m_cache; RegionCache& update_cache_ifn(const Buffer& buffer) { - RegionCache& cache = m_cache[&buffer]; + Value& cache_val = buffer.values()[m_cache_id]; + if (not cache_val) + cache_val = Value(RegionCache{}); + RegionCache& cache = cache_val.as(); + if (cache.timestamp == buffer.timestamp()) return cache;