-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[NFC] Use unique_ptr in SparseSet #116617
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[NFC] Use unique_ptr in SparseSet #116617
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
@llvm/pr-subscribers-llvm-adt Author: Akshat Oke (optimisan) ChangesThis allows implementing the move constructor. Full diff: https://github.com/llvm/llvm-project/pull/116617.diff 1 Files Affected:
diff --git a/llvm/include/llvm/ADT/SparseSet.h b/llvm/include/llvm/ADT/SparseSet.h
index c7793117ff5408..1adae0d4595ac4 100644
--- a/llvm/include/llvm/ADT/SparseSet.h
+++ b/llvm/include/llvm/ADT/SparseSet.h
@@ -129,7 +129,12 @@ class SparseSet {
using DenseT = SmallVector<ValueT, 8>;
using size_type = unsigned;
DenseT Dense;
- SparseT *Sparse = nullptr;
+
+ struct Deleter {
+ void operator()(SparseT *S) { free(S); }
+ };
+ std::unique_ptr<SparseT, Deleter> Sparse;
+
unsigned Universe = 0;
KeyFunctorT KeyIndexOf;
SparseSetValFunctor<KeyT, ValueT, KeyFunctorT> ValIndexOf;
@@ -144,7 +149,7 @@ class SparseSet {
SparseSet() = default;
SparseSet(const SparseSet &) = delete;
SparseSet &operator=(const SparseSet &) = delete;
- ~SparseSet() { free(Sparse); }
+ SparseSet(SparseSet &&) = default;
/// setUniverse - Set the universe size which determines the largest key the
/// set can hold. The universe must be sized before any elements can be
@@ -159,11 +164,10 @@ class SparseSet {
// Hysteresis prevents needless reallocations.
if (U >= Universe/4 && U <= Universe)
return;
- free(Sparse);
// The Sparse array doesn't actually need to be initialized, so malloc
// would be enough here, but that will cause tools like valgrind to
// complain about branching on uninitialized data.
- Sparse = static_cast<SparseT*>(safe_calloc(U, sizeof(SparseT)));
+ Sparse.reset(static_cast<SparseT *>(safe_calloc(U, sizeof(SparseT))));
Universe = U;
}
@@ -205,7 +209,7 @@ class SparseSet {
assert(Idx < Universe && "Key out of range");
assert(Sparse != nullptr && "Invalid sparse type");
const unsigned Stride = std::numeric_limits<SparseT>::max() + 1u;
- for (unsigned i = Sparse[Idx], e = size(); i < e; i += Stride) {
+ for (unsigned i = Sparse.get()[Idx], e = size(); i < e; i += Stride) {
const unsigned FoundIdx = ValIndexOf(Dense[i]);
assert(FoundIdx < Universe && "Invalid key in set. Did object mutate?");
if (Idx == FoundIdx)
@@ -255,7 +259,7 @@ class SparseSet {
iterator I = findIndex(Idx);
if (I != end())
return std::make_pair(I, false);
- Sparse[Idx] = size();
+ Sparse.get()[Idx] = size();
Dense.push_back(Val);
return std::make_pair(end() - 1, true);
}
@@ -292,7 +296,7 @@ class SparseSet {
*I = Dense.back();
unsigned BackIdx = ValIndexOf(Dense.back());
assert(BackIdx < Universe && "Invalid key in set. Did object mutate?");
- Sparse[BackIdx] = I - begin();
+ Sparse.get()[BackIdx] = I - begin();
}
// This depends on SmallVector::pop_back() not invalidating iterators.
// std::vector::pop_back() doesn't give that guarantee.
|
llvm/include/llvm/ADT/SparseSet.h
Outdated
@@ -205,7 +209,7 @@ class SparseSet { | |||
assert(Idx < Universe && "Key out of range"); | |||
assert(Sparse != nullptr && "Invalid sparse type"); | |||
const unsigned Stride = std::numeric_limits<SparseT>::max() + 1u; | |||
for (unsigned i = Sparse[Idx], e = size(); i < e; i += Stride) { | |||
for (unsigned i = Sparse.get()[Idx], e = size(); i < e; i += Stride) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you make the std::unique_ptr<SparseT, Deleter>
into a std::unique_ptr<SparseT[], Deleter>
then you can use [] directly without the .get()
I think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right.
Oh, and please add unit test coverage for the new move functionality. |
a001cd1
to
74150e7
Compare
4d29a87
to
1de6feb
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM - thanks!
74150e7
to
f3ca5cd
Compare
1de6feb
to
a1eb74a
Compare
f3ca5cd
to
c89ffe2
Compare
This allows implementing the move constructor.
a1eb74a
to
175470e
Compare
This allows implementing the move constructor.