diff --git a/headers/Containers/DualkeyMap.hpp b/headers/Containers/DualkeyMap.hpp index ead2f95..da9fb0f 100644 --- a/headers/Containers/DualkeyMap.hpp +++ b/headers/Containers/DualkeyMap.hpp @@ -300,12 +300,9 @@ private: Key *keyToCompare; OppositeKey *oppositeKey; - // TO DO, merge std::vector with Containers::Hashmap!! - std::vector> queryResults; - queryResults.reserve(2048); - Containers::Hashmap *, + Containers::Hashmap, 8.0f, 2048, 0.01f> // Aggressive hashmap :o - locations; + queryResults; for (DualkeyHash *hash : hashList) { // Tombstone @@ -328,20 +325,22 @@ private: // The code above was done to make this code more uniform for (uint64_t index = 0; index < keyCount; index++) { if (keyHashes[index] == hashToCompare && keys[index] == *keyToCompare) { - if (locations.Has(*oppositeKey)) { - locations.Get(*oppositeKey)->valueQueryResults[index] = - &hash->value; - } else { - queryResults.emplace_back(oppositeKey); - auto &newRecord = queryResults.back(); - newRecord.valueQueryResults[index] = &hash->value; - locations.Insert(*oppositeKey, &newRecord); + if (queryResults.Has(*oppositeKey)) { + auto &entry = queryResults.Get(*oppositeKey); + entry.valueQueryResults[index] = &hash->value; + ++entry.howManyFound; + break; } + + queryResults + .Insert(*oppositeKey, + MultiQueryResult(oppositeKey)) + .valueQueryResults[index] = &hash->value; } } } - return queryResults; + return queryResults.ExtractValuesToArray(); } }; } // namespace Tourmaline::Containers diff --git a/headers/Containers/Hashmap.hpp b/headers/Containers/Hashmap.hpp index ecd89f6..8db06ab 100644 --- a/headers/Containers/Hashmap.hpp +++ b/headers/Containers/Hashmap.hpp @@ -100,6 +100,25 @@ public: "Hashmap", Systems::Logging::LogLevel::Error); } + [[nodiscard("Discarding an expensive operation!")]] + std::vector ExtractValuesToArray() { + std::vector result; + result.reserve(count); + + for (bucket &entry : storage) { + for (hashStorage &hash : entry) { + result.emplace_back(std::move(hash.value)); + } + entry.clear(); + } + + count = 0; + bucketCount = minimumBucketCount; + std::vector newStorage; + storage.swap(newStorage); + return result; + } + void Clear() noexcept { storage.clear(); count = 0;