Move-enable IntrusiveRefCntPtr.

These tend to be copied around a lot, moving it instead saves a ton of memory
accesses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157535 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2012-05-27 16:22:08 +00:00
parent 542c063f96
commit e3f75f8797

View File

@ -21,9 +21,8 @@
#ifndef LLVM_ADT_INTRUSIVE_REF_CNT_PTR
#define LLVM_ADT_INTRUSIVE_REF_CNT_PTR
#include <cassert>
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
@ -123,6 +122,17 @@ namespace llvm {
retain();
}
#if LLVM_USE_RVALUE_REFERENCES
IntrusiveRefCntPtr(IntrusiveRefCntPtr&& S) : Obj(S.Obj) {
S.Obj = 0;
}
template <class X>
IntrusiveRefCntPtr(IntrusiveRefCntPtr<X>&& S) : Obj(S.getPtr()) {
S.Obj = 0;
}
#endif
template <class X>
IntrusiveRefCntPtr(const IntrusiveRefCntPtr<X>& S)
: Obj(S.getPtr()) {
@ -134,6 +144,21 @@ namespace llvm {
return *this;
}
#if LLVM_USE_RVALUE_REFERENCES
IntrusiveRefCntPtr& operator=(IntrusiveRefCntPtr&& S) {
Obj = S.Obj;
S.Obj = 0;
return *this;
}
template <class X>
IntrusiveRefCntPtr& operator=(IntrusiveRefCntPtr<X>&& S) {
Obj = S.getPtr();
S.Obj = 0;
return *this;
}
#endif
template <class X>
IntrusiveRefCntPtr& operator=(const IntrusiveRefCntPtr<X>& S) {
replace(S.getPtr());