summaryrefslogtreecommitdiff
path: root/yapf/yapf_common.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'yapf/yapf_common.hpp')
-rw-r--r--yapf/yapf_common.hpp66
1 files changed, 42 insertions, 24 deletions
diff --git a/yapf/yapf_common.hpp b/yapf/yapf_common.hpp
index e4d937a57..127c73210 100644
--- a/yapf/yapf_common.hpp
+++ b/yapf/yapf_common.hpp
@@ -3,28 +3,31 @@
#ifndef YAPF_COMMON_HPP
#define YAPF_COMMON_HPP
-
+/** YAPF origin provider base class - used when origin is one tile / multiple trackdirs */
template <class Types>
class CYapfOriginTileT
{
public:
- typedef typename Types::Tpf Tpf;
+ typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
- typedef typename Node::Key Key; ///< key to hash tables
+ typedef typename Node::Key Key; ///< key to hash tables
protected:
- TileIndex m_orgTile;
- TrackdirBits m_orgTrackdirs;
+ TileIndex m_orgTile; ///< origin tile
+ TrackdirBits m_orgTrackdirs; ///< origin trackdir mask
+ /// to access inherited path finder
FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
public:
+ /// Set origin tile / trackdir mask
void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
{
m_orgTile = tile;
m_orgTrackdirs = trackdirs;
}
+ /// Called when YAPF needs to place origin nodes into open list
void PfSetStartupNodes()
{
for (TrackdirBits tdb = m_orgTrackdirs; tdb != TRACKDIR_BIT_NONE; tdb = (TrackdirBits)KillFirstBit2x64(tdb)) {
@@ -36,25 +39,28 @@ public:
}
};
+/** YAPF origin provider base class - used when there are two tile/trackdir origins */
template <class Types>
class CYapfOriginTileTwoWayT
{
public:
- typedef typename Types::Tpf Tpf;
+ typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
- typedef typename Node::Key Key; ///< key to hash tables
+ typedef typename Node::Key Key; ///< key to hash tables
protected:
- TileIndex m_orgTile;
- Trackdir m_orgTd;
- TileIndex m_revTile;
- Trackdir m_revTd;
- int m_reverse_penalty;
- bool m_treat_first_red_two_way_signal_as_eol;
-
+ 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
+
+ /// 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)
{
m_orgTile = tile;
@@ -65,6 +71,7 @@ public:
m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
}
+ /// Called when YAPF needs to place origin nodes into open list
void PfSetStartupNodes()
{
if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) {
@@ -80,25 +87,28 @@ public:
}
}
+ /// return true if first two-way signal should be treated as dead end
FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL()
{
return Yapf().PfGetSettings().rail_firstred_twoway_eol && m_treat_first_red_two_way_signal_as_eol;
}
};
+/** YAPF destination provider base class - used when destination is single tile / multiple trackdirs */
template <class Types>
class CYapfDestinationTileT
{
public:
- typedef typename Types::Tpf Tpf;
+ typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
- typedef typename Node::Key Key; ///< key to hash tables
+ typedef typename Node::Key Key; ///< key to hash tables
protected:
- TileIndex m_destTile;
- TrackdirBits m_destTrackdirs;
+ TileIndex m_destTile; ///< destination tile
+ TrackdirBits m_destTrackdirs; ///< destination trackdir mask
public:
+ /// set the destination tile / more trackdirs
void SetDestination(TileIndex tile, TrackdirBits trackdirs)
{
m_destTile = tile;
@@ -106,15 +116,19 @@ public:
}
protected:
+ /// to access inherited path finder
Tpf& Yapf() {return *static_cast<Tpf*>(this);}
public:
+ /// Called by YAPF to detect if node ends in the desired destination
FORCEINLINE bool PfDetectDestination(Node& n)
{
bool bDest = (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE);
return bDest;
}
+ /** Called by YAPF to calculate cost estimate. Calculates distance to the destination
+ * adds it to the actual cost from origin and stores the sum to the Node::m_estimate */
inline bool PfCalcEstimate(Node& n)
{
int dx = abs(TileX(n.GetTile()) - TileX(m_destTile));
@@ -128,14 +142,18 @@ public:
}
};
+/** YAPF template that uses Ttypes template argument to determine all YAPF
+* components (base classes) from which the actual YAPF is composed.
+* For example classes consult: CYapfRail_TypesT template and its instantiations:
+* CYapfRail1, CYapfRail2, CYapfRail3, CYapfAnyDepotRail1, CYapfAnyDepotRail2, CYapfAnyDepotRail3 */
template <class Ttypes>
class CYapfT
- : public Ttypes::PfBase
- , public Ttypes::PfCost
- , public Ttypes::PfCache
- , public Ttypes::PfOrigin
- , public Ttypes::PfDestination
- , public Ttypes::PfFollow
+ : public Ttypes::PfBase ///< Instance of CYapfBaseT - main YAPF loop and support base class
+ , public Ttypes::PfCost ///< Cost calculation provider base class
+ , public Ttypes::PfCache ///< Segment cost cache provider
+ , public Ttypes::PfOrigin ///< Origin (tile or two-tile origin)
+ , public Ttypes::PfDestination ///< Destination detector and distance (estimate) calculation provider
+ , public Ttypes::PfFollow ///< Node follower (stepping provider)
{
};