diff --git a/include/reactphysics3d/containers/Array.h b/include/reactphysics3d/containers/Array.h index c9e03d1d..4717b32a 100755 --- a/include/reactphysics3d/containers/Array.h +++ b/include/reactphysics3d/containers/Array.h @@ -51,10 +51,10 @@ class Array { T* mBuffer; /// Number of elements in the array - size_t mSize; + uint64 mSize; /// Number of allocated elements in the array - size_t mCapacity; + uint64 mCapacity; /// Memory allocator MemoryAllocator& mAllocator; @@ -69,9 +69,9 @@ class Array { private: - size_t mCurrentIndex; + uint64 mCurrentIndex; T* mBuffer; - size_t mSize; + uint64 mSize; public: @@ -88,7 +88,7 @@ class Array { Iterator() = default; /// Constructor - Iterator(void* buffer, size_t index, size_t size) + Iterator(void* buffer, uint64 index, uint64 size) :mCurrentIndex(index), mBuffer(static_cast(buffer)), mSize(size) { } @@ -213,7 +213,7 @@ class Array { // -------------------- Methods -------------------- // /// Constructor - Array(MemoryAllocator& allocator, size_t capacity = 0) + Array(MemoryAllocator& allocator, uint64 capacity = 0) : mBuffer(nullptr), mSize(0), mCapacity(0), mAllocator(allocator) { if (capacity > 0) { @@ -247,7 +247,7 @@ class Array { } /// Allocate memory for a given number of elements - void reserve(size_t capacity) { + void reserve(uint64 capacity) { if (capacity <= mCapacity) return; @@ -263,7 +263,7 @@ class Array { std::uninitialized_copy(mBuffer, mBuffer + mSize, destination); // Destruct the previous items - for (size_t i=0; i mCapacity) { @@ -323,7 +323,7 @@ class Array { /// this method returns the end() iterator Iterator find(const T& element) { - for (size_t i=0; i& array, size_t startIndex = 0) { + void addRange(const Array& array, uint64 startIndex = 0) { assert(startIndex <= array.size()); @@ -393,7 +393,7 @@ class Array { } // Add the elements of the array to the current one - for(size_t i=startIndex; i(mBuffer + mSize)) T(array[i]); mSize++; @@ -404,7 +404,7 @@ class Array { void clear(bool releaseMemory = false) { // Call the destructor of each element - for (size_t i=0; i < mSize; i++) { + for (uint64 i=0; i < mSize; i++) { mBuffer[i].~T(); } @@ -422,23 +422,23 @@ class Array { } /// Return the number of elements in the array - size_t size() const { + uint64 size() const { return mSize; } /// Return the capacity of the array - size_t capacity() const { + uint64 capacity() const { return mCapacity; } /// Overloaded index operator - T& operator[](const size_t index) { + T& operator[](const uint64 index) { assert(index >= 0 && index < mSize); return mBuffer[index]; } /// Overloaded const index operator - const T& operator[](const size_t index) const { + const T& operator[](const uint64 index) const { assert(index >= 0 && index < mSize); return mBuffer[index]; } @@ -448,7 +448,7 @@ class Array { if (mSize != array.mSize) return false; - for (size_t i=0; i < mSize; i++) { + for (uint64 i=0; i < mSize; i++) { if (mBuffer[i] != array[i]) { return false; } diff --git a/include/reactphysics3d/containers/Deque.h b/include/reactphysics3d/containers/Deque.h index ace3ab74..ae4b83a9 100644 --- a/include/reactphysics3d/containers/Deque.h +++ b/include/reactphysics3d/containers/Deque.h @@ -55,10 +55,10 @@ class Deque { // -------------------- Constants -------------------- // /// Number of items in a chunk - const size_t CHUNK_NB_ITEMS = 17; + const uint64 CHUNK_NB_ITEMS = 17; /// First item index in a chunk - const size_t CHUNK_FIRST_ITEM_INDEX = CHUNK_NB_ITEMS / 2; + const uint64 CHUNK_FIRST_ITEM_INDEX = CHUNK_NB_ITEMS / 2; // -------------------- Attributes -------------------- // @@ -66,16 +66,16 @@ class Deque { T** mChunks; /// Number of current elements in the deque - size_t mSize; + uint64 mSize; /// Number of chunks - size_t mNbChunks; + uint64 mNbChunks; /// Index of the chunk with the first element of the deque - size_t mFirstChunkIndex; + uint64 mFirstChunkIndex; /// Index of the chunk with the last element of the deque - size_t mLastChunkIndex; + uint64 mLastChunkIndex; /// Index of the first element in the first chunk uint8 mFirstItemIndex; @@ -89,15 +89,15 @@ class Deque { // -------------------- Methods -------------------- // /// Return a reference to an item at the given virtual index in range [0; mSize-1] - T& getItem(size_t virtualIndex) const { + T& getItem(uint64 virtualIndex) const { // If the virtual index is valid if (virtualIndex < mSize) { - size_t chunkIndex = mFirstChunkIndex; - size_t itemIndex = mFirstItemIndex; + uint64 chunkIndex = mFirstChunkIndex; + uint64 itemIndex = mFirstItemIndex; - const size_t nbItemsFirstChunk = CHUNK_NB_ITEMS - mFirstItemIndex; + const uint64 nbItemsFirstChunk = CHUNK_NB_ITEMS - mFirstItemIndex; if (virtualIndex < nbItemsFirstChunk) { itemIndex += virtualIndex; } @@ -118,18 +118,18 @@ class Deque { } /// Add more chunks - void expandChunks(size_t atLeastNbChunks = 0) { + void expandChunks(uint64 atLeastNbChunks = 0) { // If it is not necessary to expand the chunks if (atLeastNbChunks > 0 && atLeastNbChunks <= mNbChunks) { return; } - size_t newNbChunks = mNbChunks == 0 ? 3 : 2 * mNbChunks - 1; + uint64 newNbChunks = mNbChunks == 0 ? 3 : 2 * mNbChunks - 1; if (atLeastNbChunks > 0 && newNbChunks < atLeastNbChunks) { - newNbChunks = size_t(atLeastNbChunks / 2) * 2 + 1; + newNbChunks = uint64(atLeastNbChunks / 2) * 2 + 1; } - const size_t halfNbChunksToAdd = mNbChunks == 0 ? 1 : (mNbChunks - 1) / 2; + const uint64 halfNbChunksToAdd = mNbChunks == 0 ? 1 : (mNbChunks - 1) / 2; // Allocate memory for the new array of pointers to chunk void* newMemory = mAllocator.allocate(newNbChunks * sizeof(T*)); @@ -157,7 +157,7 @@ class Deque { mNbChunks = newNbChunks; // Allocate memory for each new chunk - for (size_t i=0; i < halfNbChunksToAdd; i++) { + for (uint64 i=0; i < halfNbChunksToAdd; i++) { // Allocate memory for the new chunk mChunks[i] = static_cast(mAllocator.allocate(sizeof(T) * CHUNK_NB_ITEMS)); @@ -182,7 +182,7 @@ class Deque { private: - size_t mVirtualIndex; + uint64 mVirtualIndex; const Deque* mDeque; public: @@ -197,7 +197,7 @@ class Deque { using iterator_category = std::random_access_iterator_tag; /// Constructor - Iterator(const Deque* deque, size_t virtualIndex) : mVirtualIndex(virtualIndex), mDeque(deque) { + Iterator(const Deque* deque, uint64 virtualIndex) : mVirtualIndex(virtualIndex), mDeque(deque) { } @@ -337,14 +337,14 @@ class Deque { if (deque.mSize > 0) { - const size_t dequeHalfSize1 = std::ceil(deque.mSize / 2.0f); - const size_t dequeHalfSize2 = deque.mSize - dequeHalfSize1; + const uint64 dequeHalfSize1 = std::ceil(deque.mSize / 2.0f); + const uint64 dequeHalfSize2 = deque.mSize - dequeHalfSize1; // Add the items into the deque - for(size_t i=0; i < dequeHalfSize1; i++) { + for(uint64 i=0; i < dequeHalfSize1; i++) { addFront(deque[dequeHalfSize1 - 1 - i]); } - for(size_t i=0; i < dequeHalfSize2; i++) { + for(uint64 i=0; i < dequeHalfSize2; i++) { addBack(deque[dequeHalfSize1 + i]); } } @@ -356,7 +356,7 @@ class Deque { clear(); // Release each chunk - for (size_t i=0; i < mNbChunks; i++) { + for (uint64 i=0; i < mNbChunks; i++) { mAllocator.release(mChunks[i], sizeof(T) * CHUNK_NB_ITEMS); } @@ -511,7 +511,7 @@ class Deque { if (mSize > 0) { // Call the destructor of every items - for (size_t i=0; i < mSize; i++) { + for (uint64 i=0; i < mSize; i++) { getItem(i).~T(); } @@ -525,18 +525,18 @@ class Deque { } /// Return the number of elements in the deque - size_t size() const { + uint64 size() const { return mSize; } /// Overloaded index operator - T& operator[](const size_t index) { + T& operator[](const uint64 index) { assert(index < mSize); return getItem(index); } /// Overloaded const index operator - const T& operator[](const size_t index) const { + const T& operator[](const uint64 index) const { assert(index < mSize); return getItem(index); } @@ -546,7 +546,7 @@ class Deque { if (mSize != deque.mSize) return false; - for (size_t i=0; i < mSize; i++) { + for (uint64 i=0; i < mSize; i++) { if (getItem(i) != deque.getItem(i)) { return false; } @@ -572,19 +572,19 @@ class Deque { if (deque.mSize > 0) { // Number of used chunks - const size_t nbUsedChunks = deque.mLastChunkIndex - deque.mFirstChunkIndex + 1; + const uint64 nbUsedChunks = deque.mLastChunkIndex - deque.mFirstChunkIndex + 1; // Expand the chunk if necessary expandChunks(nbUsedChunks); - const size_t dequeHalfSize1 = std::ceil(deque.mSize / 2.0f); - const size_t dequeHalfSize2 = deque.mSize - dequeHalfSize1; + const uint64 dequeHalfSize1 = std::ceil(deque.mSize / 2.0f); + const uint64 dequeHalfSize2 = deque.mSize - dequeHalfSize1; // Add the items into the deque - for(size_t i=0; i < dequeHalfSize1; i++) { + for(uint64 i=0; i < dequeHalfSize1; i++) { addFront(deque[dequeHalfSize1 - 1 - i]); } - for(size_t i=0; i < dequeHalfSize2; i++) { + for(uint64 i=0; i < dequeHalfSize2; i++) { addBack(deque[dequeHalfSize1 + i]); } } diff --git a/include/reactphysics3d/containers/Map.h b/include/reactphysics3d/containers/Map.h index 53ae35f8..7000cbb6 100755 --- a/include/reactphysics3d/containers/Map.h +++ b/include/reactphysics3d/containers/Map.h @@ -53,47 +53,47 @@ class Map { static constexpr float DEFAULT_LOAD_FACTOR = 0.75; /// Invalid index in the array - static constexpr size_t INVALID_INDEX = -1; + static constexpr uint64 INVALID_INDEX = -1; // -------------------- Attributes -------------------- // /// Total number of allocated entries - size_t mNbAllocatedEntries; + uint64 mNbAllocatedEntries; /// Number of items in the set - size_t mNbEntries; + uint64 mNbEntries; /// Number of buckets and size of the hash table (nbEntries = loadFactor * mHashSize) - size_t mHashSize ; + uint64 mHashSize ; /// Array with all the buckets - size_t* mBuckets; + uint64* mBuckets; /// Array with all the entries Pair* mEntries; /// For each entry, index of the next entry at the same bucket - size_t* mNextEntries; + uint64* mNextEntries; /// Memory allocator MemoryAllocator& mAllocator; /// Index to the fist free entry - size_t mFreeIndex; + uint64 mFreeIndex; // -------------------- Methods -------------------- // /// Return the index of the entry with a given key or INVALID_INDEX if there is no entry with this key - size_t findEntry(const K& key) const { + uint64 findEntry(const K& key) const { if (mHashSize > 0) { const size_t hashCode = Hash()(key); const size_t divider = mHashSize - 1; - const size_t bucket = hashCode & divider; + const uint64 bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { if (Hash()(mEntries[i].first) == hashCode && keyEqual(mEntries[i].first, key)) { return i; } @@ -117,10 +117,10 @@ class Map { const Map* mMap; /// Index of the current bucket - size_t mCurrentBucketIndex; + uint64 mCurrentBucketIndex; /// Index of the current entry - size_t mCurrentEntryIndex; + uint64 mCurrentEntryIndex; /// Advance the iterator void advance() { @@ -158,7 +158,7 @@ class Map { Iterator() = default; /// Constructor - Iterator(const Map* map, size_t bucketIndex, size_t entryIndex) + Iterator(const Map* map, uint64 bucketIndex, uint64 entryIndex) :mMap(map), mCurrentBucketIndex(bucketIndex), mCurrentEntryIndex(entryIndex) { } @@ -205,7 +205,7 @@ class Map { // -------------------- Methods -------------------- // /// Constructor - Map(MemoryAllocator& allocator, size_t capacity = 0) + Map(MemoryAllocator& allocator, uint64 capacity = 0) : mNbAllocatedEntries(0), mNbEntries(0), mHashSize(0), mBuckets(nullptr), mEntries(nullptr), mNextEntries(nullptr), mAllocator(allocator), mFreeIndex(INVALID_INDEX) { @@ -223,22 +223,22 @@ class Map { if (mHashSize > 0) { // Allocate memory for the buckets - mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(size_t))); + mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(uint64))); // Allocate memory for the entries mEntries = static_cast*>(mAllocator.allocate(mNbAllocatedEntries * sizeof(Pair))); - mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(size_t))); + mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(uint64))); // Copy the buckets array - std::memcpy(mBuckets, map.mBuckets, mHashSize * sizeof(size_t)); + std::memcpy(mBuckets, map.mBuckets, mHashSize * sizeof(uint64)); // Copy the next entries indices - std::memcpy(mNextEntries, map.mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + std::memcpy(mNextEntries, map.mNextEntries, mNbAllocatedEntries * sizeof(uint64)); // Copy the entries - for (size_t i=0; i mHashSize); // Allocate memory for the buckets - size_t* newBuckets = static_cast(mAllocator.allocate(capacity * sizeof(size_t))); + uint64* newBuckets = static_cast(mAllocator.allocate(capacity * sizeof(uint64))); // Allocate memory for the entries - const size_t nbAllocatedEntries = static_cast(capacity * DEFAULT_LOAD_FACTOR); + const uint64 nbAllocatedEntries = static_cast(capacity * DEFAULT_LOAD_FACTOR); assert(nbAllocatedEntries > 0); Pair* newEntries = static_cast*>(mAllocator.allocate(nbAllocatedEntries * sizeof(Pair))); - size_t* newNextEntries = static_cast(mAllocator.allocate(nbAllocatedEntries * sizeof(size_t))); + uint64* newNextEntries = static_cast(mAllocator.allocate(nbAllocatedEntries * sizeof(uint64))); assert(newEntries != nullptr); assert(newNextEntries != nullptr); // Initialize the new buckets - for (size_t i=0; i(hashCode & divider); newNextEntries[entryIndex] = newBuckets[bucketIndex]; newBuckets[bucketIndex] = entryIndex; @@ -322,13 +322,13 @@ class Map { if (mNbAllocatedEntries > 0) { // Release previously allocated memory - mAllocator.release(mBuckets, mHashSize * sizeof(size_t)); + mAllocator.release(mBuckets, mHashSize * sizeof(uint64)); mAllocator.release(mEntries, mNbAllocatedEntries * sizeof(Pair)); - mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(uint64)); } // Add the new entries to the free list - for (size_t i=mNbAllocatedEntries; i < nbAllocatedEntries-1; i++) { + for (uint64 i=mNbAllocatedEntries; i < nbAllocatedEntries-1; i++) { newNextEntries[i] = i + 1; } newNextEntries[nbAllocatedEntries - 1] = mFreeIndex; @@ -352,7 +352,7 @@ class Map { /// Returns true if the item has been inserted and false otherwise. bool add(const Pair& keyValue, bool insertIfAlreadyPresent = false) { - size_t bucket = INVALID_INDEX; + uint64 bucket = INVALID_INDEX; // Compute the hash code of the value const size_t hashCode = Hash()(keyValue.first); @@ -361,12 +361,12 @@ class Map { // Compute the corresponding bucket index const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); // Check if the item is already in the set - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { // If there is already an item with the same value in the set if (Hash()(mEntries[i].first) == hashCode && keyEqual(mEntries[i].first, keyValue.first)) { @@ -389,7 +389,7 @@ class Map { } } - size_t entryIndex; + uint64 entryIndex; // If there are no more free entries to use if (mFreeIndex == INVALID_INDEX) { @@ -399,7 +399,7 @@ class Map { // Recompute the bucket index const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); } assert(mNbEntries < mNbAllocatedEntries); @@ -438,9 +438,9 @@ class Map { const size_t hashcode = Hash()(key); auto keyEqual = KeyEqual(); const size_t divider = mHashSize - 1; - const size_t bucket = hashcode & divider; - size_t last = INVALID_INDEX; - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; last = i, i = mNextEntries[i]) { + const uint64 bucket = static_cast(hashcode & divider); + uint64 last = INVALID_INDEX; + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; last = i, i = mNextEntries[i]) { // If we have found the item if (Hash()(mEntries[i].first) == hashcode && keyEqual(mEntries[i].first, key)) { @@ -452,8 +452,8 @@ class Map { mNextEntries[last] = mNextEntries[i]; } - size_t nextEntryIndex = mNextEntries[i]; - size_t nextBucketIndex = bucket; + uint64 nextEntryIndex = mNextEntries[i]; + uint64 nextBucketIndex = bucket; mEntries[i].~Pair(); mNextEntries[i] = mFreeIndex; @@ -484,15 +484,15 @@ class Map { /// Clear the map void clear(bool releaseMemory = false) { - for (size_t i=0; i(); - size_t nextEntryIndex = mNextEntries[entryIndex]; + uint64 nextEntryIndex = mNextEntries[entryIndex]; // Add entry to the free list mNextEntries[entryIndex] = mFreeIndex; @@ -507,9 +507,9 @@ class Map { if (releaseMemory && mNbAllocatedEntries > 0) { // Release previously allocated memory - mAllocator.release(mBuckets, mHashSize * sizeof(size_t)); + mAllocator.release(mBuckets, mHashSize * sizeof(uint64)); mAllocator.release(mEntries, mNbAllocatedEntries * sizeof(Pair)); - mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(uint64)); mBuckets = nullptr; mEntries = nullptr; @@ -523,12 +523,12 @@ class Map { } /// Return the number of elements in the map - size_t size() const { + uint64 size() const { return mNbEntries; } /// Return the capacity of the map - size_t capacity() const { + uint64 capacity() const { return mHashSize; } @@ -537,17 +537,17 @@ class Map { /// an iterator pointing to the end if not found Iterator find(const K& key) const { - size_t bucket; - size_t entry = INVALID_INDEX; + uint64 bucket; + uint64 entry = INVALID_INDEX; if (mHashSize > 0) { const size_t hashCode = Hash()(key); const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { if (Hash()(mEntries[i].first) == hashCode && keyEqual(mEntries[i].first, key)) { entry = i; break; @@ -565,7 +565,7 @@ class Map { /// Overloaded index operator V& operator[](const K& key) { - const size_t entry = findEntry(key); + const uint64 entry = findEntry(key); if (entry == INVALID_INDEX) { assert(false); @@ -578,7 +578,7 @@ class Map { /// Overloaded index operator const V& operator[](const K& key) const { - const size_t entry = findEntry(key); + const uint64 entry = findEntry(key); if (entry == INVALID_INDEX) { assert(false); @@ -633,22 +633,22 @@ class Map { if (mHashSize > 0) { // Allocate memory for the buckets - mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(size_t))); + mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(uint64))); // Allocate memory for the entries mEntries = static_cast*>(mAllocator.allocate(mNbAllocatedEntries * sizeof(Pair))); - mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(size_t))); + mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(uint64))); // Copy the buckets array - std::memcpy(mBuckets, map.mBuckets, mHashSize * sizeof(size_t)); + std::memcpy(mBuckets, map.mBuckets, mHashSize * sizeof(uint64)); // Copy the next entries indices - std::memcpy(mNextEntries, map.mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + std::memcpy(mNextEntries, map.mNextEntries, mNbAllocatedEntries * sizeof(uint64)); // Copy the entries - for (size_t i=0; i 0) { const size_t hashCode = Hash()(value); const size_t divider = mHashSize - 1; - const size_t bucket = hashCode & divider; + const uint64 bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { if (Hash()(mEntries[i]) == hashCode && keyEqual(mEntries[i], value)) { return i; } @@ -116,10 +116,10 @@ class Set { const Set* mSet; /// Index of the current bucket - size_t mCurrentBucketIndex; + uint64 mCurrentBucketIndex; /// Index of the current entry - size_t mCurrentEntryIndex; + uint64 mCurrentEntryIndex; /// Advance the iterator void advance() { @@ -157,7 +157,7 @@ class Set { Iterator() = default; /// Constructor - Iterator(const Set* set, size_t bucketIndex, size_t entryIndex) + Iterator(const Set* set, uint64 bucketIndex, uint64 entryIndex) :mSet(set), mCurrentBucketIndex(bucketIndex), mCurrentEntryIndex(entryIndex) { } @@ -204,7 +204,7 @@ class Set { // -------------------- Methods -------------------- // /// Constructor - Set(MemoryAllocator& allocator, size_t capacity = 0) + Set(MemoryAllocator& allocator, uint64 capacity = 0) : mNbAllocatedEntries(0), mNbEntries(0), mHashSize(0), mBuckets(nullptr), mEntries(nullptr), mNextEntries(nullptr), mAllocator(allocator), mFreeIndex(INVALID_INDEX) { @@ -222,22 +222,22 @@ class Set { if (mHashSize > 0) { // Allocate memory for the buckets - mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(size_t))); + mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(uint64))); // Allocate memory for the entries mEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(V))); - mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(size_t))); + mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(uint64))); // Copy the buckets array - std::memcpy(mBuckets, set.mBuckets, mHashSize * sizeof(size_t)); + std::memcpy(mBuckets, set.mBuckets, mHashSize * sizeof(uint64)); // Copy the next entries indices - std::memcpy(mNextEntries, set.mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + std::memcpy(mNextEntries, set.mNextEntries, mNbAllocatedEntries * sizeof(uint64)); // Copy the entries - for (size_t i=0; i mHashSize); // Allocate memory for the buckets - size_t* newBuckets = static_cast(mAllocator.allocate(capacity * sizeof(size_t))); + uint64* newBuckets = static_cast(mAllocator.allocate(capacity * sizeof(uint64))); // Allocate memory for the entries - const size_t nbAllocatedEntries = static_cast(capacity * DEFAULT_LOAD_FACTOR); + const uint64 nbAllocatedEntries = static_cast(capacity * DEFAULT_LOAD_FACTOR); assert(nbAllocatedEntries > 0); V* newEntries = static_cast(mAllocator.allocate(nbAllocatedEntries * sizeof(V))); - size_t* newNextEntries = static_cast(mAllocator.allocate(nbAllocatedEntries * sizeof(size_t))); + uint64* newNextEntries = static_cast(mAllocator.allocate(nbAllocatedEntries * sizeof(uint64))); assert(newEntries != nullptr); assert(newNextEntries != nullptr); // Initialize the new buckets - for (size_t i=0; i(hashCode & divider); newNextEntries[entryIndex] = newBuckets[bucketIndex]; newBuckets[bucketIndex] = entryIndex; @@ -321,13 +321,13 @@ class Set { if (mNbAllocatedEntries > 0) { // Release previously allocated memory - mAllocator.release(mBuckets, mHashSize * sizeof(size_t)); + mAllocator.release(mBuckets, mHashSize * sizeof(uint64)); mAllocator.release(mEntries, mNbAllocatedEntries * sizeof(V)); - mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(uint64)); } // Add the new entries to the free list - for (size_t i=mNbAllocatedEntries; i < nbAllocatedEntries-1; i++) { + for (uint64 i=mNbAllocatedEntries; i < nbAllocatedEntries-1; i++) { newNextEntries[i] = i + 1; } newNextEntries[nbAllocatedEntries - 1] = mFreeIndex; @@ -351,7 +351,7 @@ class Set { /// Returns true if the item has been inserted and false otherwise. bool add(const V& value) { - size_t bucket; + uint64 bucket; // Compute the hash code of the value const size_t hashCode = Hash()(value); @@ -360,12 +360,12 @@ class Set { // Compute the corresponding bucket index const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); // Check if the item is already in the set - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { // If there is already an item with the same value in the set if (Hash()(mEntries[i]) == hashCode && keyEqual(mEntries[i], value)) { @@ -375,7 +375,7 @@ class Set { } } - size_t entryIndex; + uint64 entryIndex; // If there are no more free entries to use if (mFreeIndex == INVALID_INDEX) { @@ -385,7 +385,7 @@ class Set { // Recompute the bucket index const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); } assert(mNbEntries < mNbAllocatedEntries); @@ -423,8 +423,8 @@ class Set { auto keyEqual = KeyEqual(); const size_t divider = mHashSize - 1; const size_t bucket = hashcode & divider; - size_t last = INVALID_INDEX; - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; last = i, i = mNextEntries[i]) { + uint64 last = INVALID_INDEX; + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; last = i, i = mNextEntries[i]) { // If we have found the item if (Hash()(mEntries[i]) == hashcode && keyEqual(mEntries[i], value)) { @@ -436,8 +436,8 @@ class Set { mNextEntries[last] = mNextEntries[i]; } - size_t nextEntryIndex = mNextEntries[i]; - size_t nextBucketIndex = bucket; + uint64 nextEntryIndex = mNextEntries[i]; + uint64 nextBucketIndex = bucket; mEntries[i].~V(); mNextEntries[i] = mFreeIndex; @@ -480,15 +480,15 @@ class Set { /// Clear the set void clear(bool releaseMemory = false) { - for (size_t i=0; i 0) { // Release previously allocated memory - mAllocator.release(mBuckets, mHashSize * sizeof(size_t)); + mAllocator.release(mBuckets, mHashSize * sizeof(uint64)); mAllocator.release(mEntries, mNbAllocatedEntries * sizeof(V)); - mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + mAllocator.release(mNextEntries, mNbAllocatedEntries * sizeof(uint64)); mBuckets = nullptr; mEntries = nullptr; @@ -519,12 +519,12 @@ class Set { } /// Return the number of elements in the set - size_t size() const { + uint64 size() const { return mNbEntries; } /// Return the capacity of the set - size_t capacity() const { + uint64 capacity() const { return mHashSize; } @@ -533,17 +533,17 @@ class Set { /// an iterator pointing to the end if not found Iterator find(const V& value) const { - size_t bucket; - size_t entry = INVALID_INDEX; + uint64 bucket; + uint64 entry = INVALID_INDEX; if (mHashSize > 0) { const size_t hashCode = Hash()(value); const size_t divider = mHashSize - 1; - bucket = hashCode & divider; + bucket = static_cast(hashCode & divider); auto keyEqual = KeyEqual(); - for (size_t i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { + for (uint64 i = mBuckets[bucket]; i != INVALID_INDEX; i = mNextEntries[i]) { if (Hash()(mEntries[i]) == hashCode && keyEqual(mEntries[i], value)) { entry = i; break; @@ -595,22 +595,22 @@ class Set { if (mHashSize > 0) { // Allocate memory for the buckets - mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(size_t))); + mBuckets = static_cast(mAllocator.allocate(mHashSize * sizeof(uint64))); // Allocate memory for the entries mEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(V))); - mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(size_t))); + mNextEntries = static_cast(mAllocator.allocate(mNbAllocatedEntries * sizeof(uint64))); // Copy the buckets array - std::memcpy(mBuckets, set.mBuckets, mHashSize * sizeof(size_t)); + std::memcpy(mBuckets, set.mBuckets, mHashSize * sizeof(uint64)); // Copy the next entries indices - std::memcpy(mNextEntries, set.mNextEntries, mNbAllocatedEntries * sizeof(size_t)); + std::memcpy(mNextEntries, set.mNextEntries, mNbAllocatedEntries * sizeof(uint64)); // Copy the entries - for (size_t i=0; i(mAllocator.allocate(capacity * sizeof(T))); assert(newArray != nullptr); @@ -87,7 +87,7 @@ class Stack { // -------------------- Methods -------------------- // /// Constructor - Stack(MemoryAllocator& allocator, size_t capacity = 0) + Stack(MemoryAllocator& allocator, uint64 capacity = 0) :mAllocator(allocator), mArray(nullptr), mNbElements(0), mCapacity(0) { if (capacity > 0) { @@ -130,7 +130,7 @@ class Stack { void clear() { // Destruct the items - for (size_t i = 0; i < mNbElements; i++) { + for (uint64 i = 0; i < mNbElements; i++) { mArray[i].~T(); } @@ -169,12 +169,12 @@ class Stack { } /// Return the number of items in the stack - size_t size() const { + uint64 size() const { return mNbElements; } /// Return the capacity of the stack - size_t capacity() const { + uint64 capacity() const { return mCapacity; } }; diff --git a/include/reactphysics3d/mathematics/mathematics_functions.h b/include/reactphysics3d/mathematics/mathematics_functions.h index a163712a..7cd17e6f 100755 --- a/include/reactphysics3d/mathematics/mathematics_functions.h +++ b/include/reactphysics3d/mathematics/mathematics_functions.h @@ -403,18 +403,19 @@ RP3D_FORCE_INLINE decimal computePointToPlaneDistance(const Vector3& point, cons } /// Return true if a number is a power of two -RP3D_FORCE_INLINE bool isPowerOfTwo(uint32 number) { +RP3D_FORCE_INLINE bool isPowerOfTwo(uint64 number) { return number != 0 && !(number & (number -1)); } /// Return the next power of two larger than the number in parameter -RP3D_FORCE_INLINE uint32 nextPowerOfTwo32Bits(uint32 number) { +RP3D_FORCE_INLINE uint32 nextPowerOfTwo64Bits(uint64 number) { number--; number |= number >> 1; number |= number >> 2; number |= number >> 4; number |= number >> 8; number |= number >> 16; + number |= number >> 32; number++; number += (number == 0); return number; diff --git a/test/tests/mathematics/TestMathematicsFunctions.h b/test/tests/mathematics/TestMathematicsFunctions.h index f4d9568a..fa5b738a 100644 --- a/test/tests/mathematics/TestMathematicsFunctions.h +++ b/test/tests/mathematics/TestMathematicsFunctions.h @@ -291,16 +291,16 @@ class TestMathematicsFunctions : public Test { rp3d_test(isPowerOfTwo(2048)); // Test nextPowerOfTwo32Bits() - rp3d_test(nextPowerOfTwo32Bits(0) == 1); - rp3d_test(nextPowerOfTwo32Bits(1) == 1); - rp3d_test(nextPowerOfTwo32Bits(2) == 2); - rp3d_test(nextPowerOfTwo32Bits(3) == 4); - rp3d_test(nextPowerOfTwo32Bits(5) == 8); - rp3d_test(nextPowerOfTwo32Bits(6) == 8); - rp3d_test(nextPowerOfTwo32Bits(7) == 8); - rp3d_test(nextPowerOfTwo32Bits(1000) == 1024); - rp3d_test(nextPowerOfTwo32Bits(129) == 256); - rp3d_test(nextPowerOfTwo32Bits(260) == 512); + rp3d_test(nextPowerOfTwo64Bits(0) == 1); + rp3d_test(nextPowerOfTwo64Bits(1) == 1); + rp3d_test(nextPowerOfTwo64Bits(2) == 2); + rp3d_test(nextPowerOfTwo64Bits(3) == 4); + rp3d_test(nextPowerOfTwo64Bits(5) == 8); + rp3d_test(nextPowerOfTwo64Bits(6) == 8); + rp3d_test(nextPowerOfTwo64Bits(7) == 8); + rp3d_test(nextPowerOfTwo64Bits(1000) == 1024); + rp3d_test(nextPowerOfTwo64Bits(129) == 256); + rp3d_test(nextPowerOfTwo64Bits(260) == 512); } };