From e243e0320d8b03d19a2658c3237f33198185c818 Mon Sep 17 00:00:00 2001 From: Piotr Date: Fri, 15 Nov 2019 00:27:59 +0100 Subject: [PATCH 01/25] replace PriorityQueue class with stl priority queue --- PolyEngine/Core/Src/pe/Defines.hpp | 1 + .../Src/pe/core/storage/PriorityQueue.hpp | 5 ++++- .../Engine/Src/AI/PathfindingSystem.cpp | 15 ++++++------- PolyEngine/Engine/Src/EnginePCH.hpp | 1 - .../Engine/Src/Resources/MeshResource.cpp | 14 +++++++------ .../OpenGL/Src/GLWorldRendering.cpp | 12 +++++------ .../OpenGL/Src/IRendererInterface.hpp | 16 +++++++------- .../OpenGL/Src/Pipeline/ShadowMapPass.cpp | 12 ++++++----- .../OpenGL/Src/PolyRenderingDeviceGLPCH.hpp | 2 +- .../OpenGL/Src/TiledForwardRenderer.cpp | 21 +++++++++++-------- 10 files changed, 55 insertions(+), 44 deletions(-) diff --git a/PolyEngine/Core/Src/pe/Defines.hpp b/PolyEngine/Core/Src/pe/Defines.hpp index 8efd1314..8ffcceed 100755 --- a/PolyEngine/Core/Src/pe/Defines.hpp +++ b/PolyEngine/Core/Src/pe/Defines.hpp @@ -85,6 +85,7 @@ #include #include #include +#include #include #include diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 00588c04..727f32fd 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -13,7 +13,10 @@ namespace pe::core::storage template > - class PriorityQueue final : BaseObjectLiteralType<> + class + + + final : BaseObjectLiteralType<> { public: PriorityQueue(size_t prealocatedSize = 0) : Data(prealocatedSize) {} diff --git a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp index 0c152ff8..7ae9b19e 100644 --- a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp +++ b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp @@ -36,19 +36,20 @@ std::optional> CalculateNewPath(const NavG std::vector AllNodes; - core::storage::PriorityQueue, PathNodeCmp> openList, closedList; + std::priority_queue,std::vector< std::pair >, PathNodeCmp> openList, closedList; std::map minCosts; AllNodes.push_back(PathNode(startNode, 0, graph->GetHeuristicCost(startNode, destNode) )); - openList.Push(std::make_pair(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode))); + openList.push(std::make_pair(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode))); minCosts.emplace(startNode, 0.f); i64 bestNodeIdx = -1; std::vector connections(8); - while (openList.GetSize() > 0 && bestNodeIdx < 0) + while (openList.size() > 0 && bestNodeIdx < 0) { - i64 qIdx = openList.Pop().first; - + i64 qIdx = openList.top().first; + openList.pop(); + connections.clear(); graph->GetConnections(AllNodes[qIdx].Node, connections); for (const NavNode* connection : connections) @@ -70,11 +71,11 @@ std::optional> CalculateNewPath(const NavG continue; // node has worse base cost than other (in the same pos) we visited before, skip it AllNodes.push_back(s); - openList.Push(std::make_pair(AllNodes.size() - 1, s.TotalCost())); + openList.push(std::make_pair(AllNodes.size() - 1, s.TotalCost())); minCosts[s.Node] = s.Cost; } - closedList.Push(std::make_pair(qIdx, AllNodes[qIdx].TotalCost())); + closedList.push(std::make_pair(qIdx, AllNodes[qIdx].TotalCost())); minCosts[AllNodes[qIdx].Node] = AllNodes[qIdx].Cost; } diff --git a/PolyEngine/Engine/Src/EnginePCH.hpp b/PolyEngine/Engine/Src/EnginePCH.hpp index 7a57b267..b3977ef3 100644 --- a/PolyEngine/Engine/Src/EnginePCH.hpp +++ b/PolyEngine/Engine/Src/EnginePCH.hpp @@ -41,7 +41,6 @@ #include #include #include -#include // Other #include diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index bf11e6ea..077676f1 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -150,9 +150,10 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) if (mesh->HasBones()) { ASSERTE((i8)mesh->mNumBones <= std::numeric_limits::max(), "Model has too many bones!"); - - std::vector<::pe::core::storage::PriorityQueue, std::function&, const std::pair&)>>> tmpBonesList; - tmpBonesList.resize(mesh->mNumVertices, { [](const std::pair& v1, const std::pair& v2) { return v1.second > v2.second; } }); + + std::vector,std::vector>, std::function&, const std::pair&)>>> tmpBonesList; + tmpBonesList.resize(mesh->mNumVertices, { std::priority_queue,std::vector>, std::function&, const std::pair&)>> + ([](const std::pair& v1, const std::pair& v2) { return v1.second > v2.second; }) }); std::map<::pe::core::storage::String, size_t> nameToBoneIdx; @@ -169,7 +170,7 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) const auto& vertWeight = bone->mWeights[j]; size_t vertId = vertWeight.mVertexId; float weight = vertWeight.mWeight; - tmpBonesList[vertId].Push({ boneId, weight }); + tmpBonesList[vertId].push({ boneId, weight }); } } } @@ -184,9 +185,10 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) { auto& boneQueue = tmpBonesList[vertId]; float sum = 0.f; - for (size_t k = 0; k < 4 && boneQueue.GetSize() > 0; ++k) + for (size_t k = 0; k < 4 && boneQueue.size() > 0; ++k) { - auto entry = boneQueue.Pop(); + auto entry = boneQueue.top(); + boneQueue.pop(); sum += entry.second; MeshData.BoneIds[vertId].Data[k] = entry.first; MeshData.BoneWeights[vertId].Data[k] = entry.second; diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp index 5bf88de9..66e1252e 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp @@ -16,7 +16,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue; +using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; void GLRenderingDevice::Init() { @@ -82,18 +82,18 @@ void GLRenderingDevice::FillSceneView(SceneView& sceneView) { if (meshCmp->GetBlendingMode() == eBlendingMode::OPAUQE) { - sceneView.OpaqueQueue.Push(meshCmp); + sceneView.OpaqueQueue.push(meshCmp); } else if (meshCmp->GetBlendingMode() == eBlendingMode::TRANSLUCENT) { - sceneView.TranslucentQueue.Push(meshCmp); + sceneView.TranslucentQueue.push(meshCmp); } } } for (const auto& [particleCmp] : sceneView.SceneData->IterateComponents()) { - sceneView.ParticleQueue.Push(particleCmp); + sceneView.ParticleQueue.push(particleCmp); } for (const auto& [dirLightCmp] : sceneView.SceneData->IterateComponents()) @@ -237,13 +237,13 @@ void GLRenderingDevice::CullShadowCasters(SceneView& sceneView, const core::math // find all meshes that are inside extended DirLights AABB box core::math::Vector dirLightPos = sceneView.DirectionalLightList[0]->GetTransform().GetGlobalTranslation(); - MeshQueue shadowCasterQueue(SceneView::DistanceToCameraComparator(dirLightPos, SceneView::eSortOrderType::FRONT_TO_BACK), 0); + MeshQueue shadowCasterQueue(SceneView::DistanceToCameraComparator(dirLightPos, SceneView::eSortOrderType::FRONT_TO_BACK)); for (auto& [box, meshCmp] : boxMeshes) { if (frustumAABBInLS.Contains(box)) { - shadowCasterQueue.Push(meshCmp); + shadowCasterQueue.push(meshCmp); if (sceneView.SettingsCmp && sceneView.SettingsCmp->DebugDrawShadowCastersBounds) DebugDrawSystem::DrawBox(scene, box.GetMin(), box.GetMax(), worldFromDirLight, core::math::Color::GREEN); diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp index ba821403..44afb0a8 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp @@ -54,10 +54,10 @@ namespace Poly { SceneView(Scene* s, Viewport& v) : SceneData(s), ViewportData(v), Rect(v.GetRect()), CameraCmp(v.GetCamera()), - DirShadowCastersQueue(DistanceToCameraComparator(::pe::core::math::Vector::ZERO, eSortOrderType::FRONT_TO_BACK), 0), // filled by GLRenderingDevice::CullShadowCasters - OpaqueQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::FRONT_TO_BACK), 0), - TranslucentQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::BACK_TO_FRONT), 0), - ParticleQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::BACK_TO_FRONT), 0) + DirShadowCastersQueue(DistanceToCameraComparator(::pe::core::math::Vector::ZERO, eSortOrderType::FRONT_TO_BACK)), // filled by GLRenderingDevice::CullShadowCasters + OpaqueQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::FRONT_TO_BACK)), + TranslucentQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::BACK_TO_FRONT)), + ParticleQueue(DistanceToCameraComparator(v.GetCamera()->GetTransform().GetGlobalTranslation(), eSortOrderType::BACK_TO_FRONT)) { SettingsCmp = s->GetWorldComponent(); }; @@ -69,10 +69,10 @@ namespace Poly { const CameraComponent* CameraCmp; const RenderingSettingsComponent* SettingsCmp; - ::pe::core::storage::PriorityQueue DirShadowCastersQueue; - ::pe::core::storage::PriorityQueue OpaqueQueue; - ::pe::core::storage::PriorityQueue TranslucentQueue; - ::pe::core::storage::PriorityQueue ParticleQueue; // TODO: make translucent and particles one queue with common priority + std::priority_queue, DistanceToCameraComparator> DirShadowCastersQueue; + std::priority_queue, DistanceToCameraComparator> OpaqueQueue; + std::priority_queue, DistanceToCameraComparator> TranslucentQueue; + std::priority_queue, DistanceToCameraComparator> ParticleQueue; // TODO: make translucent and particles one queue with common priority ::pe::core::math::AABox DirShadowAABBInLS; std::vector DirectionalLightList; diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp index 9fe46516..150c1d2f 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp @@ -5,7 +5,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue; +using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; core::math::Matrix Poly::GetProjectionForShadowMap(const SceneView& sceneView, int shadowmapSize) { @@ -228,9 +228,10 @@ void ShadowMapPass::RenderPCF(const SceneView& sceneView) ShadowMapShader.BindProgram(); MeshQueue dirShadowCasterQueue(sceneView.DirShadowCastersQueue); - while (dirShadowCasterQueue.GetSize() > 0) + while (dirShadowCasterQueue.size() > 0) { - const MeshRenderingComponent* meshCmp = dirShadowCasterQueue.Pop(); + const MeshRenderingComponent* meshCmp = dirShadowCasterQueue.top(); + dirShadowCasterQueue.pop(); const core::math::Matrix& worldFromModel = meshCmp->GetTransform().GetWorldFromModel(); ShadowMapShader.SetUniform("uClipFromModel", orthoDirLightFromWorld * worldFromModel); @@ -264,9 +265,10 @@ void ShadowMapPass::RenderEVSM(const SceneView& sceneView) ShadowMapShader.BindProgram(); MeshQueue dirShadowCasterQueue(sceneView.DirShadowCastersQueue); - while (dirShadowCasterQueue.GetSize() > 0) + while (dirShadowCasterQueue.size() > 0) { - const MeshRenderingComponent* meshCmp = dirShadowCasterQueue.Pop(); + const MeshRenderingComponent* meshCmp = dirShadowCasterQueue.top(); + dirShadowCasterQueue.pop(); const core::math::Matrix& worldFromModel = meshCmp->GetTransform().GetWorldFromModel(); ShadowMapShader.SetUniform("uClipFromModel", orthoDirLightFromWorld * worldFromModel); diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/PolyRenderingDeviceGLPCH.hpp b/PolyEngine/RenderingDevice/OpenGL/Src/PolyRenderingDeviceGLPCH.hpp index 88c06962..bace0d74 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/PolyRenderingDeviceGLPCH.hpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/PolyRenderingDeviceGLPCH.hpp @@ -34,7 +34,7 @@ #include #include -#include + // Other #include diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp index 0be1bc0e..d769643e 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp @@ -17,7 +17,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue; +using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; void RenderTargetPingPong::Init(int width, int height) { @@ -525,9 +525,10 @@ void TiledForwardRenderer::RenderDepthPrePass(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); MeshQueue drawOpaqueQueue(sceneView.OpaqueQueue); - while(drawOpaqueQueue.GetSize() > 0) + while(drawOpaqueQueue.size() > 0) { - const MeshRenderingComponent* meshCmp = drawOpaqueQueue.Pop(); + const MeshRenderingComponent* meshCmp = drawOpaqueQueue.top(); + drawOpaqueQueue.pop(); const core::math::Matrix& worldFromModel = meshCmp->GetTransform().GetWorldFromModel(); static const core::storage::String uScreenFromModel("uScreenFromModel"); DepthShader.SetUniform(uScreenFromModel, clipFromWorld * worldFromModel); @@ -690,10 +691,11 @@ void TiledForwardRenderer::RenderOpaqueLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); - core::storage::PriorityQueue drawOpaqueQueue(sceneView.OpaqueQueue); - while (drawOpaqueQueue.GetSize() > 0) + std::priority_queue, SceneView::DistanceToCameraComparator> drawOpaqueQueue(sceneView.OpaqueQueue); + while (drawOpaqueQueue.size() > 0) { - const MeshRenderingComponent* meshCmp = drawOpaqueQueue.Pop(); + const MeshRenderingComponent* meshCmp = drawOpaqueQueue.top(); + drawOpaqueQueue.pop(); const SkeletalAnimationComponent* animCmp = meshCmp->GetSibling(); const EntityTransform& transform = meshCmp->GetTransform(); @@ -901,10 +903,11 @@ void TiledForwardRenderer::RenderTranslucentLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); // for (const MeshRenderingComponent* meshCmp : sceneView.TranslucentQueue) // { - core::storage::PriorityQueue drawTranslucentQueue(sceneView.TranslucentQueue); - while (drawTranslucentQueue.GetSize() > 0) + std::priority_queue, SceneView::DistanceToCameraComparator> drawTranslucentQueue(sceneView.TranslucentQueue); + while (drawTranslucentQueue.size() > 0) { - const MeshRenderingComponent* meshCmp = drawTranslucentQueue.Pop(); + const MeshRenderingComponent* meshCmp = drawTranslucentQueue.top(); + drawTranslucentQueue.pop(); const EntityTransform& transform = meshCmp->GetTransform(); const core::math::Matrix& worldFromModel = transform.GetWorldFromModel(); static const core::storage::String uClipFromModel("uClipFromModel"); From 59ebd683d3382ede4b1ce3392b3320c5757ffc39 Mon Sep 17 00:00:00 2001 From: Piotr Date: Fri, 15 Nov 2019 00:33:07 +0100 Subject: [PATCH 02/25] delete old PriorityQueue class and it's tests --- .../Src/pe/core/storage/PriorityQueue.hpp | 111 ------------------ .../CoreTests/Src/PriorityQueueTests.cpp | 97 --------------- 2 files changed, 208 deletions(-) delete mode 100644 PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp delete mode 100644 PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp deleted file mode 100644 index 727f32fd..00000000 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once - -#include - - -namespace pe::core::storage -{ - template - struct DefaultCmp - { - bool operator()(const T& a, const T& b) const { return a < b; } - }; - - - template > - class - - - final : BaseObjectLiteralType<> - { - public: - PriorityQueue(size_t prealocatedSize = 0) : Data(prealocatedSize) {} - PriorityQueue(Less lessCmp, size_t prealocatedSize = 0) : LessCmp(std::move(lessCmp)), Data(prealocatedSize) {} - PriorityQueue(std::vector data) : Data(std::move(data)) - { - for (size_t idx = Data.size() / 2; idx > 0; --idx) - SiftDown(idx - 1); - } - - void Push(T val) - { - Data.push_back(std::move(val)); - SiftUp(Data.size() - 1); - } - - T Pop() - { - T& first = Data[0]; - T& last = Data[GetSize() - 1]; - T tmp = std::move(first); - Swap(first, last); - Data.pop_back(); - SiftDown(0); - return tmp; - } - - const T& Head() const { return Data[0]; } - size_t GetSize() const { return Data.size(); } - void Reserve(size_t size) { Data.Reserve(size); } - private: - void SiftUp(size_t idx) - { - while (idx > 0) - { - T& val = Data[idx]; - const size_t parentIdx = GetParent(idx); - T& parent = Data[parentIdx]; - if (!LessCmp(val, parent)) - break; - - Swap(val, parent); - idx = parentIdx; - } - } - - void SiftDown(size_t idx) - { - while (idx < GetSize()) - { - const size_t leftChild = GetLeftChild(idx); - const size_t rightChild = GetRightChild(idx); - - const bool leftOk = leftChild < GetSize(); - const bool rightOk = rightChild < GetSize(); - - if (!leftOk && !rightOk) - return; - - T& val = Data[idx]; - // assign val, simple trick to bypass null reference limitations - T* left = leftOk ? &Data[leftChild] : nullptr; - T* right = rightOk ? &Data[rightChild] : nullptr; - - const bool rightBetter = !leftOk || (rightOk && LessCmp(*right, *left)); - T* candidate = rightBetter ? right : left; - - if (candidate && LessCmp(*candidate, val)) - { - Swap(val, *candidate); - idx = rightBetter ? rightChild : leftChild; - } - else - return; - } - } - - inline void Swap(T& a, T& b) - { - T tmp = std::move(a); - a = std::move(b); - b = std::move(tmp); - } - - inline size_t GetParent(size_t node) { return (node - 1) / 2; } - inline size_t GetLeftChild(size_t node) { return 2 * node + 1; } - inline size_t GetRightChild(size_t node) { return 2 * node + 2; } - - Less LessCmp; - std::vector Data; - }; -} //namespace Poly diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp deleted file mode 100644 index e295f5b7..00000000 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include -#include -#include - -TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") -{ - ::pe::core::storage::PriorityQueue q; - const int testSize = 10; - - for (int i = 0; i < testSize; ++i) - { - q.Push(i); - CHECK(q.GetSize() == i+1); - } - - for (int i = 0; i < testSize; ++i) - { - CHECK(q.Head() == i); - CHECK(q.Pop() == i); - } -} - -TEST_CASE("PriorityQueue reverrse sorted push test", "[PriorityQueue]") -{ - ::pe::core::storage::PriorityQueue q; - const int testSize = 100; - - for (int i = 0; i < testSize; ++i) - { - q.Push(testSize - i - 1); - CHECK(q.GetSize() == i + 1); - } - - for (int i = 0; i < testSize; ++i) - { - CHECK(q.Head() == i); - CHECK(q.Pop() == i); - } -} - -TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") -{ - ::pe::core::storage::PriorityQueue q; - const size_t testSize = 100; - - for (size_t i = 0; i < testSize; ++i) - { - q.Push(rand()); - CHECK(q.GetSize() == i + 1); - } - - for (size_t i = 0; i < testSize - 1; ++i) - { - size_t v1 = q.Pop(); - CHECK(v1 <= q.Head()); - } -} - -struct CustomTestComparator -{ - bool operator()(int a, int b) const { return a > b; } -}; - -TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") -{ - ::pe::core::storage::PriorityQueue q; - const size_t testSize = 100; - - for (size_t i = 0; i < testSize; ++i) - { - q.Push(rand()); - CHECK(q.GetSize() == i + 1); - } - - for (size_t i = 0; i < testSize - 1; ++i) - { - size_t v1 = q.Pop(); - CHECK(v1 >= q.Head()); - } -} - -TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") -{ - const size_t testSize = 100; - - std::vector table(testSize); - for (size_t i = 0; i < testSize; ++i) - table.push_back(rand()); - - ::pe::core::storage::PriorityQueue q(std::move(table)); - - for (size_t i = 0; i < testSize - 1; ++i) - { - size_t v1 = q.Pop(); - CHECK(v1 <= q.Head()); - } -} \ No newline at end of file From 1a3a45d04f94bbb607626f0c0fc8d4cb9fcc7824 Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 19 Nov 2019 21:58:57 +0100 Subject: [PATCH 03/25] replace priority_queue push with emplace --- PolyEngine/Engine/Src/AI/PathfindingSystem.cpp | 6 +++--- PolyEngine/Engine/Src/Resources/MeshResource.cpp | 2 +- .../RenderingDevice/OpenGL/Src/GLWorldRendering.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp index 7ae9b19e..c8f112f6 100644 --- a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp +++ b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp @@ -40,7 +40,7 @@ std::optional> CalculateNewPath(const NavG std::map minCosts; AllNodes.push_back(PathNode(startNode, 0, graph->GetHeuristicCost(startNode, destNode) )); - openList.push(std::make_pair(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode))); + openList.emplace(std::make_pair(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode))); minCosts.emplace(startNode, 0.f); i64 bestNodeIdx = -1; @@ -71,11 +71,11 @@ std::optional> CalculateNewPath(const NavG continue; // node has worse base cost than other (in the same pos) we visited before, skip it AllNodes.push_back(s); - openList.push(std::make_pair(AllNodes.size() - 1, s.TotalCost())); + openList.emplace(std::make_pair(AllNodes.size() - 1, s.TotalCost())); minCosts[s.Node] = s.Cost; } - closedList.push(std::make_pair(qIdx, AllNodes[qIdx].TotalCost())); + closedList.emplace(std::make_pair(qIdx, AllNodes[qIdx].TotalCost())); minCosts[AllNodes[qIdx].Node] = AllNodes[qIdx].Cost; } diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index 077676f1..63911092 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -170,7 +170,7 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) const auto& vertWeight = bone->mWeights[j]; size_t vertId = vertWeight.mVertexId; float weight = vertWeight.mWeight; - tmpBonesList[vertId].push({ boneId, weight }); + tmpBonesList[vertId].emplace(std::pair( boneId, weight )); } } } diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp index 66e1252e..1a87fac2 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp @@ -82,18 +82,18 @@ void GLRenderingDevice::FillSceneView(SceneView& sceneView) { if (meshCmp->GetBlendingMode() == eBlendingMode::OPAUQE) { - sceneView.OpaqueQueue.push(meshCmp); + sceneView.OpaqueQueue.emplace(meshCmp); } else if (meshCmp->GetBlendingMode() == eBlendingMode::TRANSLUCENT) { - sceneView.TranslucentQueue.push(meshCmp); + sceneView.TranslucentQueue.emplace(meshCmp); } } } for (const auto& [particleCmp] : sceneView.SceneData->IterateComponents()) { - sceneView.ParticleQueue.push(particleCmp); + sceneView.ParticleQueue.emplace(particleCmp); } for (const auto& [dirLightCmp] : sceneView.SceneData->IterateComponents()) @@ -243,7 +243,7 @@ void GLRenderingDevice::CullShadowCasters(SceneView& sceneView, const core::math { if (frustumAABBInLS.Contains(box)) { - shadowCasterQueue.push(meshCmp); + shadowCasterQueue.emplace(meshCmp); if (sceneView.SettingsCmp && sceneView.SettingsCmp->DebugDrawShadowCastersBounds) DebugDrawSystem::DrawBox(scene, box.GetMin(), box.GetMax(), worldFromDirLight, core::math::Color::GREEN); From 33a1eebf2072ccadf4e4e9f3ac213244b3c71363 Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 19 Nov 2019 22:29:35 +0100 Subject: [PATCH 04/25] add using keyword for long declarations --- PolyEngine/Engine/Src/Resources/MeshResource.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index 63911092..76bf49e6 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -6,6 +6,8 @@ using namespace Poly; +using PairQueue = std::priority_queue,std::vector>,std::function&, const std::pair&)>>; + RTTI_DEFINE_TYPE(Poly::MeshResource) core::math::Matrix MatFromAiMat(const aiMatrix4x4& m) @@ -151,9 +153,8 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) { ASSERTE((i8)mesh->mNumBones <= std::numeric_limits::max(), "Model has too many bones!"); - std::vector,std::vector>, std::function&, const std::pair&)>>> tmpBonesList; - tmpBonesList.resize(mesh->mNumVertices, { std::priority_queue,std::vector>, std::function&, const std::pair&)>> - ([](const std::pair& v1, const std::pair& v2) { return v1.second > v2.second; }) }); + std::vector tmpBonesList; + tmpBonesList.resize(mesh->mNumVertices, { PairQueue([](const std::pair& v1, const std::pair& v2) { return v1.second > v2.second; })}); std::map<::pe::core::storage::String, size_t> nameToBoneIdx; @@ -183,7 +184,7 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) for (size_t vertId = 0; vertId < mesh->mNumVertices; ++vertId) { - auto& boneQueue = tmpBonesList[vertId]; + PairQueue& boneQueue = tmpBonesList[vertId]; float sum = 0.f; for (size_t k = 0; k < 4 && boneQueue.size() > 0; ++k) { From 453fb869d0bb1b11c79ec2cf3768316873cacc58 Mon Sep 17 00:00:00 2001 From: Piotr Date: Wed, 20 Nov 2019 17:45:43 +0100 Subject: [PATCH 05/25] replace emplace with push when not constructing element in place --- PolyEngine/Engine/Src/Resources/MeshResource.cpp | 2 +- .../RenderingDevice/OpenGL/Src/GLWorldRendering.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index 76bf49e6..8ba52b62 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -171,7 +171,7 @@ void MeshResource::SubMesh::LoadBones(aiMesh* mesh) const auto& vertWeight = bone->mWeights[j]; size_t vertId = vertWeight.mVertexId; float weight = vertWeight.mWeight; - tmpBonesList[vertId].emplace(std::pair( boneId, weight )); + tmpBonesList[vertId].emplace( boneId, weight ); } } } diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp index 1a87fac2..66e1252e 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp @@ -82,18 +82,18 @@ void GLRenderingDevice::FillSceneView(SceneView& sceneView) { if (meshCmp->GetBlendingMode() == eBlendingMode::OPAUQE) { - sceneView.OpaqueQueue.emplace(meshCmp); + sceneView.OpaqueQueue.push(meshCmp); } else if (meshCmp->GetBlendingMode() == eBlendingMode::TRANSLUCENT) { - sceneView.TranslucentQueue.emplace(meshCmp); + sceneView.TranslucentQueue.push(meshCmp); } } } for (const auto& [particleCmp] : sceneView.SceneData->IterateComponents()) { - sceneView.ParticleQueue.emplace(particleCmp); + sceneView.ParticleQueue.push(particleCmp); } for (const auto& [dirLightCmp] : sceneView.SceneData->IterateComponents()) @@ -243,7 +243,7 @@ void GLRenderingDevice::CullShadowCasters(SceneView& sceneView, const core::math { if (frustumAABBInLS.Contains(box)) { - shadowCasterQueue.emplace(meshCmp); + shadowCasterQueue.push(meshCmp); if (sceneView.SettingsCmp && sceneView.SettingsCmp->DebugDrawShadowCastersBounds) DebugDrawSystem::DrawBox(scene, box.GetMin(), box.GetMax(), worldFromDirLight, core::math::Color::GREEN); From 216cfdd69faded9df8913bef917827b7a6588732 Mon Sep 17 00:00:00 2001 From: Piotr Date: Sat, 30 Nov 2019 22:25:13 +0100 Subject: [PATCH 06/25] replace unneeded assignments with DISCARD --- .../Core/Src/pe/core/storage/impl/IndexedStringManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp index c0eb4e6b..aafe1dee 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp @@ -70,7 +70,7 @@ void IndexedStringManager::setTTLMode(bool enabled) { if(m_ttlEnabled && !enabled) { - bool bResult = m_ttlEntries.empty(); + DISCARD m_ttlEntries.empty(); } m_ttlEnabled = enabled; } From 8a81e1d7688a7b1553a01ae47381bb4fbd1e0d50 Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 3 Dec 2019 19:47:06 +0100 Subject: [PATCH 07/25] remove std::make_pair when not needed --- PolyEngine/Engine/Src/AI/PathfindingSystem.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp index c8f112f6..f6fb7f63 100644 --- a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp +++ b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp @@ -40,7 +40,7 @@ std::optional> CalculateNewPath(const NavG std::map minCosts; AllNodes.push_back(PathNode(startNode, 0, graph->GetHeuristicCost(startNode, destNode) )); - openList.emplace(std::make_pair(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode))); + openList.emplace(AllNodes.size() - 1, graph->GetHeuristicCost(startNode, destNode)); minCosts.emplace(startNode, 0.f); i64 bestNodeIdx = -1; @@ -71,11 +71,11 @@ std::optional> CalculateNewPath(const NavG continue; // node has worse base cost than other (in the same pos) we visited before, skip it AllNodes.push_back(s); - openList.emplace(std::make_pair(AllNodes.size() - 1, s.TotalCost())); + openList.emplace(AllNodes.size() - 1, s.TotalCost()); minCosts[s.Node] = s.Cost; } - closedList.emplace(std::make_pair(qIdx, AllNodes[qIdx].TotalCost())); + closedList.emplace(qIdx, AllNodes[qIdx].TotalCost()); minCosts[AllNodes[qIdx].Node] = AllNodes[qIdx].Cost; } From ea44ee0a16e0cd05be8d15615d6efd7d3eeff1ad Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 3 Dec 2019 19:49:37 +0100 Subject: [PATCH 08/25] replace priority queue empty with std::swap --- .../Core/Src/pe/core/storage/impl/IndexedStringManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp index aafe1dee..d43602c2 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp @@ -70,7 +70,7 @@ void IndexedStringManager::setTTLMode(bool enabled) { if(m_ttlEnabled && !enabled) { - DISCARD m_ttlEntries.empty(); + std::swap(m_ttlEntries, std::priority_queue()); } m_ttlEnabled = enabled; } From d568f189a20f034f13b7168f5627020de8e5ff41 Mon Sep 17 00:00:00 2001 From: Piotr Date: Sun, 8 Dec 2019 12:12:28 +0100 Subject: [PATCH 09/25] fix swap call --- .../Core/Src/pe/core/storage/impl/IndexedStringManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp index d43602c2..8720cf97 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp @@ -70,7 +70,8 @@ void IndexedStringManager::setTTLMode(bool enabled) { if(m_ttlEnabled && !enabled) { - std::swap(m_ttlEntries, std::priority_queue()); + std::priority_queue new_queue; + std::swap(m_ttlEntries,new_queue); } m_ttlEnabled = enabled; } From 8835713cdcd41b147847e288e3499e302bec1af6 Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 6 Jan 2020 22:48:24 +0100 Subject: [PATCH 10/25] add new wrapper class of priority_queue with clear method --- .../Src/pe/core/storage/PriorityQueue.hpp | 105 ++++++++++++++++++ .../storage/impl/IndexedStringManager.cpp | 4 +- .../storage/impl/IndexedStringManager.hpp | 3 +- .../Engine/Src/AI/PathfindingSystem.cpp | 2 +- PolyEngine/Engine/Src/EnginePCH.hpp | 2 + .../Engine/Src/Resources/MeshResource.cpp | 2 +- .../OpenGL/Src/GLWorldRendering.cpp | 5 +- .../OpenGL/Src/IRendererInterface.hpp | 9 +- .../OpenGL/Src/Pipeline/ShadowMapPass.cpp | 4 +- .../OpenGL/Src/TiledForwardRenderer.cpp | 8 +- 10 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp new file mode 100644 index 00000000..9a005d8f --- /dev/null +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include + +namespace pe::core::storage +{ + template,class _Pr = std::less > + class PriorityQueue final : public std::priority_queue<_Ty,_Container,_Pr> + { + public: + + PriorityQueue() + : priority_queue() + { + } + + explicit PriorityQueue(const _Pr& _Pred) + : priority_queue(_Pred) + { + } + + PriorityQueue(const _Pr& _Pred, const _Container& _Cont) + : priority_queue(_Pred,_Cont) + { + } + + template + PriorityQueue(_InIt _First, _InIt _Last) + : priority_queue(_First,_Last) + { + } + + template + PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred) + : priority_queue(_Firest,_Last,_Pred) + { + } + + template + PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, const _Container& _Cont) + : priority_queue(_First,_Last,_Pred,_Cont) + { + } + + template>> + explicit PriorityQueue(const _Alloc& _Al) + : priority_queue(_All) + { + } + + template>> + PriorityQueue(const _Pr& _Pred, const _Alloc& _Al) + : priority_queue(_Pred,_Al) + { + } + + template>> + PriorityQueue(const _Pr& _Pred, const _Container& _Cont, const _Alloc& _Al) + : priority_queue(_Pred,_Cont,_Al) + { + } + + template>> + PriorityQueue(const priority_queue& _Right, const _Alloc& _Al) + : priority_queue(_Right,_Al) + { + } + + PriorityQueue(const _Pr& _Pred, _Container&& _Cont) + : priority_queue(_Pred,_Cont) + { + } + + template + PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, _Container&& _Cont) + : priority_queue(_First,_Last,_Pred,_Cont) + { + } + + template>> + PriorityQueue(const _Pr& _Pred, _Container&& _Cont, const _Alloc& _Al) + : priority_queue(_Pred,_Cont,_Al) + { + } + + template>> + PriorityQueue(priority_queue&& _Right, const _Alloc& _Al) + : priority_queue(_Right,_Al) + { + } + + + void clear() + { + c.clear(); + } + }; +} + diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp index 8720cf97..4bcb1c67 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp @@ -1,5 +1,6 @@ #include + namespace pe::core::storage::impl { @@ -70,8 +71,7 @@ void IndexedStringManager::setTTLMode(bool enabled) { if(m_ttlEnabled && !enabled) { - std::priority_queue new_queue; - std::swap(m_ttlEntries,new_queue); + m_ttlEntries.clear(); } m_ttlEnabled = enabled; } diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp index 05c00f32..25bf703a 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace pe::core::storage::impl { @@ -39,7 +40,7 @@ class CORE_DLLEXPORT IndexedStringManager final : public core::BaseObjectLiteral void scheduleErase(const IndexedStringEntry* entry); std::unordered_map> m_entries; - std::priority_queue m_ttlEntries; + PriorityQueue m_ttlEntries; bool m_ttlEnabled = false; size_t m_tickCount = 0; }; diff --git a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp index f6fb7f63..7887018f 100644 --- a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp +++ b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp @@ -36,7 +36,7 @@ std::optional> CalculateNewPath(const NavG std::vector AllNodes; - std::priority_queue,std::vector< std::pair >, PathNodeCmp> openList, closedList; + core::storage::PriorityQueue,std::vector< std::pair >, PathNodeCmp> openList, closedList; std::map minCosts; AllNodes.push_back(PathNode(startNode, 0, graph->GetHeuristicCost(startNode, destNode) )); diff --git a/PolyEngine/Engine/Src/EnginePCH.hpp b/PolyEngine/Engine/Src/EnginePCH.hpp index b3977ef3..9c9e7bfb 100644 --- a/PolyEngine/Engine/Src/EnginePCH.hpp +++ b/PolyEngine/Engine/Src/EnginePCH.hpp @@ -41,6 +41,8 @@ #include #include #include +#include + // Other #include diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index 8ba52b62..799b88a7 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -6,7 +6,7 @@ using namespace Poly; -using PairQueue = std::priority_queue,std::vector>,std::function&, const std::pair&)>>; +using PairQueue = core::storage::PriorityQueue,std::vector>,std::function&, const std::pair&)>>; RTTI_DEFINE_TYPE(Poly::MeshResource) diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp index 66e1252e..d09c10b4 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp @@ -3,7 +3,7 @@ #include #include // std::min - +#include #include #include #include @@ -16,7 +16,7 @@ #include using namespace Poly; -using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; void GLRenderingDevice::Init() { @@ -238,7 +238,6 @@ void GLRenderingDevice::CullShadowCasters(SceneView& sceneView, const core::math // find all meshes that are inside extended DirLights AABB box core::math::Vector dirLightPos = sceneView.DirectionalLightList[0]->GetTransform().GetGlobalTranslation(); MeshQueue shadowCasterQueue(SceneView::DistanceToCameraComparator(dirLightPos, SceneView::eSortOrderType::FRONT_TO_BACK)); - for (auto& [box, meshCmp] : boxMeshes) { if (frustumAABBInLS.Contains(box)) diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp index 44afb0a8..02a24a9e 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp @@ -4,6 +4,7 @@ #include #include #include +#include // TODO: inherit from BaseRenderPass - make multipass RenderPass @@ -69,10 +70,10 @@ namespace Poly { const CameraComponent* CameraCmp; const RenderingSettingsComponent* SettingsCmp; - std::priority_queue, DistanceToCameraComparator> DirShadowCastersQueue; - std::priority_queue, DistanceToCameraComparator> OpaqueQueue; - std::priority_queue, DistanceToCameraComparator> TranslucentQueue; - std::priority_queue, DistanceToCameraComparator> ParticleQueue; // TODO: make translucent and particles one queue with common priority + core::storage::PriorityQueue, DistanceToCameraComparator> DirShadowCastersQueue; + core::storage::PriorityQueue, DistanceToCameraComparator> OpaqueQueue; + core::storage::PriorityQueue, DistanceToCameraComparator> TranslucentQueue; + core::storage::PriorityQueue, DistanceToCameraComparator> ParticleQueue; // TODO: make translucent and particles one queue with common priority ::pe::core::math::AABox DirShadowAABBInLS; std::vector DirectionalLightList; diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp index 150c1d2f..1fb1a1dc 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp @@ -1,11 +1,11 @@ #include - +#include #include #include #include using namespace Poly; -using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; core::math::Matrix Poly::GetProjectionForShadowMap(const SceneView& sceneView, int shadowmapSize) { diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp index d769643e..e2bb3ab9 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp @@ -3,7 +3,7 @@ #include #include #include - +#include #include #include #include @@ -17,7 +17,7 @@ #include using namespace Poly; -using MeshQueue = std::priority_queue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; void RenderTargetPingPong::Init(int width, int height) { @@ -691,7 +691,7 @@ void TiledForwardRenderer::RenderOpaqueLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); - std::priority_queue, SceneView::DistanceToCameraComparator> drawOpaqueQueue(sceneView.OpaqueQueue); + core::storage::PriorityQueue, SceneView::DistanceToCameraComparator> drawOpaqueQueue(sceneView.OpaqueQueue); while (drawOpaqueQueue.size() > 0) { const MeshRenderingComponent* meshCmp = drawOpaqueQueue.top(); @@ -903,7 +903,7 @@ void TiledForwardRenderer::RenderTranslucentLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); // for (const MeshRenderingComponent* meshCmp : sceneView.TranslucentQueue) // { - std::priority_queue, SceneView::DistanceToCameraComparator> drawTranslucentQueue(sceneView.TranslucentQueue); + core::storage::PriorityQueue, SceneView::DistanceToCameraComparator> drawTranslucentQueue(sceneView.TranslucentQueue); while (drawTranslucentQueue.size() > 0) { const MeshRenderingComponent* meshCmp = drawTranslucentQueue.top(); From 24a233a4674ce5624a3d8f0f0d074788a2aef8d4 Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 6 Jan 2020 23:35:36 +0100 Subject: [PATCH 11/25] add missing std:: --- .../Core/Src/pe/core/storage/PriorityQueue.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 9a005d8f..757f87dd 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -43,28 +43,28 @@ namespace pe::core::storage } template>> + class = std::enable_if_t>> explicit PriorityQueue(const _Alloc& _Al) : priority_queue(_All) { } template>> + class = std::enable_if_t>> PriorityQueue(const _Pr& _Pred, const _Alloc& _Al) : priority_queue(_Pred,_Al) { } template>> + class = std::enable_if_t>> PriorityQueue(const _Pr& _Pred, const _Container& _Cont, const _Alloc& _Al) : priority_queue(_Pred,_Cont,_Al) { } template>> + class = std::enable_if_t>> PriorityQueue(const priority_queue& _Right, const _Alloc& _Al) : priority_queue(_Right,_Al) { @@ -80,16 +80,16 @@ namespace pe::core::storage : priority_queue(_First,_Last,_Pred,_Cont) { } - + template>> + class = std::enable_if_t>> PriorityQueue(const _Pr& _Pred, _Container&& _Cont, const _Alloc& _Al) : priority_queue(_Pred,_Cont,_Al) { } template>> + class = std::enable_if_t>> PriorityQueue(priority_queue&& _Right, const _Alloc& _Al) : priority_queue(_Right,_Al) { From b5f492089aff5ae5f458d624adfbcc465c87106d Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 7 Jan 2020 00:34:33 +0100 Subject: [PATCH 12/25] fix compile errors --- .../Src/pe/core/storage/PriorityQueue.hpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 757f87dd..da5fec79 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -10,88 +10,88 @@ namespace pe::core::storage public: PriorityQueue() - : priority_queue() + : std::priority_queue<_Ty, _Container, _Pr>() { } explicit PriorityQueue(const _Pr& _Pred) - : priority_queue(_Pred) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred) { } PriorityQueue(const _Pr& _Pred, const _Container& _Cont) - : priority_queue(_Pred,_Cont) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont) { } template PriorityQueue(_InIt _First, _InIt _Last) - : priority_queue(_First,_Last) + : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last) { } template PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred) - : priority_queue(_Firest,_Last,_Pred) + : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred) { } template PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, const _Container& _Cont) - : priority_queue(_First,_Last,_Pred,_Cont) + : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred,_Cont) { } template>> explicit PriorityQueue(const _Alloc& _Al) - : priority_queue(_All) + : std::priority_queue<_Ty, _Container, _Pr>(_All) { } template>> PriorityQueue(const _Pr& _Pred, const _Alloc& _Al) - : priority_queue(_Pred,_Al) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Al) { } template>> PriorityQueue(const _Pr& _Pred, const _Container& _Cont, const _Alloc& _Al) - : priority_queue(_Pred,_Cont,_Al) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont,_Al) { } template>> PriorityQueue(const priority_queue& _Right, const _Alloc& _Al) - : priority_queue(_Right,_Al) + : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) { } PriorityQueue(const _Pr& _Pred, _Container&& _Cont) - : priority_queue(_Pred,_Cont) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont) { } template PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, _Container&& _Cont) - : priority_queue(_First,_Last,_Pred,_Cont) + : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred,_Cont) { } template>> PriorityQueue(const _Pr& _Pred, _Container&& _Cont, const _Alloc& _Al) - : priority_queue(_Pred,_Cont,_Al) + : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont,_Al) { } template>> PriorityQueue(priority_queue&& _Right, const _Alloc& _Al) - : priority_queue(_Right,_Al) + : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) { } From 72dbbdb648f1fc5ca893a3020d80e5e9bc49eb9e Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 7 Jan 2020 00:55:23 +0100 Subject: [PATCH 13/25] fix misstypes --- PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index da5fec79..3a116102 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -45,7 +45,7 @@ namespace pe::core::storage template>> explicit PriorityQueue(const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_All) + : std::priority_queue<_Ty, _Container, _Pr>(_Al) { } @@ -65,7 +65,7 @@ namespace pe::core::storage template>> - PriorityQueue(const priority_queue& _Right, const _Alloc& _Al) + PriorityQueue(const std::priority_queue<_Ty, _Container, _Pr>& _Right, const _Alloc& _Al) : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) { } @@ -90,7 +90,7 @@ namespace pe::core::storage template>> - PriorityQueue(priority_queue&& _Right, const _Alloc& _Al) + PriorityQueue(priority_queue& _Right, const _Alloc& _Al) : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) { } From efa1768c6b36bde3c5f0a75acab054ccd37cc691 Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 7 Jan 2020 18:34:05 +0100 Subject: [PATCH 14/25] fix clear method compile errors --- PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 3a116102..e3571bcd 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -90,7 +90,7 @@ namespace pe::core::storage template>> - PriorityQueue(priority_queue& _Right, const _Alloc& _Al) + PriorityQueue(std::priority_queue<_Ty, _Container, _Pr>&& _Right, const _Alloc& _Al) : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) { } @@ -98,7 +98,7 @@ namespace pe::core::storage void clear() { - c.clear(); + this->c.clear(); } }; } From 42a6e0e4b0633596076cb6c517435c7969810dde Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 23 Jan 2020 22:15:50 +0100 Subject: [PATCH 15/25] update priority queue templates --- .../Src/pe/core/storage/PriorityQueue.hpp | 69 +++++-------------- .../Engine/Src/AI/PathfindingSystem.cpp | 2 +- .../Engine/Src/Resources/MeshResource.cpp | 2 +- .../OpenGL/Src/GLWorldRendering.cpp | 2 +- .../OpenGL/Src/IRendererInterface.hpp | 8 +-- .../OpenGL/Src/Pipeline/ShadowMapPass.cpp | 2 +- .../OpenGL/Src/TiledForwardRenderer.cpp | 6 +- 7 files changed, 29 insertions(+), 62 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index e3571bcd..e7edf989 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -4,94 +4,61 @@ namespace pe::core::storage { - template,class _Pr = std::less > - class PriorityQueue final : public std::priority_queue<_Ty,_Container,_Pr> + template::value_type> > + class PriorityQueue final : public std::priority_queue<_Ty,std::vector<_Ty>,_Pr> { public: PriorityQueue() - : std::priority_queue<_Ty, _Container, _Pr>() + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>() { } explicit PriorityQueue(const _Pr& _Pred) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred) { } - PriorityQueue(const _Pr& _Pred, const _Container& _Cont) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont) - { - } template PriorityQueue(_InIt _First, _InIt _Last) - : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_First,_Last) { } template PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred) - : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred) - { - } - - template - PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, const _Container& _Cont) - : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred,_Cont) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_First,_Last,_Pred) { } + template>> + class = std::enable_if_t, _Alloc>>> explicit PriorityQueue(const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Al) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Al) { } template>> + class = std::enable_if_t, _Alloc>>> PriorityQueue(const _Pr& _Pred, const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Al) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred,_Al) { } template>> - PriorityQueue(const _Pr& _Pred, const _Container& _Cont, const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont,_Al) - { - } - - template>> - PriorityQueue(const std::priority_queue<_Ty, _Container, _Pr>& _Right, const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) - { - } - - PriorityQueue(const _Pr& _Pred, _Container&& _Cont) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont) - { - } - - template - PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred, _Container&& _Cont) - : std::priority_queue<_Ty, _Container, _Pr>(_First,_Last,_Pred,_Cont) - { - } - - template>> - PriorityQueue(const _Pr& _Pred, _Container&& _Cont, const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Pred,_Cont,_Al) + class = std::enable_if_t, _Alloc>>> + PriorityQueue(const std::priority_queue<_Ty, std::vector<_Ty>, _Pr>& _Right, const _Alloc& _Al) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Right,_Al) { } + template>> - PriorityQueue(std::priority_queue<_Ty, _Container, _Pr>&& _Right, const _Alloc& _Al) - : std::priority_queue<_Ty, _Container, _Pr>(_Right,_Al) + class = std::enable_if_t, _Alloc>>> + PriorityQueue(std::priority_queue<_Ty, std::vector<_Ty>, _Pr>&& _Right, const _Alloc& _Al) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Right,_Al) { } diff --git a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp index 7887018f..ad7e1fd1 100644 --- a/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp +++ b/PolyEngine/Engine/Src/AI/PathfindingSystem.cpp @@ -36,7 +36,7 @@ std::optional> CalculateNewPath(const NavG std::vector AllNodes; - core::storage::PriorityQueue,std::vector< std::pair >, PathNodeCmp> openList, closedList; + core::storage::PriorityQueue, PathNodeCmp> openList, closedList; std::map minCosts; AllNodes.push_back(PathNode(startNode, 0, graph->GetHeuristicCost(startNode, destNode) )); diff --git a/PolyEngine/Engine/Src/Resources/MeshResource.cpp b/PolyEngine/Engine/Src/Resources/MeshResource.cpp index 799b88a7..fa03c42f 100644 --- a/PolyEngine/Engine/Src/Resources/MeshResource.cpp +++ b/PolyEngine/Engine/Src/Resources/MeshResource.cpp @@ -6,7 +6,7 @@ using namespace Poly; -using PairQueue = core::storage::PriorityQueue,std::vector>,std::function&, const std::pair&)>>; +using PairQueue = core::storage::PriorityQueue,std::function&, const std::pair&)>>; RTTI_DEFINE_TYPE(Poly::MeshResource) diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp index d09c10b4..c8921040 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/GLWorldRendering.cpp @@ -16,7 +16,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue; void GLRenderingDevice::Init() { diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp index 02a24a9e..7a189b5e 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/IRendererInterface.hpp @@ -70,10 +70,10 @@ namespace Poly { const CameraComponent* CameraCmp; const RenderingSettingsComponent* SettingsCmp; - core::storage::PriorityQueue, DistanceToCameraComparator> DirShadowCastersQueue; - core::storage::PriorityQueue, DistanceToCameraComparator> OpaqueQueue; - core::storage::PriorityQueue, DistanceToCameraComparator> TranslucentQueue; - core::storage::PriorityQueue, DistanceToCameraComparator> ParticleQueue; // TODO: make translucent and particles one queue with common priority + core::storage::PriorityQueue DirShadowCastersQueue; + core::storage::PriorityQueue OpaqueQueue; + core::storage::PriorityQueue TranslucentQueue; + core::storage::PriorityQueue ParticleQueue; // TODO: make translucent and particles one queue with common priority ::pe::core::math::AABox DirShadowAABBInLS; std::vector DirectionalLightList; diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp index 1fb1a1dc..2131368f 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/Pipeline/ShadowMapPass.cpp @@ -5,7 +5,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue; core::math::Matrix Poly::GetProjectionForShadowMap(const SceneView& sceneView, int shadowmapSize) { diff --git a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp index e2bb3ab9..918dcfc2 100644 --- a/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp +++ b/PolyEngine/RenderingDevice/OpenGL/Src/TiledForwardRenderer.cpp @@ -17,7 +17,7 @@ #include using namespace Poly; -using MeshQueue = core::storage::PriorityQueue, SceneView::DistanceToCameraComparator>; +using MeshQueue = core::storage::PriorityQueue; void RenderTargetPingPong::Init(int width, int height) { @@ -691,7 +691,7 @@ void TiledForwardRenderer::RenderOpaqueLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); - core::storage::PriorityQueue, SceneView::DistanceToCameraComparator> drawOpaqueQueue(sceneView.OpaqueQueue); + core::storage::PriorityQueue drawOpaqueQueue(sceneView.OpaqueQueue); while (drawOpaqueQueue.size() > 0) { const MeshRenderingComponent* meshCmp = drawOpaqueQueue.top(); @@ -903,7 +903,7 @@ void TiledForwardRenderer::RenderTranslucentLit(const SceneView& sceneView) const core::math::Matrix& clipFromWorld = sceneView.CameraCmp->GetClipFromWorld(); // for (const MeshRenderingComponent* meshCmp : sceneView.TranslucentQueue) // { - core::storage::PriorityQueue, SceneView::DistanceToCameraComparator> drawTranslucentQueue(sceneView.TranslucentQueue); + core::storage::PriorityQueue drawTranslucentQueue(sceneView.TranslucentQueue); while (drawTranslucentQueue.size() > 0) { const MeshRenderingComponent* meshCmp = drawTranslucentQueue.top(); From 2194cd534e819ad30589c5ea14a2526e639a0fde Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 28 Jan 2020 17:01:30 +0100 Subject: [PATCH 16/25] add priority queue tests --- .../Src/pe/core/storage/PriorityQueue.hpp | 11 ++ .../CoreTests/Src/PriorityQueueTests.cpp | 100 ++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index e7edf989..1c27c6a3 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -14,6 +14,17 @@ namespace pe::core::storage { } + PriorityQueue(const std::vector<_Ty>& _Cont) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pr(), _Cont) + { + } + + PriorityQueue(const _Pr& _Pred, const std::vector<_Ty>& _Cont) + : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred,_Cont) + { + } + + explicit PriorityQueue(const _Pr& _Pred) : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred) { diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp new file mode 100644 index 00000000..21bbd453 --- /dev/null +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -0,0 +1,100 @@ +#include +#include +#include + +TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") +{ + ::pe::core::storage::PriorityQueue q; + const int testSize = 10; + + for (int i = 0; i < testSize; ++i) + { + q.push(i); + CHECK(q.size() == i+1); + } + + for (int i = 0; i < testSize; ++i) + { + CHECK(q.top() == i); + q.pop(); + } +} + +TEST_CASE("PriorityQueue reverrse sorted push test", "[PriorityQueue]") +{ + ::pe::core::storage::PriorityQueue q; + const int testSize = 100; + + for (int i = 0; i < testSize; ++i) + { + q.push(testSize - i - 1); + CHECK(q.size() == i + 1); + } + + for (int i = 0; i < testSize; ++i) + { + CHECK(q.top() == i); + q.pop(); + } +} + +TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") +{ + ::pe::core::storage::PriorityQueue q; + const size_t testSize = 100; + + for (size_t i = 0; i < testSize; ++i) + { + q.push(rand()); + CHECK(q.size() == i + 1); + } + + for (size_t i = 0; i < testSize - 1; ++i) + { + size_t v1 = q.top(); + q.pop(); + CHECK(v1 <= q.top()); + } +} + +struct CustomTestComparator +{ + bool operator()(int a, int b) const { return a > b; } +}; + +TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") +{ + ::pe::core::storage::PriorityQueue q; + const size_t testSize = 100; + + for (size_t i = 0; i < testSize; ++i) + { + q.push(rand()); + CHECK(q.size() == i + 1); + } + + for (size_t i = 0; i < testSize - 1; ++i) + { + size_t v1 = q.top(); + q.pop(); + CHECK(v1 >= q.top()); + } +} + +TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") +{ + const size_t testSize = 100; + + std::vector table(testSize); + for (size_t i = 0; i < testSize; ++i) + table.push_back(rand()); + + ::pe::core::storage::PriorityQueue q(std::move(table)); + + for (size_t i = 0; i < testSize - 1; ++i) + { + size_t v1 = q.top(); + q.pop(); + CHECK(v1 <= q.top()); + } +} \ No newline at end of file From ffec39698643fa09c1c55d9cf30e2a7e8841964b Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 28 Jan 2020 17:56:51 +0100 Subject: [PATCH 17/25] fix priority queue comparator in tests --- .../Tests/CoreTests/Src/PriorityQueueTests.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index 21bbd453..d48d5ff0 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -13,7 +13,7 @@ TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") CHECK(q.size() == i+1); } - for (int i = 0; i < testSize; ++i) + for (int i = testSize-1; i >= 0; --i) { CHECK(q.top() == i); q.pop(); @@ -31,7 +31,7 @@ TEST_CASE("PriorityQueue reverrse sorted push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = 0; i < testSize; ++i) + for (int i = testSize - 1; i >= 0; --i) { CHECK(q.top() == i); q.pop(); @@ -49,11 +49,11 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (size_t i = 0; i < testSize - 1; ++i) + for (int i = testSize - 2; i >= 0; --i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } @@ -73,11 +73,11 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (size_t i = 0; i < testSize - 1; ++i) + for (int i = testSize - 2; i >= 0; --i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } @@ -91,10 +91,10 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") ::pe::core::storage::PriorityQueue q(std::move(table)); - for (size_t i = 0; i < testSize - 1; ++i) + for (int i = testSize - 2; i >= 0; --i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } \ No newline at end of file From 014937d687c167bfe0f25fcff80b910b7f28b0da Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 28 Jan 2020 23:35:14 +0100 Subject: [PATCH 18/25] fix loops --- PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index d48d5ff0..b319b0ed 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -49,7 +49,7 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = testSize - 2; i >= 0; --i) + for (int i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); @@ -73,7 +73,7 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = testSize - 2; i >= 0; --i) + for (int i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); @@ -91,7 +91,7 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") ::pe::core::storage::PriorityQueue q(std::move(table)); - for (int i = testSize - 2; i >= 0; --i) + for (int i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); From 69b7645f2fdc001cc59f74e7d0eea0b2f42c0af7 Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 28 Jan 2020 23:50:57 +0100 Subject: [PATCH 19/25] fix spelling errors --- .../Src/pe/core/storage/PriorityQueue.hpp | 62 +++++++++---------- .../storage/impl/IndexedStringManager.cpp | 1 - .../CoreTests/Src/PriorityQueueTests.cpp | 4 +- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 1c27c6a3..bca4142c 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -4,72 +4,72 @@ namespace pe::core::storage { - template::value_type> > - class PriorityQueue final : public std::priority_queue<_Ty,std::vector<_Ty>,_Pr> + template::value_type> > + class PriorityQueue final : public std::priority_queue,Pr> { public: PriorityQueue() - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>() + : std::priority_queue, Pr>() { } - PriorityQueue(const std::vector<_Ty>& _Cont) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pr(), _Cont) + PriorityQueue(const std::vector& _Cont) + : std::priority_queue, Pr>(Pr(), _Cont) { } - PriorityQueue(const _Pr& _Pred, const std::vector<_Ty>& _Cont) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred,_Cont) + PriorityQueue(const Pr& Pred, const std::vector& _Cont) + : std::priority_queue, Pr>(Pred,_Cont) { } - explicit PriorityQueue(const _Pr& _Pred) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred) + explicit PriorityQueue(const Pr& Pred) + : std::priority_queue, Pr>(Pred) { } - template - PriorityQueue(_InIt _First, _InIt _Last) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_First,_Last) + template + PriorityQueue(InIt _First, InIt _Last) + : std::priority_queue, Pr>(_First,_Last) { } - template - PriorityQueue(_InIt _First, _InIt _Last, const _Pr& _Pred) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_First,_Last,_Pred) + template + PriorityQueue(InIt _First, InIt _Last, const Pr& Pred) + : std::priority_queue, Pr>(_First,_Last,Pred) { } - template, _Alloc>>> - explicit PriorityQueue(const _Alloc& _Al) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Al) + template, Alloc>>> + explicit PriorityQueue(const Alloc& _Al) + : std::priority_queue, Pr>(_Al) { } - template, _Alloc>>> - PriorityQueue(const _Pr& _Pred, const _Alloc& _Al) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Pred,_Al) + template, Alloc>>> + PriorityQueue(const Pr& Pred, const Alloc& _Al) + : std::priority_queue, Pr>(Pred,_Al) { } - template, _Alloc>>> - PriorityQueue(const std::priority_queue<_Ty, std::vector<_Ty>, _Pr>& _Right, const _Alloc& _Al) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Right,_Al) + template, Alloc>>> + PriorityQueue(const std::priority_queue, Pr>& _Right, const Alloc& _Al) + : std::priority_queue, Pr>(_Right,_Al) { } - template, _Alloc>>> - PriorityQueue(std::priority_queue<_Ty, std::vector<_Ty>, _Pr>&& _Right, const _Alloc& _Al) - : std::priority_queue<_Ty, std::vector<_Ty>, _Pr>(_Right,_Al) + template, Alloc>>> + PriorityQueue(std::priority_queue, Pr>&& _Right, const Alloc& _Al) + : std::priority_queue, Pr>(_Right,_Al) { } diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp index 4bcb1c67..b49763bb 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.cpp @@ -1,6 +1,5 @@ #include - namespace pe::core::storage::impl { diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index b319b0ed..011ffafe 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -13,14 +13,14 @@ TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") CHECK(q.size() == i+1); } - for (int i = testSize-1; i >= 0; --i) + for (int i = testSize - 1; i >= 0; --i) { CHECK(q.top() == i); q.pop(); } } -TEST_CASE("PriorityQueue reverrse sorted push test", "[PriorityQueue]") +TEST_CASE("PriorityQueue reverse sorted push test", "[PriorityQueue]") { ::pe::core::storage::PriorityQueue q; const int testSize = 100; From 9ceb7763f5ace34b701e7e0286cbf295db053d78 Mon Sep 17 00:00:00 2001 From: Piotr Date: Wed, 29 Jan 2020 00:26:23 +0100 Subject: [PATCH 20/25] fix compile errors --- PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index bca4142c..474ca81b 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -45,21 +45,21 @@ namespace pe::core::storage template, Alloc>>> + class = std::enable_if_t, Alloc>>> explicit PriorityQueue(const Alloc& _Al) : std::priority_queue, Pr>(_Al) { } template, Alloc>>> + class = std::enable_if_t, Alloc>>> PriorityQueue(const Pr& Pred, const Alloc& _Al) : std::priority_queue, Pr>(Pred,_Al) { } template, Alloc>>> + class = std::enable_if_t, Alloc>>> PriorityQueue(const std::priority_queue, Pr>& _Right, const Alloc& _Al) : std::priority_queue, Pr>(_Right,_Al) { @@ -67,7 +67,7 @@ namespace pe::core::storage template, Alloc>>> + class = std::enable_if_t, Alloc>>> PriorityQueue(std::priority_queue, Pr>&& _Right, const Alloc& _Al) : std::priority_queue, Pr>(_Right,_Al) { From 66187a1d631fbfb7869874ae331254d0ec61005a Mon Sep 17 00:00:00 2001 From: Piotr Date: Wed, 29 Jan 2020 00:43:48 +0100 Subject: [PATCH 21/25] fix comparsion errors --- PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index 011ffafe..0eb6de59 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -49,7 +49,7 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); @@ -73,7 +73,7 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); @@ -91,7 +91,7 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") ::pe::core::storage::PriorityQueue q(std::move(table)); - for (int i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 2; ++i) { size_t v1 = q.top(); q.pop(); From 8c379592c6093962745846310c68efd23ef32f10 Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 24 Feb 2020 00:51:05 +0100 Subject: [PATCH 22/25] change default priority queue predicament from lesser to greater --- .../Core/Src/pe/core/storage/PriorityQueue.hpp | 2 +- .../Tests/CoreTests/Src/PriorityQueueTests.cpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 474ca81b..e657ca50 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -4,7 +4,7 @@ namespace pe::core::storage { - template::value_type> > + template::value_type> > class PriorityQueue final : public std::priority_queue,Pr> { public: diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index 0eb6de59..616ac468 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -13,7 +13,7 @@ TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") CHECK(q.size() == i+1); } - for (int i = testSize - 1; i >= 0; --i) + for (int i = 0; i < testSize; ++i) { CHECK(q.top() == i); q.pop(); @@ -31,7 +31,7 @@ TEST_CASE("PriorityQueue reverse sorted push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (int i = testSize - 1; i >= 0; --i) + for (int i = 0; i < testSize; ++i) { CHECK(q.top() == i); q.pop(); @@ -49,17 +49,17 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (size_t i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 1; ++i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } struct CustomTestComparator { - bool operator()(int a, int b) const { return a > b; } + bool operator()(int a, int b) const { return a < b; } }; TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") @@ -73,11 +73,11 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") CHECK(q.size() == i + 1); } - for (size_t i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 1; ++i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } @@ -91,10 +91,10 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") ::pe::core::storage::PriorityQueue q(std::move(table)); - for (size_t i = 0; i < testSize - 2; ++i) + for (size_t i = 0; i < testSize - 1; ++i) { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } \ No newline at end of file From 3c696262bfe210f3bcd167d59e4cae9d425d95e1 Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 24 Feb 2020 01:29:37 +0100 Subject: [PATCH 23/25] add missing comparator --- .../Core/Src/pe/core/storage/impl/IndexedStringManager.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp index 25bf703a..7aa02149 100644 --- a/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/impl/IndexedStringManager.hpp @@ -13,6 +13,7 @@ struct TTLEntry const IndexedStringEntry* m_entry; bool operator<(const TTLEntry& rhs) const { return m_scheduledTimePoint < rhs.m_scheduledTimePoint; } + bool operator>(const TTLEntry& rhs) const { return m_scheduledTimePoint > rhs.m_scheduledTimePoint; } }; class CORE_DLLEXPORT IndexedStringManager final : public core::BaseObjectLiteralType<> From 8a5c5ee325d410a734eff6592e01f55d87771935 Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 27 Feb 2020 20:01:47 +0100 Subject: [PATCH 24/25] change back default predicament from greater to less --- .../Core/Src/pe/core/storage/PriorityQueue.hpp | 2 +- .../Tests/CoreTests/Src/PriorityQueueTests.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index e657ca50..474ca81b 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -4,7 +4,7 @@ namespace pe::core::storage { - template::value_type> > + template::value_type> > class PriorityQueue final : public std::priority_queue,Pr> { public: diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index 616ac468..5a410eca 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -15,7 +15,7 @@ TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") for (int i = 0; i < testSize; ++i) { - CHECK(q.top() == i); + CHECK(q.top() == testSize - i - 1); q.pop(); } } @@ -33,7 +33,7 @@ TEST_CASE("PriorityQueue reverse sorted push test", "[PriorityQueue]") for (int i = 0; i < testSize; ++i) { - CHECK(q.top() == i); + CHECK(q.top() == testSize - i - 1); q.pop(); } } @@ -53,13 +53,13 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } struct CustomTestComparator { - bool operator()(int a, int b) const { return a < b; } + bool operator()(int a, int b) const { return a > b; } }; TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") @@ -77,7 +77,7 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } @@ -95,6 +95,6 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } \ No newline at end of file From e0aaea8a38836ff854728a77d066f58f4537cb76 Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 23 Mar 2020 12:34:46 +0100 Subject: [PATCH 25/25] change priority queue comparator from less to greater --- .../Core/Src/pe/core/storage/PriorityQueue.hpp | 2 +- .../Tests/CoreTests/Src/PriorityQueueTests.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp index 474ca81b..e657ca50 100644 --- a/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp +++ b/PolyEngine/Core/Src/pe/core/storage/PriorityQueue.hpp @@ -4,7 +4,7 @@ namespace pe::core::storage { - template::value_type> > + template::value_type> > class PriorityQueue final : public std::priority_queue,Pr> { public: diff --git a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp index 5a410eca..616ac468 100644 --- a/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp +++ b/PolyEngine/Tests/CoreTests/Src/PriorityQueueTests.cpp @@ -15,7 +15,7 @@ TEST_CASE("PriorityQueue sorted push test", "[PriorityQueue]") for (int i = 0; i < testSize; ++i) { - CHECK(q.top() == testSize - i - 1); + CHECK(q.top() == i); q.pop(); } } @@ -33,7 +33,7 @@ TEST_CASE("PriorityQueue reverse sorted push test", "[PriorityQueue]") for (int i = 0; i < testSize; ++i) { - CHECK(q.top() == testSize - i - 1); + CHECK(q.top() == i); q.pop(); } } @@ -53,13 +53,13 @@ TEST_CASE("PriorityQueue random push test", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } struct CustomTestComparator { - bool operator()(int a, int b) const { return a > b; } + bool operator()(int a, int b) const { return a < b; } }; TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") @@ -77,7 +77,7 @@ TEST_CASE("PriorityQueue custom comparator test", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 <= q.top()); + CHECK(v1 >= q.top()); } } @@ -95,6 +95,6 @@ TEST_CASE("PriorityQueue heap sort", "[PriorityQueue]") { size_t v1 = q.top(); q.pop(); - CHECK(v1 >= q.top()); + CHECK(v1 <= q.top()); } } \ No newline at end of file