]> granicus.if.org Git - icinga2/commitdiff
Improved performance for Dictionary::Get.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 6 Aug 2012 10:03:38 +0000 (12:03 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 6 Aug 2012 10:03:38 +0000 (12:03 +0200)
base/dictionary.cpp
base/dictionary.h
base/qstring.cpp
base/qstring.h

index 3ac9845fbca443abea12b5b245ee0623f277e66c..4b3c61678bcb5c5750645943b3b605baee7aea90 100644 (file)
 
 using namespace icinga;
 
+struct DictionaryKeyLessComparer
+{
+       bool operator()(const pair<String, Value>& a, const char *b)
+       {
+               return a.first < b;
+       }
+
+       bool operator()(const char *a, const pair<String, Value>& b)
+       {
+               return a < b.first;
+       }
+};
+
 /**
- * Retrieves a value from the dictionary.
+ * Restrieves a value from a dictionary.
  *
  * @param key The key whose value should be retrieved.
- * @returns The value or an empty value if the key was not found.
+ * @returns The value of an empty value if the key was not found.
  */
-Value Dictionary::Get(const String& key) const
+Value Dictionary::Get(const char *key) const
 {
        map<String, Value>::const_iterator it;
-       it = m_Data.find(key);
 
-       if (it == m_Data.end())
+       it = std::lower_bound(m_Data.begin(), m_Data.end(), key, DictionaryKeyLessComparer());
+
+       if (it == m_Data.end() || DictionaryKeyLessComparer()(key, *it))
                return Empty;
 
        return it->second;
 }
 
+/**
+ * Retrieves a value from the dictionary.
+ *
+ * @param key The key whose value should be retrieved.
+ * @returns The value or an empty value if the key was not found.
+ */
+Value Dictionary::Get(const String& key) const
+{
+       return Get(key.CStr());
+}
+
 /**
  * Sets a value in the dictionary.
  *
index 6dc8b2115097a261b2a281bff2b1cf4a4e25ebbc..76ee95d502b62dd899da7ce0cacc78fa58049040 100644 (file)
@@ -36,6 +36,7 @@ public:
 
        typedef map<String, Value>::iterator Iterator;
 
+       Value Get(const char *key) const;
        Value Get(const String& key) const;
        void Set(const String& key, const Value& value);
        String Add(const Value& value);
index bd26dc30e3138c9341e434b339f590183aefe004..a979002a7892b51d83989943389525f48c0cb532 100644 (file)
@@ -199,6 +199,26 @@ bool icinga::operator!=(const char *lhs, const String& rhs)
        return lhs != static_cast<std::string>(rhs);
 }
 
+bool icinga::operator<(const String& lhs, const char *rhs)
+{
+       return static_cast<std::string>(lhs) < rhs;
+}
+
+bool icinga::operator<(const char *lhs, const String& rhs)
+{
+       return lhs < static_cast<std::string>(rhs);
+}
+
+bool icinga::operator>(const String& lhs, const char *rhs)
+{
+       return static_cast<std::string>(lhs) > rhs;
+}
+
+bool icinga::operator>(const char *lhs, const String& rhs)
+{
+       return lhs > static_cast<std::string>(rhs);
+}
+
 String::Iterator icinga::range_begin(String& x)
 {
        return x.Begin();
index 6f18540620394cb1c4e5138bb215f6d62444644a..c76fcf6a273e4551592af8ed334e30cba0bb450f 100644 (file)
@@ -89,6 +89,11 @@ I2_BASE_API bool operator!=(const String& lhs, const String& rhs);
 I2_BASE_API bool operator!=(const String& lhs, const char *rhs);
 I2_BASE_API bool operator!=(const char *lhs, const String& rhs);
 
+I2_BASE_API bool operator<(const String& lhs, const char *rhs);
+I2_BASE_API bool operator<(const char *lhs, const String& rhs);
+I2_BASE_API bool operator>(const String& lhs, const char *rhs);
+I2_BASE_API bool operator>(const char *lhs, const String& rhs);
+
 I2_BASE_API String::Iterator range_begin(String& x);
 I2_BASE_API String::ConstIterator range_begin(const String& x);
 I2_BASE_API String::Iterator range_end(String& x);