summaryrefslogtreecommitdiff
path: root/src/yapf/yapf_node_rail.hpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
committerrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
commit66bbf336c6af7353ef0aeed58002c46543b30635 (patch)
treead4a63860df2626b22f77e7dac712e958bea54cb /src/yapf/yapf_node_rail.hpp
parentccc0a3f4dbf58c005b22341ac8874252924690cd (diff)
downloadopenttd-66bbf336c6af7353ef0aeed58002c46543b30635.tar.xz
(svn r7759) -Merge: makefile rewrite. This merge features:
- A proper ./configure, so everything needs to be configured only once, not for every make. - Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies. - A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC. - Proper support for OSX universal binaries. - Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files. - Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files. Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy.
Diffstat (limited to 'src/yapf/yapf_node_rail.hpp')
-rw-r--r--src/yapf/yapf_node_rail.hpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/yapf/yapf_node_rail.hpp b/src/yapf/yapf_node_rail.hpp
new file mode 100644
index 000000000..df0186989
--- /dev/null
+++ b/src/yapf/yapf_node_rail.hpp
@@ -0,0 +1,113 @@
+/* $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 {
+ 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;
+
+ FORCEINLINE 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;
+ } 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;
+ }
+ flags_u.flags_s.m_choice_seen |= is_choice;
+ }
+
+ 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 */