#pragma once
#include <vector>
#include <map>
#include <queue>

#include "AStarBase.h"

class AStar {
public:
  AStar(void);
  ~AStar(void);

  std::vector<AStarBase*> Solve(AStarBase* initState);

private:
  // Comparison structure.
  struct Cmp : public std::binary_function<AStarBase*, AStarBase*, bool> {
     bool operator()(AStarBase* a1, AStarBase* a2) const {
       return (a1->_totalEstimatedCost >= a2->_totalEstimatedCost);
     }
   };

  std::priority_queue<AStarBase*, std::vector<AStarBase*>, Cmp > _openList;
  std::map<const long, AStarBase*> _closedList;

  AStarBase* Search(void);

  std::vector<AStarBase*> GetSolutionSequence(AStarBase* node);
  std::vector<AStarBase*> _solution;
};