diff --git a/lldb/include/lldb/Target/PathMappingList.h b/lldb/include/lldb/Target/PathMappingList.h index 2cf9569358f52..82c87ebbbcda2 100644 --- a/lldb/include/lldb/Target/PathMappingList.h +++ b/lldb/include/lldb/Target/PathMappingList.h @@ -61,8 +61,10 @@ class PathMappingList { return m_pairs.size(); } - bool GetPathsAtIndex(uint32_t idx, ConstString &path, - ConstString &new_path) const; + /// Invokes callback for each pair of paths in the list. The callback can + /// return false to immediately stop iteration. + void ForEach(std::function + callback) const; void Insert(llvm::StringRef path, llvm::StringRef replacement, uint32_t insert_idx, bool notify); diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index fe421adfe8709..2eb58471c2960 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -1139,15 +1139,16 @@ class CommandObjectTargetModulesSearchPathsInsert : public CommandObjectParsed { Target *target = m_exe_ctx.GetTargetPtr(); const PathMappingList &list = target->GetImageSearchPathList(); - const size_t num = list.GetSize(); - ConstString old_path, new_path; - for (size_t i = 0; i < num; ++i) { - if (!list.GetPathsAtIndex(i, old_path, new_path)) - break; - StreamString strm; - strm << old_path << " -> " << new_path; - request.TryCompleteCurrentArg(std::to_string(i), strm.GetString()); - } + + StreamString strm; + list.ForEach([&](size_t index, llvm::StringRef orig_path, + llvm::StringRef remap_path) { + strm << orig_path << " -> " << remap_path; + request.TryCompleteCurrentArg(std::to_string(index), strm.GetString()); + + strm.Clear(); + return true; + }); } protected: diff --git a/lldb/source/Target/PathMappingList.cpp b/lldb/source/Target/PathMappingList.cpp index 0465b4280bbb1..00ca72b4faed7 100644 --- a/lldb/source/Target/PathMappingList.cpp +++ b/lldb/source/Target/PathMappingList.cpp @@ -346,15 +346,14 @@ PathMappingList::FindIteratorForPath(ConstString path) { return pos; } -bool PathMappingList::GetPathsAtIndex(uint32_t idx, ConstString &path, - ConstString &new_path) const { +void PathMappingList::ForEach( + std::function callback) + const { std::lock_guard lock(m_pairs_mutex); - if (idx < m_pairs.size()) { - path = m_pairs[idx].first; - new_path = m_pairs[idx].second; - return true; - } - return false; + size_t index = 0; + for (const auto &[original, replacement] : m_pairs) + if (!callback(index++, original, replacement)) + break; } uint32_t