Browse Source

Extract priority queue construction for reuse.

DjWarmonger 8 năm trước cách đây
mục cha
commit
63d33a1e7c
2 tập tin đã thay đổi với 17 bổ sung12 xóa
  1. 5 12
      lib/rmg/CRmgTemplateZone.cpp
  2. 12 0
      lib/rmg/CRmgTemplateZone.h

+ 5 - 12
lib/rmg/CRmgTemplateZone.cpp

@@ -24,8 +24,6 @@
 #include "../mapObjects/CGPandoraBox.h"
 #include "../mapObjects/CRewardableObject.h"
 
-#include <boost/heap/priority_queue.hpp> //A*
-
 class CMap;
 class CMapEditManager;
 //class CGObjectInstance;
@@ -751,22 +749,17 @@ do not leave zone border
 
 	return result;
 }
+boost::heap::priority_queue<CRmgTemplateZone::TDistance, boost::heap::compare<CRmgTemplateZone::NodeComparer>> CRmgTemplateZone::createPiorityQueue()
+{
+	return boost::heap::priority_queue<TDistance, boost::heap::compare<NodeComparer>>();
+}
 
 bool CRmgTemplateZone::createRoad(CMapGenerator* gen, const int3& src, const int3& dst)
 {
 	//A* algorithm taken from Wiki http://en.wikipedia.org/wiki/A*_search_algorithm
 
-	typedef std::pair<int3, float> TDistance;
-	struct NodeComparer
-	{
-		bool operator()(const TDistance & lhs, const TDistance & rhs) const
-		{
-			return (rhs.second < lhs.second);
-		}
-	};
-
 	std::set<int3> closed;    // The set of nodes already evaluated.
-	boost::heap::priority_queue<TDistance, boost::heap::compare<NodeComparer>> pq;    // The set of tentative nodes to be evaluated, initially containing the start node
+	auto pq = std::move(createPiorityQueue());    // The set of tentative nodes to be evaluated, initially containing the start node
 	std::map<int3, int3> cameFrom;  // The map of navigated nodes.
 	std::map<int3, float> distances;
 	

+ 12 - 0
lib/rmg/CRmgTemplateZone.h

@@ -17,6 +17,7 @@
 #include "../int3.h"
 #include "../ResourceSet.h" //for TResource (?)
 #include "../mapObjects/ObjectTemplate.h"
+#include <boost/heap/priority_queue.hpp> //A*
 
 class CMapGenerator;
 class CTileInfo;
@@ -211,6 +212,17 @@ public:
 	void addRoadNode(const int3 & node);
 	void connectRoads(CMapGenerator * gen); //fills "roads" according to "roadNodes"
 
+	//A* priority queue
+	typedef std::pair<int3, float> TDistance;
+	struct NodeComparer
+	{
+		bool operator()(const TDistance & lhs, const TDistance & rhs) const
+		{
+			return (rhs.second < lhs.second);
+		}
+	};
+	boost::heap::priority_queue<TDistance, boost::heap::compare<NodeComparer>> createPiorityQueue();
+
 private:
 	//template info
 	TRmgTemplateZoneId id;