diff options
Diffstat (limited to 'contrib/llvm/lib/Support/SmallPtrSet.cpp')
| -rw-r--r-- | contrib/llvm/lib/Support/SmallPtrSet.cpp | 80 | 
1 files changed, 69 insertions, 11 deletions
diff --git a/contrib/llvm/lib/Support/SmallPtrSet.cpp b/contrib/llvm/lib/Support/SmallPtrSet.cpp index dd417b453ef0..a80e095ec35a 100644 --- a/contrib/llvm/lib/Support/SmallPtrSet.cpp +++ b/contrib/llvm/lib/Support/SmallPtrSet.cpp @@ -20,7 +20,7 @@  using namespace llvm; -void SmallPtrSetImpl::shrink_and_clear() { +void SmallPtrSetImplBase::shrink_and_clear() {    assert(!isSmall() && "Can't shrink a small set!");    free(CurArray); @@ -34,7 +34,7 @@ void SmallPtrSetImpl::shrink_and_clear() {    memset(CurArray, -1, CurArraySize*sizeof(void*));  } -bool SmallPtrSetImpl::insert_imp(const void * Ptr) { +bool SmallPtrSetImplBase::insert_imp(const void * Ptr) {    if (isSmall()) {      // Check to see if it is already in the set.      for (const void **APtr = SmallArray, **E = SmallArray+NumElements; @@ -71,7 +71,7 @@ bool SmallPtrSetImpl::insert_imp(const void * Ptr) {    return true;  } -bool SmallPtrSetImpl::erase_imp(const void * Ptr) { +bool SmallPtrSetImplBase::erase_imp(const void * Ptr) {    if (isSmall()) {      // Check to see if it is in the set.      for (const void **APtr = SmallArray, **E = SmallArray+NumElements; @@ -98,12 +98,12 @@ bool SmallPtrSetImpl::erase_imp(const void * Ptr) {    return true;  } -const void * const *SmallPtrSetImpl::FindBucketFor(const void *Ptr) const { +const void * const *SmallPtrSetImplBase::FindBucketFor(const void *Ptr) const {    unsigned Bucket = DenseMapInfo<void *>::getHashValue(Ptr) & (CurArraySize-1);    unsigned ArraySize = CurArraySize;    unsigned ProbeAmt = 1;    const void *const *Array = CurArray; -  const void *const *Tombstone = 0; +  const void *const *Tombstone = nullptr;    while (1) {      // Found Ptr's bucket?      if (Array[Bucket] == Ptr) @@ -127,7 +127,7 @@ const void * const *SmallPtrSetImpl::FindBucketFor(const void *Ptr) const {  /// Grow - Allocate a larger backing store for the buckets and move it over.  /// -void SmallPtrSetImpl::Grow(unsigned NewSize) { +void SmallPtrSetImplBase::Grow(unsigned NewSize) {    // Allocate at twice as many buckets, but at least 128.    unsigned OldSize = CurArraySize; @@ -163,8 +163,8 @@ void SmallPtrSetImpl::Grow(unsigned NewSize) {    }  } -SmallPtrSetImpl::SmallPtrSetImpl(const void **SmallStorage, -                                 const SmallPtrSetImpl& that) { +SmallPtrSetImplBase::SmallPtrSetImplBase(const void **SmallStorage, +                                 const SmallPtrSetImplBase& that) {    SmallArray = SmallStorage;    // If we're becoming small, prepare to insert into our stack space @@ -186,9 +186,39 @@ SmallPtrSetImpl::SmallPtrSetImpl(const void **SmallStorage,    NumTombstones = that.NumTombstones;  } +SmallPtrSetImplBase::SmallPtrSetImplBase(const void **SmallStorage, +                                         unsigned SmallSize, +                                         SmallPtrSetImplBase &&that) { +  SmallArray = SmallStorage; + +  // Copy over the basic members. +  CurArraySize = that.CurArraySize; +  NumElements = that.NumElements; +  NumTombstones = that.NumTombstones; + +  // When small, just copy into our small buffer. +  if (that.isSmall()) { +    CurArray = SmallArray; +    memcpy(CurArray, that.CurArray, sizeof(void *) * CurArraySize); +    return; +  } + +  // Otherwise, we steal the large memory allocation and no copy is needed. +  CurArray = that.CurArray; +  that.CurArray = that.SmallArray; + +  // Make the "that" object small and empty. +  that.CurArraySize = SmallSize; +  assert(that.CurArray == that.SmallArray); +  that.NumElements = 0; +  that.NumTombstones = 0; +} +  /// CopyFrom - implement operator= from a smallptrset that has the same pointer  /// type, but may have a different small size. -void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) { +void SmallPtrSetImplBase::CopyFrom(const SmallPtrSetImplBase &RHS) { +  assert(&RHS != this && "Self-copy should be handled by the caller."); +    if (isSmall() && RHS.isSmall())      assert(CurArraySize == RHS.CurArraySize &&             "Cannot assign sets with different small sizes"); @@ -222,7 +252,35 @@ void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) {    NumTombstones = RHS.NumTombstones;  } -void SmallPtrSetImpl::swap(SmallPtrSetImpl &RHS) { +void SmallPtrSetImplBase::MoveFrom(unsigned SmallSize, +                                   SmallPtrSetImplBase &&RHS) { +  assert(&RHS != this && "Self-move should be handled by the caller."); + +  if (!isSmall()) +    free(CurArray); + +  if (RHS.isSmall()) { +    // Copy a small RHS rather than moving. +    CurArray = SmallArray; +    memcpy(CurArray, RHS.CurArray, sizeof(void*)*RHS.CurArraySize); +  } else { +    CurArray = RHS.CurArray; +    RHS.CurArray = RHS.SmallArray; +  } + +  // Copy the rest of the trivial members. +  CurArraySize = RHS.CurArraySize; +  NumElements = RHS.NumElements; +  NumTombstones = RHS.NumTombstones; + +  // Make the RHS small and empty. +  RHS.CurArraySize = SmallSize; +  assert(RHS.CurArray == RHS.SmallArray); +  RHS.NumElements = 0; +  RHS.NumTombstones = 0; +} + +void SmallPtrSetImplBase::swap(SmallPtrSetImplBase &RHS) {    if (this == &RHS) return;    // We can only avoid copying elements if neither set is small. @@ -272,7 +330,7 @@ void SmallPtrSetImpl::swap(SmallPtrSetImpl &RHS) {    std::swap(this->NumElements, RHS.NumElements);  } -SmallPtrSetImpl::~SmallPtrSetImpl() { +SmallPtrSetImplBase::~SmallPtrSetImplBase() {    if (!isSmall())      free(CurArray);  }  | 
