diff options
author | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
commit | 66bbf336c6af7353ef0aeed58002c46543b30635 (patch) | |
tree | ad4a63860df2626b22f77e7dac712e958bea54cb /src/yapf/yapf_node_rail.hpp | |
parent | ccc0a3f4dbf58c005b22341ac8874252924690cd (diff) | |
download | openttd-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.hpp | 113 |
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 */ |