diff --git a/src/DOM.cpp b/src/DOM.cpp index a252c676c..35365a8e2 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -71,18 +71,26 @@ DOM::~DOM () // system.os const std::string DOM::get (const std::string& name) { + // Cache test. + std::map ::iterator hit = _cache.find (name); + if (hit != _cache.end ()) + return hit->second; + int len = name.length (); Nibbler n (name); // Primitives if (is_primitive (name)) + { + _cache[name] = name; return name; + } // rc. --> context.config else if (len > 3 && name.substr (0, 3) == "rc.") { - return context.config.get (name.substr (3)); + return _cache[name] = context.config.get (name.substr (3)); } // context.* @@ -90,25 +98,25 @@ const std::string DOM::get (const std::string& name) name.substr (0, 8) == "context.") { if (name == "context.program") - return context.args[0].first; + return _cache[name] = context.args[0].first; else if (name == "context.args") { std::string combined; join (combined, " ", context.args.list ()); - return combined; + return _cache[name] = combined; } else if (name == "context.width") { std::stringstream s; s << context.terminal_width; - return s.str (); + return _cache[name] = s.str (); } else if (name == "context.height") { std::stringstream s; s << context.terminal_height; - return s.str (); + return _cache[name] = s.str (); } else @@ -124,39 +132,39 @@ const std::string DOM::get (const std::string& name) { // Taskwarrior version number. if (name == "system.version") - return VERSION; + return _cache[name] = VERSION; #ifdef HAVE_LIBLUA // Lua version number. else if (name == "system.lua.version") - return LUA_RELEASE; + return _cache[name] = LUA_RELEASE; #endif // OS type. else if (name == "system.os") #if defined (DARWIN) - return "Darwin"; + return _cache[name] = "Darwin"; #elif defined (SOLARIS) - return "Solaris"; + return _cache[name] = "Solaris"; #elif defined (CYGWIN) - return "Cygwin"; + return _cache[name] = "Cygwin"; #elif defined (OPENBSD) - return "OpenBSD"; + return _cache[name] = "OpenBSD"; #elif defined (HAIKU) - return "Haiku"; + return _cache[name] = "Haiku"; #elif defined (FREEBSD) - return "FreeBSD"; + return _cache[name] = "FreeBSD"; #elif defined (LINUX) - return "Linux"; + return _cache[name] = "Linux"; #else - return STRING_DOM_UNKNOWN + return _cache[name] = STRING_DOM_UNKNOWN #endif else throw format (STRING_DOM_UNREC, name); } - return name; + return _cache[name] = name; } //////////////////////////////////////////////////////////////////////////////// @@ -197,13 +205,18 @@ const std::string DOM::get (const std::string& name) // const std::string DOM::get (const std::string& name, Task& task) { + // Cache test. + std::map ::iterator hit = _cache.find (name); + if (hit != _cache.end ()) + return hit->second; + Nibbler n (name); int id; std::string uuid; // Primitives if (is_primitive (name)) - return name; + return _cache[name] = name; // . else if (n.getInt (id)) @@ -291,7 +304,8 @@ void DOM::set (const std::string& name, const std::string& value) if (len > 3 && name.substr (0, 3) == "rc.") { - return context.config.set (name.substr (3), value); + _cache[name] = value; + context.config.set (name.substr (3), value); } // Unrecognized --> error. diff --git a/src/DOM.h b/src/DOM.h index 790441d3a..5e2a19f7f 100644 --- a/src/DOM.h +++ b/src/DOM.h @@ -44,6 +44,9 @@ public: private: bool is_primitive (const std::string&); + +private: + std::map _cache; }; #endif