yapf_node.hpp

Go to the documentation of this file.
00001 /* $Id: yapf_node.hpp 15718 2009-03-15 00:32:18Z rubidium $ */
00002 
00005 #ifndef  YAPF_NODE_HPP
00006 #define  YAPF_NODE_HPP
00007 
00009 struct CYapfNodeKeyExitDir {
00010   TileIndex      m_tile;
00011   Trackdir       m_td;
00012   DiagDirection  m_exitdir;
00013 
00014   FORCEINLINE void Set(TileIndex tile, Trackdir td)
00015   {
00016     m_tile = tile;
00017     m_td = td;
00018     m_exitdir = (m_td == INVALID_TRACKDIR) ? INVALID_DIAGDIR : TrackdirToExitdir(m_td);
00019   }
00020 
00021   FORCEINLINE int CalcHash() const {return m_exitdir | (m_tile << 2);}
00022   FORCEINLINE bool operator == (const CYapfNodeKeyExitDir& other) const {return (m_tile == other.m_tile) && (m_exitdir == other.m_exitdir);}
00023 
00024   void Dump(DumpTarget &dmp) const
00025   {
00026     dmp.WriteTile("m_tile", m_tile);
00027     dmp.WriteEnumT("m_td", m_td);
00028     dmp.WriteEnumT("m_exitdir", m_exitdir);
00029   }
00030 };
00031 
00032 struct CYapfNodeKeyTrackDir : public CYapfNodeKeyExitDir
00033 {
00034   FORCEINLINE int CalcHash() const {return m_td | (m_tile << 4);}
00035   FORCEINLINE bool operator == (const CYapfNodeKeyTrackDir& other) const {return (m_tile == other.m_tile) && (m_td == other.m_td);}
00036 };
00037 
00039 template <class Tkey_, class Tnode>
00040 struct CYapfNodeT {
00041   typedef Tkey_ Key;
00042   typedef Tnode Node;
00043 
00044   Tkey_       m_key;
00045   Node       *m_hash_next;
00046   Node       *m_parent;
00047   int         m_cost;
00048   int         m_estimate;
00049 
00050   FORCEINLINE void Set(Node *parent, TileIndex tile, Trackdir td, bool is_choice)
00051   {
00052     m_key.Set(tile, td);
00053     m_hash_next = NULL;
00054     m_parent = parent;
00055     m_cost = 0;
00056     m_estimate = 0;
00057   }
00058 
00059   FORCEINLINE Node *GetHashNext() {return m_hash_next;}
00060   FORCEINLINE void SetHashNext(Node *pNext) {m_hash_next = pNext;}
00061   FORCEINLINE TileIndex GetTile() const {return m_key.m_tile;}
00062   FORCEINLINE Trackdir GetTrackdir() const {return m_key.m_td;}
00063   FORCEINLINE const Tkey_& GetKey() const {return m_key;}
00064   FORCEINLINE int GetCost() const {return m_cost;}
00065   FORCEINLINE int GetCostEstimate() const {return m_estimate;}
00066   FORCEINLINE bool operator < (const Node& other) const {return m_estimate < other.m_estimate;}
00067 
00068   void Dump(DumpTarget &dmp) const
00069   {
00070     dmp.WriteStructT("m_key", &m_key);
00071     dmp.WriteStructT("m_parent", m_parent);
00072     dmp.WriteLine("m_cost = %d", m_cost);
00073     dmp.WriteLine("m_estimate = %d", m_estimate);
00074   }
00075 };
00076 
00078 template <class Tkey_>
00079 struct CYapfShipNodeT
00080   : CYapfNodeT<Tkey_, CYapfShipNodeT<Tkey_> >
00081 {
00082 
00083 };
00084 
00085 /* now define two major node types (that differ by key type) */
00086 typedef CYapfShipNodeT<CYapfNodeKeyExitDir>  CYapfShipNodeExitDir;
00087 typedef CYapfShipNodeT<CYapfNodeKeyTrackDir> CYapfShipNodeTrackDir;
00088 
00089 /* Default NodeList types */
00090 typedef CNodeList_HashTableT<CYapfShipNodeExitDir , 14, 16> CShipNodeListExitDir;
00091 typedef CNodeList_HashTableT<CYapfShipNodeTrackDir, 16, 20> CShipNodeListTrackDir;
00092 
00093 
00094 #endif /* YAPF_NODE_HPP */

Generated on Fri Jul 31 22:33:20 2009 for OpenTTD by  doxygen 1.5.6