yapf/yapf_common.hpp
branchcustombridgeheads
changeset 5621 6ce400c0a2f4
parent 5618 a7db50b9f817
child 5627 f5c656cf0a0e
equal deleted inserted replaced
5620:3b40a41f90d2 5621:6ce400c0a2f4
    48 	typedef typename Types::Tpf Tpf;              ///< the pathfinder class (derived from THIS class)
    48 	typedef typename Types::Tpf Tpf;              ///< the pathfinder class (derived from THIS class)
    49 	typedef typename Types::NodeList::Titem Node; ///< this will be our node type
    49 	typedef typename Types::NodeList::Titem Node; ///< this will be our node type
    50 	typedef typename Node::Key Key;               ///< key to hash tables
    50 	typedef typename Node::Key Key;               ///< key to hash tables
    51 
    51 
    52 protected:
    52 protected:
    53 	TileIndex    m_org_tile;                        ///< first origin tile
    53 	TileIndex   m_orgTile;                        ///< first origin tile
    54 	TrackdirBits m_org_td_bits;                    ///< first origin trackdirbits
    54 	Trackdir    m_orgTd;                          ///< first origin trackdir
    55 	TileIndex    m_rev_tile;                        ///< second (reversed) origin tile
    55 	TileIndex   m_revTile;                        ///< second (reversed) origin tile
    56 	TrackdirBits m_rev_td_bits;                   ///< second (reversed) origin trackdir
    56 	Trackdir    m_revTd;                          ///< second (reversed) origin trackdir
    57 	int          m_reverse_penalty;                ///< penalty to be added for using the reversed origin
    57 	int         m_reverse_penalty;                ///< penalty to be added for using the reversed origin
    58 	bool         m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently
    58 	bool        m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently
    59 
    59 
    60 	/// to access inherited path finder
    60 	/// to access inherited path finder
    61 	FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
    61 	FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
    62 
    62 
    63 public:
    63 public:
    64 	/// set origin (tiles, trackdirs, etc.)
    64 	/// set origin (tiles, trackdirs, etc.)
    65 	void SetOrigin(TileIndex tile, TrackdirBits td_bits, TileIndex tiler = INVALID_TILE, TrackdirBits tdr_bits = INVALID_TRACKDIR_BIT, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true)
    65 	void SetOrigin(TileIndex tile, Trackdir td, TileIndex tiler = INVALID_TILE, Trackdir tdr = INVALID_TRACKDIR, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true)
    66 	{
    66 	{
    67 		m_org_tile = tile;
    67 		m_orgTile = tile;
    68 		m_org_td_bits = td_bits;
    68 		m_orgTd = td;
    69 		m_rev_tile = tiler;
    69 		m_revTile = tiler;
    70 		m_rev_td_bits = tdr_bits;
    70 		m_revTd = tdr;
    71 		m_reverse_penalty = reverse_penalty;
    71 		m_reverse_penalty = reverse_penalty;
    72 		m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
    72 		m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
    73 	}
    73 	}
    74 
    74 
    75 	/// Called when YAPF needs to place origin nodes into open list
    75 	/// Called when YAPF needs to place origin nodes into open list
    76 	void PfSetStartupNodes()
    76 	void PfSetStartupNodes()
    77 	{
    77 	{
    78 		if (m_org_tile != INVALID_TILE && m_org_td_bits != INVALID_TRACKDIR_BIT) {
    78 		if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) {
    79 			for (TrackdirBits td_bits = m_org_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) {
    79 			Node& n1 = Yapf().CreateNewNode();
    80 				Node& n = Yapf().CreateNewNode();
    80 			n1.Set(NULL, m_orgTile, m_orgTd, false);
    81 				Trackdir td = (Trackdir)FindFirstBit2x64(td_bits);
    81 			Yapf().AddStartupNode(n1);
    82 				n.Set(NULL, m_org_tile, td, false);
       
    83 				Yapf().AddStartupNode(n);
       
    84 			}
       
    85 		}
    82 		}
    86 		if (m_rev_tile != INVALID_TILE && m_rev_td_bits != INVALID_TRACKDIR_BIT) {
    83 		if (m_revTile != INVALID_TILE && m_revTd != INVALID_TRACKDIR) {
    87 			for (TrackdirBits td_bits = m_rev_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) {
    84 			Node& n2 = Yapf().CreateNewNode();
    88 				Node& n = Yapf().CreateNewNode();
    85 			n2.Set(NULL, m_revTile, m_revTd, false);
    89 				Trackdir td = (Trackdir)FindFirstBit2x64(td_bits);
    86 			n2.m_cost = m_reverse_penalty;
    90 				n.Set(NULL, m_rev_tile, td, false);
    87 			Yapf().AddStartupNode(n2);
    91 				n.m_cost = m_reverse_penalty;
       
    92 				Yapf().AddStartupNode(n);
       
    93 			}
       
    94 		}
    88 		}
    95 	}
    89 	}
    96 
    90 
    97 	/// return true if first two-way signal should be treated as dead end
    91 	/// return true if first two-way signal should be treated as dead end
    98 	FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL()
    92 	FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL()