P->second.~ValueT();
P->first.~KeyT();
}
- delete[] reinterpret_cast<char*>(Buckets);
+ operator delete(Buckets);
}
typedef DenseMapIterator<KeyT, ValueT, KeyInfoT> iterator;
return end();
}
- bool insert(const std::pair<KeyT, ValueT> &KV) {
+ std::pair<iterator, bool> insert(const std::pair<KeyT, ValueT> &KV) {
BucketT *TheBucket;
if (LookupBucketFor(KV.first, TheBucket))
- return false; // Already in map.
+ return std::make_pair(iterator(TheBucket, Buckets+NumBuckets),
+ false); // Already in map.
// Otherwise, insert the new element.
- InsertIntoBucket(KV.first, KV.second, TheBucket);
- return true;
+ TheBucket = InsertIntoBucket(KV.first, KV.second, TheBucket);
+ return std::make_pair(iterator(TheBucket, Buckets+NumBuckets),
+ true);
}
bool erase(const KeyT &Val) {
NumTombstones = other.NumTombstones;
if (NumBuckets)
- delete[] reinterpret_cast<char*>(Buckets);
- Buckets = reinterpret_cast<BucketT*>(new char[sizeof(BucketT) *
- other.NumBuckets]);
+ operator delete(Buckets);
+ Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) *
+ other.NumBuckets));
if (KeyInfoT::isPod() && ValueInfoT::isPod())
memcpy(Buckets, other.Buckets, other.NumBuckets * sizeof(BucketT));
else
for (size_t i = 0; i < other.NumBuckets; ++i) {
- new (Buckets[i].first) KeyT(other.Buckets[i].first);
+ new (&Buckets[i].first) KeyT(other.Buckets[i].first);
if (!KeyInfoT::isEqual(Buckets[i].first, getEmptyKey()) &&
!KeyInfoT::isEqual(Buckets[i].first, getTombstoneKey()))
new (&Buckets[i].second) ValueT(other.Buckets[i].second);
NumEntries = 0;
NumTombstones = 0;
NumBuckets = InitBuckets;
- assert(InitBuckets && (InitBuckets & InitBuckets-1) == 0 &&
+ assert(InitBuckets && (InitBuckets & (InitBuckets-1)) == 0 &&
"# initial buckets must be a power of two!");
- Buckets = reinterpret_cast<BucketT*>(new char[sizeof(BucketT)*InitBuckets]);
+ Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT)*InitBuckets));
// Initialize all the keys to EmptyKey.
const KeyT EmptyKey = getEmptyKey();
for (unsigned i = 0; i != InitBuckets; ++i)
while (NumBuckets <= AtLeast)
NumBuckets <<= 1;
NumTombstones = 0;
- Buckets = reinterpret_cast<BucketT*>(new char[sizeof(BucketT)*NumBuckets]);
+ Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT)*NumBuckets));
// Initialize all the keys to EmptyKey.
const KeyT EmptyKey = getEmptyKey();
}
// Free the old table.
- delete[] reinterpret_cast<char*>(OldBuckets);
+ operator delete(OldBuckets);
}
void shrink_and_clear() {
NumBuckets = NumEntries > 32 ? 1 << (Log2_32_Ceil(NumEntries) + 1)
: 64;
NumTombstones = 0;
- Buckets = reinterpret_cast<BucketT*>(new char[sizeof(BucketT)*NumBuckets]);
+ Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT)*NumBuckets));
// Initialize all the keys to EmptyKey.
const KeyT EmptyKey = getEmptyKey();
}
// Free the old table.
- delete[] reinterpret_cast<char*>(OldBuckets);
+ operator delete(OldBuckets);
NumEntries = 0;
}