File diff r18781:e1de9a06f7cd → r18782:6453522c2154
src/pathfinder/yapf/yapf_node_rail.hpp
Show inline comments
 
@@ -8,57 +8,57 @@
 
 */
 

	
 
/** @file yapf_node_rail.hpp Node tailored for rail pathfinding. */
 

	
 
#ifndef YAPF_NODE_RAIL_HPP
 
#define YAPF_NODE_RAIL_HPP
 

	
 
/** key for cached segment cost for rail YAPF */
 
struct CYapfRailSegmentKey
 
{
 
	uint32    m_value;
 

	
 
	FORCEINLINE CYapfRailSegmentKey(const CYapfRailSegmentKey& src) : m_value(src.m_value) {}
 
	inline CYapfRailSegmentKey(const CYapfRailSegmentKey& src) : m_value(src.m_value) {}
 

	
 
	FORCEINLINE CYapfRailSegmentKey(const CYapfNodeKeyTrackDir& node_key)
 
	inline CYapfRailSegmentKey(const CYapfNodeKeyTrackDir& node_key)
 
	{
 
		Set(node_key);
 
	}
 

	
 
	FORCEINLINE void Set(const CYapfRailSegmentKey& src)
 
	inline void Set(const CYapfRailSegmentKey& src)
 
	{
 
		m_value = src.m_value;
 
	}
 

	
 
	FORCEINLINE void Set(const CYapfNodeKeyTrackDir& node_key)
 
	inline void Set(const CYapfNodeKeyTrackDir& node_key)
 
	{
 
		m_value = (((int)node_key.m_tile) << 4) | node_key.m_td;
 
	}
 

	
 
	FORCEINLINE int32 CalcHash() const
 
	inline int32 CalcHash() const
 
	{
 
		return m_value;
 
	}
 

	
 
	FORCEINLINE TileIndex GetTile() const
 
	inline TileIndex GetTile() const
 
	{
 
		return (TileIndex)(m_value >> 4);
 
	}
 

	
 
	FORCEINLINE Trackdir GetTrackdir() const
 
	inline Trackdir GetTrackdir() const
 
	{
 
		return (Trackdir)(m_value & 0x0F);
 
	}
 

	
 
	FORCEINLINE bool operator == (const CYapfRailSegmentKey& other) const
 
	inline bool operator == (const CYapfRailSegmentKey& other) const
 
	{
 
		return m_value == other.m_value;
 
	}
 

	
 
	void Dump(DumpTarget &dmp) const
 
	{
 
		dmp.WriteTile("tile", GetTile());
 
		dmp.WriteEnumT("td", GetTrackdir());
 
	}
 
};
 

	
 
/* Enum used in PfCalcCost() to see why was the segment closed. */
 
@@ -135,51 +135,51 @@ struct CYapfRailSegment
 
