summaryrefslogtreecommitdiff
path: root/yapf/yapf_node_rail.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'yapf/yapf_node_rail.hpp')
-rw-r--r--yapf/yapf_node_rail.hpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/yapf/yapf_node_rail.hpp b/yapf/yapf_node_rail.hpp
new file mode 100644
index 000000000..2d566ab4f
--- /dev/null
+++ b/yapf/yapf_node_rail.hpp
@@ -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 */