--- a/yapf/yapf_common.hpp Mon Jan 01 19:44:02 2007 +0000
+++ b/yapf/yapf_common.hpp Mon Jan 01 20:13:03 2007 +0000
@@ -50,24 +50,24 @@
typedef typename Node::Key Key; ///< key to hash tables
protected:
- TileIndex m_orgTile; ///< first origin tile
- Trackdir m_orgTd; ///< first origin trackdir
- TileIndex m_revTile; ///< second (reversed) origin tile
- Trackdir m_revTd; ///< second (reversed) origin trackdir
- int m_reverse_penalty; ///< penalty to be added for using the reversed origin
- bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently
+ TileIndex m_org_tile; ///< first origin tile
+ TrackdirBits m_org_td_bits; ///< first origin trackdirbits
+ TileIndex m_rev_tile; ///< second (reversed) origin tile
+ TrackdirBits m_rev_td_bits; ///< second (reversed) origin trackdir
+ int m_reverse_penalty; ///< penalty to be added for using the reversed origin
+ bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently
/// to access inherited path finder
FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
public:
/// set origin (tiles, trackdirs, etc.)
- void SetOrigin(TileIndex tile, Trackdir td, TileIndex tiler = INVALID_TILE, Trackdir tdr = INVALID_TRACKDIR, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true)
+ void SetOrigin(TileIndex tile, TrackdirBits td_bits, TileIndex tiler = INVALID_TILE, TrackdirBits tdr_bits = INVALID_TRACKDIR_BIT, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true)
{
- m_orgTile = tile;
- m_orgTd = td;
- m_revTile = tiler;
- m_revTd = tdr;
+ m_org_tile = tile;
+ m_org_td_bits = td_bits;
+ m_rev_tile = tiler;
+ m_rev_td_bits = tdr_bits;
m_reverse_penalty = reverse_penalty;
m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
}
@@ -75,16 +75,22 @@
/// Called when YAPF needs to place origin nodes into open list
void PfSetStartupNodes()
{
- if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) {
- Node& n1 = Yapf().CreateNewNode();
- n1.Set(NULL, m_orgTile, m_orgTd, false);
- Yapf().AddStartupNode(n1);
+ if (m_org_tile != INVALID_TILE && m_org_td_bits != INVALID_TRACKDIR_BIT) {
+ for (TrackdirBits td_bits = m_org_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) {
+ Node& n = Yapf().CreateNewNode();
+ Trackdir td = (Trackdir)FindFirstBit2x64(td_bits);
+ n.Set(NULL, m_org_tile, td, false);
+ Yapf().AddStartupNode(n);
+ }
}
- if (m_revTile != INVALID_TILE && m_revTd != INVALID_TRACKDIR) {
- Node& n2 = Yapf().CreateNewNode();
- n2.Set(NULL, m_revTile, m_revTd, false);
- n2.m_cost = m_reverse_penalty;
- Yapf().AddStartupNode(n2);
+ if (m_rev_tile != INVALID_TILE && m_rev_td_bits != INVALID_TRACKDIR_BIT) {
+ for (TrackdirBits td_bits = m_rev_td_bits; td_bits != TRACKDIR_BIT_NONE; td_bits = (TrackdirBits)KillFirstBit2x64(td_bits)) {
+ Node& n = Yapf().CreateNewNode();
+ Trackdir td = (Trackdir)FindFirstBit2x64(td_bits);
+ n.Set(NULL, m_rev_tile, td, false);
+ n.m_cost = m_reverse_penalty;
+ Yapf().AddStartupNode(n);
+ }
}
}