(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
This commit is contained in:
		
							
								
								
									
										111
									
								
								yapf/yapf_node_rail.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								yapf/yapf_node_rail.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,111 @@
 | 
			
		||||
/* $Id$ */
 | 
			
		||||
 | 
			
		||||
#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) {}
 | 
			
		||||
	FORCEINLINE CYapfRailSegmentKey(const CYapfNodeKeyExitDir& node_key) {Set(node_key);}
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE void Set(const CYapfRailSegmentKey& src) {m_value = src.m_value;}
 | 
			
		||||
	FORCEINLINE void Set(const CYapfNodeKeyExitDir& node_key) {m_value = (((int)node_key.m_tile) << 2) | node_key.m_exitdir;}
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE int32 CalcHash() const {return m_value;}
 | 
			
		||||
	FORCEINLINE TileIndex GetTile() const {return (TileIndex)(m_value >> 2);}
 | 
			
		||||
	FORCEINLINE DiagDirection GetExitDir() const {return (DiagDirection)(m_value & 3);}
 | 
			
		||||
	FORCEINLINE bool operator == (const CYapfRailSegmentKey& other) const {return m_value == other.m_value;}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** cached segment cost for rail YAPF */
 | 
			
		||||
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;
 | 
			
		||||
	CYapfRailSegment*      m_hash_next;
 | 
			
		||||
	union {
 | 
			
		||||
		byte                 m_flags;
 | 
			
		||||
		struct {
 | 
			
		||||
			bool                   m_end_of_line : 1;
 | 
			
		||||
		} flags_s;
 | 
			
		||||
	} flags_u;
 | 
			
		||||
	byte m_reserve[3];
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE 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_hash_next(NULL)
 | 
			
		||||
	{
 | 
			
		||||
		flags_u.m_flags = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE const Key& GetKey() const {return m_key;}
 | 
			
		||||
	FORCEINLINE TileIndex GetTile() const {return m_key.GetTile();}
 | 
			
		||||
	FORCEINLINE DiagDirection GetExitDir() const {return m_key.GetExitDir();}
 | 
			
		||||
	FORCEINLINE CYapfRailSegment* GetHashNext() {return m_hash_next;}
 | 
			
		||||
	FORCEINLINE void SetHashNext(CYapfRailSegment* next) {m_hash_next = next;}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Yapf Node for rail YAPF */
 | 
			
		||||
template <class Tkey_>
 | 
			
		||||
struct CYapfRailNodeT
 | 
			
		||||
	: CYapfNodeT<Tkey_, CYapfRailNodeT<Tkey_> >
 | 
			
		||||
{
 | 
			
		||||
	typedef CYapfNodeT<Tkey_, CYapfRailNodeT<Tkey_> > base;
 | 
			
		||||
	typedef CYapfRailSegment CachedData;
 | 
			
		||||
 | 
			
		||||
	CYapfRailSegment *m_segment;
 | 
			
		||||
	uint16            m_num_signals_passed;
 | 
			
		||||
	union {
 | 
			
		||||
		byte            m_inherited_flags;
 | 
			
		||||
		struct {
 | 
			
		||||
			bool          m_targed_seen : 1;
 | 
			
		||||
			bool          m_last_signal_was_red : 1;
 | 
			
		||||
		} flags_s;
 | 
			
		||||
	} flags_u;
 | 
			
		||||
	SignalType        m_last_red_signal_type;
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE void Set(CYapfRailNodeT* parent, TileIndex tile, Trackdir td)
 | 
			
		||||
	{
 | 
			
		||||
		base::Set(parent, tile, td);
 | 
			
		||||
		m_segment = NULL;
 | 
			
		||||
		if (parent == NULL) {
 | 
			
		||||
			m_num_signals_passed      = 0;
 | 
			
		||||
			flags_u.m_inherited_flags = 0;
 | 
			
		||||
			m_last_red_signal_type    = SIGTYPE_NORMAL;
 | 
			
		||||
		} 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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	FORCEINLINE TileIndex GetLastTile() const {assert(m_segment != NULL); return m_segment->m_last_tile;}
 | 
			
		||||
	FORCEINLINE Trackdir GetLastTrackdir() const {assert(m_segment != NULL); return m_segment->m_last_td;}
 | 
			
		||||
	FORCEINLINE void SetLastTileTrackdir(TileIndex tile, Trackdir td) {assert(m_segment != NULL); m_segment->m_last_tile = tile; m_segment->m_last_td = td;}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// now define two major node types (that differ by key type)
 | 
			
		||||
typedef CYapfRailNodeT<CYapfNodeKeyExitDir>  CYapfRailNodeExitDir;
 | 
			
		||||
typedef CYapfRailNodeT<CYapfNodeKeyTrackDir> CYapfRailNodeTrackDir;
 | 
			
		||||
 | 
			
		||||
// Default NodeList types
 | 
			
		||||
typedef CNodeList_HashTableT<CYapfRailNodeExitDir , 10, 12> CRailNodeListExitDir;
 | 
			
		||||
typedef CNodeList_HashTableT<CYapfRailNodeTrackDir, 12, 16> CRailNodeListTrackDir;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* YAPF_NODE_RAIL_HPP */
 | 
			
		||||
		Reference in New Issue
	
	Block a user