78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* $Id$ */
 | 
						|
 | 
						|
#ifndef  YAPF_NODE_HPP
 | 
						|
#define  YAPF_NODE_HPP
 | 
						|
 | 
						|
/** Yapf Node Key that evaluates hash from (and compares) tile & exit dir. */
 | 
						|
struct CYapfNodeKeyExitDir {
 | 
						|
	TileIndex      m_tile;
 | 
						|
	Trackdir       m_td;
 | 
						|
	DiagDirection  m_exitdir;
 | 
						|
 | 
						|
	FORCEINLINE void Set(TileIndex tile, Trackdir td)
 | 
						|
	{
 | 
						|
		m_tile = tile;
 | 
						|
		m_td = td;
 | 
						|
		m_exitdir = (m_td == INVALID_TRACKDIR) ? INVALID_DIAGDIR : TrackdirToExitdir(m_td);
 | 
						|
	}
 | 
						|
 | 
						|
	FORCEINLINE int CalcHash() const {return m_exitdir | (m_tile << 2);}
 | 
						|
	FORCEINLINE bool operator == (const CYapfNodeKeyExitDir& other) const {return (m_tile == other.m_tile) && (m_exitdir == other.m_exitdir);}
 | 
						|
};
 | 
						|
 | 
						|
struct CYapfNodeKeyTrackDir : public CYapfNodeKeyExitDir
 | 
						|
{
 | 
						|
	FORCEINLINE int CalcHash() const {return m_td | (m_tile << 4);}
 | 
						|
	FORCEINLINE bool operator == (const CYapfNodeKeyTrackDir& other) const {return (m_tile == other.m_tile) && (m_td == other.m_td);}
 | 
						|
};
 | 
						|
 | 
						|
/** Yapf Node base */
 | 
						|
template <class Tkey_, class Tnode>
 | 
						|
struct CYapfNodeT {
 | 
						|
	typedef Tkey_ Key;
 | 
						|
	typedef Tnode Node;
 | 
						|
 | 
						|
	Tkey_       m_key;
 | 
						|
	Node       *m_hash_next;
 | 
						|
	Node       *m_parent;
 | 
						|
	int         m_cost;
 | 
						|
	int         m_estimate;
 | 
						|
 | 
						|
	FORCEINLINE void Set(Node *parent, TileIndex tile, Trackdir td)
 | 
						|
	{
 | 
						|
		m_key.Set(tile, td);
 | 
						|
		m_hash_next = NULL;
 | 
						|
		m_parent = parent;
 | 
						|
		m_cost = 0;
 | 
						|
		m_estimate = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	FORCEINLINE Node* GetHashNext() {return m_hash_next;}
 | 
						|
	FORCEINLINE void SetHashNext(Node *pNext) {m_hash_next = pNext;}
 | 
						|
	FORCEINLINE TileIndex GetTile() const {return m_key.m_tile;}
 | 
						|
	FORCEINLINE Trackdir GetTrackdir() const {return m_key.m_td;}
 | 
						|
	FORCEINLINE const Tkey_& GetKey() const {return m_key;}
 | 
						|
	FORCEINLINE int GetCost() {return m_cost;}
 | 
						|
	FORCEINLINE int GetCostEstimate() {return m_estimate;}
 | 
						|
	FORCEINLINE bool operator < (const Node& other) const {return m_estimate < other.m_estimate;}
 | 
						|
};
 | 
						|
 | 
						|
/** Yapf Node for ships */
 | 
						|
template <class Tkey_>
 | 
						|
struct CYapfShipNodeT
 | 
						|
	: CYapfNodeT<Tkey_, CYapfShipNodeT<Tkey_> >
 | 
						|
{
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
// now define two major node types (that differ by key type)
 | 
						|
typedef CYapfShipNodeT<CYapfNodeKeyExitDir>  CYapfShipNodeExitDir;
 | 
						|
typedef CYapfShipNodeT<CYapfNodeKeyTrackDir> CYapfShipNodeTrackDir;
 | 
						|
 | 
						|
// Default NodeList types
 | 
						|
typedef CNodeList_HashTableT<CYapfShipNodeExitDir , 14, 16> CShipNodeListExitDir;
 | 
						|
typedef CNodeList_HashTableT<CYapfShipNodeTrackDir, 16, 20> CShipNodeListTrackDir;
 | 
						|
 | 
						|
 | 
						|
#endif /* YAPF_NODE_HPP */
 |