Make possible to release allocated memory when clearing containers
This commit is contained in:
parent
5cdf66d009
commit
62a72eadac
|
@ -243,10 +243,7 @@ class List {
|
||||||
if (mCapacity > 0) {
|
if (mCapacity > 0) {
|
||||||
|
|
||||||
// Clear the list
|
// Clear the list
|
||||||
clear();
|
clear(true);
|
||||||
|
|
||||||
// Release the memory allocated on the heap
|
|
||||||
mAllocator.release(mBuffer, mCapacity * sizeof(T));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +362,7 @@ class List {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear the list
|
/// Clear the list
|
||||||
void clear() {
|
void clear(bool releaseMemory = false) {
|
||||||
|
|
||||||
// Call the destructor of each element
|
// Call the destructor of each element
|
||||||
for (uint i=0; i < mSize; i++) {
|
for (uint i=0; i < mSize; i++) {
|
||||||
|
@ -373,6 +370,16 @@ class List {
|
||||||
}
|
}
|
||||||
|
|
||||||
mSize = 0;
|
mSize = 0;
|
||||||
|
|
||||||
|
// If we need to release all the allocated memory
|
||||||
|
if (releaseMemory && mCapacity > 0) {
|
||||||
|
|
||||||
|
// Release the memory allocated on the heap
|
||||||
|
mAllocator.release(mBuffer, mCapacity * sizeof(T));
|
||||||
|
|
||||||
|
mBuffer = nullptr;
|
||||||
|
mCapacity = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the number of elements in the list
|
/// Return the number of elements in the list
|
||||||
|
|
|
@ -240,32 +240,6 @@ class Map {
|
||||||
return number;
|
return number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear and reset the map
|
|
||||||
void reset() {
|
|
||||||
|
|
||||||
// If elements have been allocated
|
|
||||||
if (mCapacity > 0) {
|
|
||||||
|
|
||||||
// Clear the map
|
|
||||||
clear();
|
|
||||||
|
|
||||||
// Destroy the entries
|
|
||||||
for (int i=0; i < mCapacity; i++) {
|
|
||||||
mEntries[i].~Entry();
|
|
||||||
}
|
|
||||||
|
|
||||||
mAllocator.release(mBuckets, mCapacity * sizeof(int));
|
|
||||||
mAllocator.release(mEntries, mCapacity * sizeof(Entry));
|
|
||||||
|
|
||||||
mNbUsedEntries = 0;
|
|
||||||
mNbFreeEntries = 0;
|
|
||||||
mCapacity = 0;
|
|
||||||
mBuckets = nullptr;
|
|
||||||
mEntries = nullptr;
|
|
||||||
mFreeIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Class Iterator
|
/// Class Iterator
|
||||||
|
@ -423,7 +397,7 @@ class Map {
|
||||||
/// Destructor
|
/// Destructor
|
||||||
~Map() {
|
~Map() {
|
||||||
|
|
||||||
reset();
|
clear(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocate memory for a given number of elements
|
/// Allocate memory for a given number of elements
|
||||||
|
@ -577,11 +551,13 @@ class Map {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear the map
|
/// Clear the map
|
||||||
void clear() {
|
void clear(bool releaseMemory = false) {
|
||||||
|
|
||||||
if (mNbUsedEntries > 0) {
|
if (mNbUsedEntries > 0) {
|
||||||
|
|
||||||
|
// Remove the key/value pair of each entry
|
||||||
for (int i=0; i < mCapacity; i++) {
|
for (int i=0; i < mCapacity; i++) {
|
||||||
|
|
||||||
mBuckets[i] = -1;
|
mBuckets[i] = -1;
|
||||||
mEntries[i].next = -1;
|
mEntries[i].next = -1;
|
||||||
if (mEntries[i].keyValue != nullptr) {
|
if (mEntries[i].keyValue != nullptr) {
|
||||||
|
@ -596,6 +572,23 @@ class Map {
|
||||||
mNbFreeEntries = 0;
|
mNbFreeEntries = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If elements have been allocated
|
||||||
|
if (releaseMemory && mCapacity > 0) {
|
||||||
|
|
||||||
|
// Destroy the entries
|
||||||
|
for (int i=0; i < mCapacity; i++) {
|
||||||
|
mEntries[i].~Entry();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release memory
|
||||||
|
mAllocator.release(mBuckets, mCapacity * sizeof(int));
|
||||||
|
mAllocator.release(mEntries, mCapacity * sizeof(Entry));
|
||||||
|
|
||||||
|
mCapacity = 0;
|
||||||
|
mBuckets = nullptr;
|
||||||
|
mEntries = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
assert(size() == 0);
|
assert(size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,8 +702,8 @@ class Map {
|
||||||
// Check for self assignment
|
// Check for self assignment
|
||||||
if (this != &map) {
|
if (this != &map) {
|
||||||
|
|
||||||
// Reset the map
|
// Clear the map
|
||||||
reset();
|
clear(true);
|
||||||
|
|
||||||
if (map.mCapacity > 0) {
|
if (map.mCapacity > 0) {
|
||||||
|
|
||||||
|
|
|
@ -245,32 +245,6 @@ class Set {
|
||||||
return number;
|
return number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear and reset the set
|
|
||||||
void reset() {
|
|
||||||
|
|
||||||
// If elements have been allocated
|
|
||||||
if (mCapacity > 0) {
|
|
||||||
|
|
||||||
// Clear the list
|
|
||||||
clear();
|
|
||||||
|
|
||||||
// Destroy the entries
|
|
||||||
for (int i=0; i < mCapacity; i++) {
|
|
||||||
mEntries[i].~Entry();
|
|
||||||
}
|
|
||||||
|
|
||||||
mAllocator.release(mBuckets, mCapacity * sizeof(int));
|
|
||||||
mAllocator.release(mEntries, mCapacity * sizeof(Entry));
|
|
||||||
|
|
||||||
mNbUsedEntries = 0;
|
|
||||||
mNbFreeEntries = 0;
|
|
||||||
mCapacity = 0;
|
|
||||||
mBuckets = nullptr;
|
|
||||||
mEntries = nullptr;
|
|
||||||
mFreeIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Class Iterator
|
/// Class Iterator
|
||||||
|
@ -429,7 +403,7 @@ class Set {
|
||||||
/// Destructor
|
/// Destructor
|
||||||
~Set() {
|
~Set() {
|
||||||
|
|
||||||
reset();
|
clear(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocate memory for a given number of elements
|
/// Allocate memory for a given number of elements
|
||||||
|
@ -572,7 +546,7 @@ class Set {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear the set
|
/// Clear the set
|
||||||
void clear() {
|
void clear(bool releaseMemory = false) {
|
||||||
|
|
||||||
if (mNbUsedEntries > 0) {
|
if (mNbUsedEntries > 0) {
|
||||||
|
|
||||||
|
@ -591,6 +565,22 @@ class Set {
|
||||||
mNbFreeEntries = 0;
|
mNbFreeEntries = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If elements have been allocated
|
||||||
|
if (releaseMemory && mCapacity > 0) {
|
||||||
|
|
||||||
|
// Destroy the entries
|
||||||
|
for (int i=0; i < mCapacity; i++) {
|
||||||
|
mEntries[i].~Entry();
|
||||||
|
}
|
||||||
|
|
||||||
|
mAllocator.release(mBuckets, mCapacity * sizeof(int));
|
||||||
|
mAllocator.release(mEntries, mCapacity * sizeof(Entry));
|
||||||
|
|
||||||
|
mCapacity = 0;
|
||||||
|
mBuckets = nullptr;
|
||||||
|
mEntries = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
assert(size() == 0);
|
assert(size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -660,8 +650,8 @@ class Set {
|
||||||
// Check for self assignment
|
// Check for self assignment
|
||||||
if (this != &set) {
|
if (this != &set) {
|
||||||
|
|
||||||
// Reset the set
|
// Clear the set
|
||||||
reset();
|
clear(true);
|
||||||
|
|
||||||
if (set.mCapacity > 0) {
|
if (set.mCapacity > 0) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user