diff options
Diffstat (limited to 'include/lldb/DataFormatters/FormattersContainer.h')
-rw-r--r-- | include/lldb/DataFormatters/FormattersContainer.h | 123 |
1 files changed, 56 insertions, 67 deletions
diff --git a/include/lldb/DataFormatters/FormattersContainer.h b/include/lldb/DataFormatters/FormattersContainer.h index 9d7d37343ac2..de2edb103151 100644 --- a/include/lldb/DataFormatters/FormattersContainer.h +++ b/include/lldb/DataFormatters/FormattersContainer.h @@ -47,7 +47,7 @@ static inline ConstString GetValidTypeName_Impl(ConstString type) { return type; std::string type_cstr(type.AsCString()); - lldb_utility::StringLexer type_lexer(type_cstr); + StringLexer type_lexer(type_cstr); type_lexer.AdvanceIf("class "); type_lexer.AdvanceIf("enum "); @@ -65,9 +65,9 @@ template <typename KeyType, typename ValueType> class FormattersContainer; template <typename KeyType, typename ValueType> class FormatMap { public: typedef typename ValueType::SharedPointer ValueSP; - typedef std::map<KeyType, ValueSP> MapType; + typedef std::vector<std::pair<KeyType, ValueSP>> MapType; typedef typename MapType::iterator MapIterator; - typedef std::function<bool(KeyType, const ValueSP &)> ForEachCallback; + typedef std::function<bool(const KeyType &, const ValueSP &)> ForEachCallback; FormatMap(IFormatChangeListener *lst) : m_map(), m_map_mutex(), listener(lst) {} @@ -79,20 +79,22 @@ public: entry->GetRevision() = 0; std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - m_map[name] = entry; + Delete(name); + m_map.emplace_back(std::move(name), std::move(entry)); if (listener) listener->Changed(); } - bool Delete(KeyType name) { + bool Delete(const KeyType &name) { std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - MapIterator iter = m_map.find(name); - if (iter == m_map.end()) - return false; - m_map.erase(name); - if (listener) - listener->Changed(); - return true; + for (MapIterator iter = m_map.begin(); iter != m_map.end(); ++iter) + if (iter->first == name) { + m_map.erase(iter); + if (listener) + listener->Changed(); + return true; + } + return false; } void Clear() { @@ -102,22 +104,22 @@ public: listener->Changed(); } - bool Get(KeyType name, ValueSP &entry) { + bool Get(const KeyType &name, ValueSP &entry) { std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - MapIterator iter = m_map.find(name); - if (iter == m_map.end()) - return false; - entry = iter->second; - return true; + for (const auto &pos : m_map) + if (pos.first == name) { + entry = pos.second; + return true; + } + return false; } void ForEach(ForEachCallback callback) { if (callback) { std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - MapIterator pos, end = m_map.end(); - for (pos = m_map.begin(); pos != end; pos++) { - KeyType type = pos->first; - if (!callback(type, pos->second)) + for (const auto &pos : m_map) { + const KeyType &type = pos.first; + if (!callback(type, pos.second)) break; } } @@ -127,28 +129,17 @@ public: ValueSP GetValueAtIndex(size_t index) { std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - MapIterator iter = m_map.begin(); - MapIterator end = m_map.end(); - while (index > 0) { - iter++; - index--; - if (end == iter) - return ValueSP(); - } - return iter->second; + if (index >= m_map.size()) + return ValueSP(); + return m_map[index].second; } + // If caller holds the mutex we could return a reference without copy ctor. KeyType GetKeyAtIndex(size_t index) { std::lock_guard<std::recursive_mutex> guard(m_map_mutex); - MapIterator iter = m_map.begin(); - MapIterator end = m_map.end(); - while (index > 0) { - iter++; - index--; - if (end == iter) - return KeyType(); - } - return iter->first; + if (index >= m_map.size()) + return {}; + return m_map[index].first; } protected: @@ -171,8 +162,8 @@ protected: public: typedef typename BackEndType::MapType MapType; typedef typename MapType::iterator MapIterator; - typedef typename MapType::key_type MapKeyType; - typedef typename MapType::mapped_type MapValueType; + typedef KeyType MapKeyType; + typedef std::shared_ptr<ValueType> MapValueType; typedef typename BackEndType::ForEachCallback ForEachCallback; typedef typename std::shared_ptr<FormattersContainer<KeyType, ValueType>> SharedPointer; @@ -182,8 +173,8 @@ public: FormattersContainer(std::string name, IFormatChangeListener *lst) : m_format_map(lst), m_name(name) {} - void Add(const MapKeyType &type, const MapValueType &entry) { - Add_Impl(type, entry, static_cast<KeyType *>(nullptr)); + void Add(MapKeyType type, const MapValueType &entry) { + Add_Impl(std::move(type), entry, static_cast<KeyType *>(nullptr)); } bool Delete(ConstString type) { @@ -233,9 +224,9 @@ protected: DISALLOW_COPY_AND_ASSIGN(FormattersContainer); - void Add_Impl(const MapKeyType &type, const MapValueType &entry, - lldb::RegularExpressionSP *dummy) { - m_format_map.Add(type, entry); + void Add_Impl(MapKeyType type, const MapValueType &entry, + RegularExpression *dummy) { + m_format_map.Add(std::move(type), entry); } void Add_Impl(ConstString type, const MapValueType &entry, @@ -247,12 +238,12 @@ protected: return m_format_map.Delete(type); } - bool Delete_Impl(ConstString type, lldb::RegularExpressionSP *dummy) { + bool Delete_Impl(ConstString type, RegularExpression *dummy) { std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex()); MapIterator pos, end = m_format_map.map().end(); for (pos = m_format_map.map().begin(); pos != end; pos++) { - lldb::RegularExpressionSP regex = pos->first; - if (type.GetStringRef() == regex->GetText()) { + const RegularExpression ®ex = pos->first; + if (type.GetStringRef() == regex.GetText()) { m_format_map.map().erase(pos); if (m_format_map.listener) m_format_map.listener->Changed(); @@ -282,24 +273,23 @@ protected: } lldb::TypeNameSpecifierImplSP - GetTypeNameSpecifierAtIndex_Impl(size_t index, - lldb::RegularExpressionSP *dummy) { - lldb::RegularExpressionSP regex = m_format_map.GetKeyAtIndex(index); - if (regex.get() == nullptr) + GetTypeNameSpecifierAtIndex_Impl(size_t index, RegularExpression *dummy) { + RegularExpression regex = m_format_map.GetKeyAtIndex(index); + if (regex == RegularExpression()) return lldb::TypeNameSpecifierImplSP(); return lldb::TypeNameSpecifierImplSP( - new TypeNameSpecifierImpl(regex->GetText().str().c_str(), true)); + new TypeNameSpecifierImpl(regex.GetText().str().c_str(), true)); } bool Get_Impl(ConstString key, MapValueType &value, - lldb::RegularExpressionSP *dummy) { + RegularExpression *dummy) { llvm::StringRef key_str = key.GetStringRef(); std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) { - lldb::RegularExpressionSP regex = pos->first; - if (regex->Execute(key_str)) { - value = pos->second; + // Patterns are matched in reverse-chronological order. + for (const auto &pos : llvm::reverse(m_format_map.map())) { + const RegularExpression ®ex = pos.first; + if (regex.Execute(key_str)) { + value = pos.second; return true; } } @@ -307,13 +297,12 @@ protected: } bool GetExact_Impl(ConstString key, MapValueType &value, - lldb::RegularExpressionSP *dummy) { + RegularExpression *dummy) { std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) { - lldb::RegularExpressionSP regex = pos->first; - if (regex->GetText() == key.GetStringRef()) { - value = pos->second; + for (const auto &pos : m_format_map.map()) { + const RegularExpression ®ex = pos.first; + if (regex.GetText() == key.GetStringRef()) { + value = pos.second; return true; } } |