[Lldb-commits] [lldb] 2f2f41e - RangeDataVector: Support custom sorting for D63540
Jan Kratochvil via lldb-commits
lldb-commits at lists.llvm.org
Fri Jan 10 06:16:51 PST 2020
Author: Jan Kratochvil
Date: 2020-01-10T15:14:38+01:00
New Revision: 2f2f41e12c5201b600d887d22ce5cb4afd2ff594
URL: https://github.com/llvm/llvm-project/commit/2f2f41e12c5201b600d887d22ce5cb4afd2ff594
DIFF: https://github.com/llvm/llvm-project/commit/2f2f41e12c5201b600d887d22ce5cb4afd2ff594.diff
LOG: RangeDataVector: Support custom sorting for D63540
As suggested by @labath extended RangeDataVector so that user can provide
custom sorting of the Entry's `data' field for D63540.
https://reviews.llvm.org/D63540
RangeData functions were used just by RangeDataVector (=after I removed them
LLDB still builds fine) which no longer uses them so I removed them.
Differential revision: https://reviews.llvm.org/D72460
Added:
Modified:
lldb/include/lldb/Utility/RangeMap.h
lldb/unittests/Utility/RangeMapTest.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/Utility/RangeMap.h b/lldb/include/lldb/Utility/RangeMap.h
index 709b5d2f66c7..9e0307351836 100644
--- a/lldb/include/lldb/Utility/RangeMap.h
+++ b/lldb/include/lldb/Utility/RangeMap.h
@@ -599,36 +599,17 @@ struct RangeData : public Range<B, S> {
RangeData(B base, S size) : Range<B, S>(base, size), data() {}
RangeData(B base, S size, DataType d) : Range<B, S>(base, size), data(d) {}
-
- bool operator<(const RangeData &rhs) const {
- if (this->base == rhs.base) {
- if (this->size == rhs.size)
- return this->data < rhs.data;
- else
- return this->size < rhs.size;
- }
- return this->base < rhs.base;
- }
-
- bool operator==(const RangeData &rhs) const {
- return this->GetRangeBase() == rhs.GetRangeBase() &&
- this->GetByteSize() == rhs.GetByteSize() && this->data == rhs.data;
- }
-
- bool operator!=(const RangeData &rhs) const {
- return this->GetRangeBase() != rhs.GetRangeBase() ||
- this->GetByteSize() != rhs.GetByteSize() || this->data != rhs.data;
- }
};
-template <typename B, typename S, typename T, unsigned N = 0>
+template <typename B, typename S, typename T, unsigned N = 0,
+ class Compare = std::less<T>>
class RangeDataVector {
public:
typedef lldb_private::Range<B, S> Range;
typedef RangeData<B, S, T> Entry;
typedef llvm::SmallVector<Entry, N> Collection;
- RangeDataVector() = default;
+ RangeDataVector(Compare compare = Compare()) : m_compare(compare) {}
~RangeDataVector() = default;
@@ -636,7 +617,14 @@ class RangeDataVector {
void Sort() {
if (m_entries.size() > 1)
- std::stable_sort(m_entries.begin(), m_entries.end());
+ std::stable_sort(m_entries.begin(), m_entries.end(),
+ [&compare = m_compare](const Entry &a, const Entry &b) {
+ if (a.base != b.base)
+ return a.base < b.base;
+ if (a.size != b.size)
+ return a.size < b.size;
+ return compare(a.data, b.data);
+ });
}
#ifdef ASSERT_RANGEMAP_ARE_SORTED
@@ -817,6 +805,7 @@ class RangeDataVector {
protected:
Collection m_entries;
+ Compare m_compare;
};
// A simple range with data class where you get to define the type of
diff --git a/lldb/unittests/Utility/RangeMapTest.cpp b/lldb/unittests/Utility/RangeMapTest.cpp
index ebb49cc67ed5..9f9b96559a4c 100644
--- a/lldb/unittests/Utility/RangeMapTest.cpp
+++ b/lldb/unittests/Utility/RangeMapTest.cpp
@@ -52,3 +52,45 @@ TEST(RangeDataVector, FindEntryThatContains_Overlap) {
// TODO: This should probably return the range (0, 40) as well.
EXPECT_THAT(Map.FindEntryThatContains(35), nullptr);
}
+
+TEST(RangeDataVector, CustomSort) {
+ // First the default ascending order sorting of the data field.
+ auto Map = RangeDataVectorT();
+ Map.Append(EntryT(0, 10, 50));
+ Map.Append(EntryT(0, 10, 52));
+ Map.Append(EntryT(0, 10, 53));
+ Map.Append(EntryT(0, 10, 51));
+ Map.Sort();
+
+ EXPECT_THAT(Map.GetSize(), 4);
+ EXPECT_THAT(Map.GetEntryRef(0).data, 50);
+ EXPECT_THAT(Map.GetEntryRef(1).data, 51);
+ EXPECT_THAT(Map.GetEntryRef(2).data, 52);
+ EXPECT_THAT(Map.GetEntryRef(3).data, 53);
+
+ // And then a custom descending order sorting of the data field.
+ class CtorParam {};
+ class CustomSort {
+ public:
+ CustomSort(CtorParam) {}
+ bool operator()(const uint32_t a_data, const uint32_t b_data) {
+ return a_data > b_data;
+ }
+ };
+ using RangeDataVectorCustomSortT =
+ RangeDataVector<uint32_t, uint32_t, uint32_t, 0, CustomSort>;
+ using EntryT = RangeDataVectorT::Entry;
+
+ auto MapC = RangeDataVectorCustomSortT(CtorParam());
+ MapC.Append(EntryT(0, 10, 50));
+ MapC.Append(EntryT(0, 10, 52));
+ MapC.Append(EntryT(0, 10, 53));
+ MapC.Append(EntryT(0, 10, 51));
+ MapC.Sort();
+
+ EXPECT_THAT(MapC.GetSize(), 4);
+ EXPECT_THAT(MapC.GetEntryRef(0).data, 53);
+ EXPECT_THAT(MapC.GetEntryRef(1).data, 52);
+ EXPECT_THAT(MapC.GetEntryRef(2).data, 51);
+ EXPECT_THAT(MapC.GetEntryRef(3).data, 50);
+}
More information about the lldb-commits
mailing list