[llvm] r245192 - [ADT] Teach FoldingSet to be movable.
Chandler Carruth via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 16 16:27:59 PDT 2015
Annoyingly we only have a unit test for the hashing part of FoldingSet. =/
I didn't really want to add one just for this but I can.
I do have a patch under review already that uses this (and fails
spectacularly if this patch isn't in place) so it won't be uncovered by
code in-tree, but I do see the value of unittests in general for this kind
of stuff.
On Sun, Aug 16, 2015 at 4:22 PM David Blaikie via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> On Sun, Aug 16, 2015 at 4:17 PM, Chandler Carruth via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: chandlerc
>> Date: Sun Aug 16 18:17:27 2015
>> New Revision: 245192
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=245192&view=rev
>> Log:
>> [ADT] Teach FoldingSet to be movable.
>>
>> This is a very minimal move support - it leaves the moved-from object in
>> a zombie state that is only valid for destruction and move assignment.
>> This seems fine to me, and leaving it in the default constructed state
>> would require adding more state to the object and potentially allocating
>> memory (!!!) and so seems like a Bad Idea.
>>
>
> Might be worth a unit test (possibly with a move-only value, or even a
> move-and-copyable value that checks that it only gets moved - actually, I
> assume neither happens, so perhaps it can be done with a non-copyable,
> non-movable type?)
>
> - Dave
>
>
>>
>> Modified:
>> llvm/trunk/include/llvm/ADT/FoldingSet.h
>> llvm/trunk/lib/Support/FoldingSet.cpp
>>
>> Modified: llvm/trunk/include/llvm/ADT/FoldingSet.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/FoldingSet.h?rev=245192&r1=245191&r2=245192&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/FoldingSet.h (original)
>> +++ llvm/trunk/include/llvm/ADT/FoldingSet.h Sun Aug 16 18:17:27 2015
>> @@ -122,9 +122,10 @@ protected:
>> /// is greater than twice the number of buckets.
>> unsigned NumNodes;
>>
>> - ~FoldingSetImpl();
>> -
>> explicit FoldingSetImpl(unsigned Log2InitSize = 6);
>> + FoldingSetImpl(FoldingSetImpl &&Arg);
>> + FoldingSetImpl &operator=(FoldingSetImpl &&RHS);
>> + ~FoldingSetImpl();
>>
>> public:
>>
>> //===--------------------------------------------------------------------===//
>> @@ -391,6 +392,10 @@ DefaultContextualFoldingSetTrait<T, Ctx>
>> /// implementation of the folding set to the node class T. T must be a
>> /// subclass of FoldingSetNode and implement a Profile function.
>> ///
>> +/// Note that this set type is movable and move-assignable. However, its
>> +/// moved-from state is not a valid state for anything other than
>> +/// move-assigning and destroying. This is primarily to enable movable
>> APIs
>> +/// that incorporate these objects.
>> template <class T> class FoldingSet final : public FoldingSetImpl {
>> private:
>> /// GetNodeProfile - Each instantiatation of the FoldingSet needs to
>> provide a
>> @@ -415,8 +420,13 @@ private:
>>
>> public:
>> explicit FoldingSet(unsigned Log2InitSize = 6)
>> - : FoldingSetImpl(Log2InitSize)
>> - {}
>> + : FoldingSetImpl(Log2InitSize) {}
>> +
>> + FoldingSet(FoldingSet &&Arg) : FoldingSetImpl(std::move(Arg)) {}
>> + FoldingSet &operator=(FoldingSet &&RHS) {
>> + (void)FoldingSetImpl::operator=(std::move(RHS));
>> + return *this;
>> + }
>>
>> typedef FoldingSetIterator<T> iterator;
>> iterator begin() { return iterator(Buckets); }
>>
>> Modified: llvm/trunk/lib/Support/FoldingSet.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FoldingSet.cpp?rev=245192&r1=245191&r2=245192&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Support/FoldingSet.cpp (original)
>> +++ llvm/trunk/lib/Support/FoldingSet.cpp Sun Aug 16 18:17:27 2015
>> @@ -232,9 +232,29 @@ FoldingSetImpl::FoldingSetImpl(unsigned
>> Buckets = AllocateBuckets(NumBuckets);
>> NumNodes = 0;
>> }
>> +
>> +FoldingSetImpl::FoldingSetImpl(FoldingSetImpl &&Arg)
>> + : Buckets(Arg.Buckets), NumBuckets(Arg.NumBuckets),
>> NumNodes(Arg.NumNodes) {
>> + Arg.Buckets = nullptr;
>> + Arg.NumBuckets = 0;
>> + Arg.NumNodes = 0;
>> +}
>> +
>> +FoldingSetImpl &FoldingSetImpl::operator=(FoldingSetImpl &&RHS) {
>> + free(Buckets); // This may be null if the set is in a moved-from state.
>> + Buckets = RHS.Buckets;
>> + NumBuckets = RHS.NumBuckets;
>> + NumNodes = RHS.NumNodes;
>> + RHS.Buckets = nullptr;
>> + RHS.NumBuckets = 0;
>> + RHS.NumNodes = 0;
>> + return *this;
>> +}
>> +
>> FoldingSetImpl::~FoldingSetImpl() {
>> free(Buckets);
>> }
>> +
>> void FoldingSetImpl::clear() {
>> // Set all but the last bucket to null pointers.
>> memset(Buckets, 0, NumBuckets*sizeof(void*));
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150816/f9d4d093/attachment.html>
More information about the llvm-commits
mailing list