{
 
	typedef CYapfRailSegmentKey Key;
 

	
 
	CYapfRailSegmentKey    m_key;
 
	TileIndex              m_last_tile;
 
	Trackdir               m_last_td;
 
	int                    m_cost;
 
	TileIndex              m_last_signal_tile;
 
	Trackdir               m_last_signal_td;
 
	EndSegmentReasonBits   m_end_segment_reason;
 
	CYapfRailSegment      *m_hash_next;
 

	
 
	FORCEINLINE CYapfRailSegment(const CYapfRailSegmentKey& key)
 
	inline CYapfRailSegment(const CYapfRailSegmentKey& key)
 
		: m_key(key)
 
		, m_last_tile(INVALID_TILE)
 
		, m_last_td(INVALID_TRACKDIR)
 
		, m_cost(-1)
 
		, m_last_signal_tile(INVALID_TILE)
 
		, m_last_signal_td(INVALID_TRACKDIR)
 
		, m_end_segment_reason(ESRB_NONE)
 
		, m_hash_next(NULL)
 
	{}
 

	
 
	FORCEINLINE const Key& GetKey() const
 
	inline const Key& GetKey() const
 
	{
 
		return m_key;
 
	}
 

	
 
	FORCEINLINE TileIndex GetTile() const
 
	inline TileIndex GetTile() const
 
	{
 
		return m_key.GetTile();
 
	}
 

	
 
	FORCEINLINE CYapfRailSegment *GetHashNext()
 
	inline CYapfRailSegment *GetHashNext()
 
	{
 
		return m_hash_next;
 
	}
 

	
 
	FORCEINLINE void SetHashNext(CYapfRailSegment *next)
 
	inline void SetHashNext(CYapfRailSegment *next)
 
	{
 
		m_hash_next = next;
 
	}
 

	
 
	void Dump(DumpTarget &dmp) const
 
	{
 
		dmp.WriteStructT("m_key", &m_key);
 
		dmp.WriteTile("m_last_tile", m_last_tile);
 
		dmp.WriteEnumT("m_last_td", m_last_td);
 
		dmp.WriteLine("m_cost = %d", m_cost);
 
		dmp.WriteTile("m_last_signal_tile", m_last_signal_tile);
 
		dmp.WriteEnumT("m_last_signal_td", m_last_signal_td);
 
@@ -199,25 +199,25 @@ struct CYapfRailNodeT
 
	uint16            m_num_signals_passed;
 
	union {
 
		uint32          m_inherited_flags;
 
		struct {
 
			bool          m_targed_seen : 1;
 
			bool          m_choice_seen : 1;
 
			bool          m_last_signal_was_red : 1;
 
		} flags_s;
 
	} flags_u;
 
	SignalType        m_last_red_signal_type;
 
	SignalType        m_last_signal_type;
 

	
 
	FORCEINLINE void Set(CYapfRailNodeT *parent, TileIndex tile, Trackdir td, bool is_choice)
 
	inline void Set(CYapfRailNodeT *parent, TileIndex tile, Trackdir td, bool is_choice)
 
	{
 
		base::Set(parent, tile, td, is_choice);
 
		m_segment = NULL;
 
		if (parent == NULL) {
 
			m_num_signals_passed      = 0;
 
			flags_u.m_inherited_flags = 0;
 
			m_last_red_signal_type    = SIGTYPE_NORMAL;
 
			/* We use PBS as initial signal type because if we are in
 
			 * a PBS section and need to route, i.e. we're at a safe
 
			 * waiting point of a station, we need to account for the
 
			 * reservation costs. If we are in a normal block then we
 
			 * should be alone in there and as such the reservation
 
@@ -227,37 +227,37 @@ struct CYapfRailNodeT
 
			 * costs is not a bad thing, actually it would probably
 
			 * be a good thing to do. */
 
			m_last_signal_type        = SIGTYPE_PBS;
 
		} else {
 
			m_num_signals_passed      = parent->m_num_signals_passed;
 
			flags_u.m_inherited_flags = parent->flags_u.m_inherited_flags;
 
			m_last_red_signal_type    = parent->m_last_red_signal_type;
 
			m_last_signal_type        = parent->m_last_signal_type;
 
		}
 
		flags_u.flags_s.m_choice_seen |= is_choice;
 
	}
 

	
 
	FORCEINLINE TileIndex GetLastTile() const
 
	inline TileIndex GetLastTile() const
 
	{
 
		assert(m_segment != NULL);
 
		return m_segment->m_last_tile;
 
	}
 

	
 
	FORCEINLINE Trackdir GetLastTrackdir() const
 
	inline Trackdir GetLastTrackdir() const
 
	{
 
		assert(m_segment != NULL);
 
		return m_segment->m_last_td;
 
	}
 

	
 
	FORCEINLINE void SetLastTileTrackdir(TileIndex tile, Trackdir td)
 
	inline void SetLastTileTrackdir(TileIndex tile, Trackdir td)
 
	{
 
		assert(m_segment != NULL);
 
		m_segment->m_last_tile = tile;
 
		m_segment->m_last_td = td;
 
	}
 

	
 
	template <class Tbase, class Tfunc, class Tpf>
 
	bool IterateTiles(const Train *v, Tpf &yapf, Tbase &obj, bool (Tfunc::*func)(TileIndex, Trackdir)) const
 
	{
 
		typename Tbase::TrackFollower ft(v, yapf.GetCompatibleRailTypes());
 
		TileIndex cur = base::GetTile();
 
		Trackdir  cur_td = base::GetTrackdir();