OpenTTD
yapf_common.hpp
Go to the documentation of this file.
1 /* $Id: yapf_common.hpp 27362 2015-08-08 10:06:24Z alberth $ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
6  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8  */
9 
12 #ifndef YAPF_COMMON_HPP
13 #define YAPF_COMMON_HPP
14 
16 template <class Types>
18 {
19 public:
20  typedef typename Types::Tpf Tpf;
21  typedef typename Types::NodeList::Titem Node;
22  typedef typename Node::Key Key;
23 
24 protected:
27 
29  inline Tpf& Yapf()
30  {
31  return *static_cast<Tpf *>(this);
32  }
33 
34 public:
36  void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
37  {
38  m_orgTile = tile;
39  m_orgTrackdirs = trackdirs;
40  }
41 
44  {
45  bool is_choice = (KillFirstBit(m_orgTrackdirs) != TRACKDIR_BIT_NONE);
46  for (TrackdirBits tdb = m_orgTrackdirs; tdb != TRACKDIR_BIT_NONE; tdb = KillFirstBit(tdb)) {
48  Node &n1 = Yapf().CreateNewNode();
49  n1.Set(NULL, m_orgTile, td, is_choice);
50  Yapf().AddStartupNode(n1);
51  }
52  }
53 };
54 
56 template <class Types>
58 {
59 public:
60  typedef typename Types::Tpf Tpf;
61  typedef typename Types::NodeList::Titem Node;
62  typedef typename Node::Key Key;
63 
64 protected:
71 
73  inline Tpf& Yapf()
74  {
75  return *static_cast<Tpf *>(this);
76  }
77 
78 public:
80  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)
81  {
82  m_orgTile = tile;
83  m_orgTd = td;
84  m_revTile = tiler;
85  m_revTd = tdr;
86  m_reverse_penalty = reverse_penalty;
87  m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
88  }
89 
92  {
93  if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) {
94  Node &n1 = Yapf().CreateNewNode();
95  n1.Set(NULL, m_orgTile, m_orgTd, false);
96  Yapf().AddStartupNode(n1);
97  }
98  if (m_revTile != INVALID_TILE && m_revTd != INVALID_TRACKDIR) {
99  Node &n2 = Yapf().CreateNewNode();
100  n2.Set(NULL, m_revTile, m_revTd, false);
101  n2.m_cost = m_reverse_penalty;
102  Yapf().AddStartupNode(n2);
103  }
104  }
105 
108  {
109  return Yapf().PfGetSettings().rail_firstred_twoway_eol && m_treat_first_red_two_way_signal_as_eol;
110  }
111 };
112 
114 template <class Types>
116 {
117 public:
118  typedef typename Types::Tpf Tpf;
119  typedef typename Types::NodeList::Titem Node;
120  typedef typename Node::Key Key;
121 
122 protected:
125 
126 public:
128  void SetDestination(TileIndex tile, TrackdirBits trackdirs)
129  {
130  m_destTile = tile;
131  m_destTrackdirs = trackdirs;
132  }
133 
134 protected:
136  Tpf& Yapf()
137  {
138  return *static_cast<Tpf *>(this);
139  }
140 
141 public:
143  inline bool PfDetectDestination(Node &n)
144  {
145  bool bDest = (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE);
146  return bDest;
147  }
148 
153  inline bool PfCalcEstimate(Node &n)
154  {
155  static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
156  static const int dg_dir_to_y_offs[] = {0, 1, 0, -1};
157  if (PfDetectDestination(n)) {
158  n.m_estimate = n.m_cost;
159  return true;
160  }
161 
162  TileIndex tile = n.GetTile();
163  DiagDirection exitdir = TrackdirToExitdir(n.GetTrackdir());
164  int x1 = 2 * TileX(tile) + dg_dir_to_x_offs[(int)exitdir];
165  int y1 = 2 * TileY(tile) + dg_dir_to_y_offs[(int)exitdir];
166  int x2 = 2 * TileX(m_destTile);
167  int y2 = 2 * TileY(m_destTile);
168  int dx = abs(x1 - x2);
169  int dy = abs(y1 - y2);
170  int dmin = min(dx, dy);
171  int dxy = abs(dx - dy);
172  int d = dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
173  n.m_estimate = n.m_cost + d;
174  assert(n.m_estimate >= n.m_parent->m_estimate);
175  return true;
176  }
177 };
178 
185 template <class Ttypes>
186 class CYapfT
187  : public Ttypes::PfBase
188  , public Ttypes::PfCost
189  , public Ttypes::PfCache
190  , public Ttypes::PfOrigin
191  , public Ttypes::PfDestination
192  , public Ttypes::PfFollow
193 {
194 };
195 
196 
197 
198 #endif /* YAPF_COMMON_HPP */
void PfSetStartupNodes()
Called when YAPF needs to place origin nodes into open list.
Definition: yapf_common.hpp:91
YAPF origin provider base class - used when origin is one tile / multiple trackdirs.
Definition: yapf_common.hpp:17
Node::Key Key
key to hash tables
Definition: yapf_common.hpp:22
Tpf & Yapf()
to access inherited path finder
Definition: yapf_common.hpp:73
int m_reverse_penalty
penalty to be added for using the reversed origin
Definition: yapf_common.hpp:69
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition: map_func.h:207
void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
Set origin tile / trackdir mask.
Definition: yapf_common.hpp:36
bool PfDetectDestination(Node &n)
Called by YAPF to detect if node ends in the desired destination.
YAPF destination provider base class - used when destination is single tile / multiple trackdirs...
Node::Key Key
key to hash tables
Definition: yapf_common.hpp:62
static DiagDirection TrackdirToExitdir(Trackdir trackdir)
Maps a trackdir to the (4-way) direction the tile is exited when following that trackdir.
Definition: track_func.h:427
TrackdirBits m_destTrackdirs
destination trackdir mask
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)
set origin (tiles, trackdirs, etc.)
Definition: yapf_common.hpp:80
Types::NodeList::Titem Node
this will be our node type
Definition: yapf_common.hpp:61
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
static TrackdirBits TrackdirToTrackdirBits(Trackdir trackdir)
Maps a Trackdir to the corresponding TrackdirBits value.
Definition: track_func.h:121
static const int YAPF_TILE_LENGTH
Length (penalty) of one tile with YAPF.
Trackdir
Enumeration for tracks and directions.
Definition: track_type.h:74
YAPF template that uses Ttypes template argument to determine all YAPF components (base classes) from...
TileIndex m_orgTile
origin tile
Definition: yapf_common.hpp:25
TileIndex m_revTile
second (reversed) origin tile
Definition: yapf_common.hpp:67
Types::NodeList::Titem Node
this will be our node type
Definition: yapf_common.hpp:21
DiagDirection
Enumeration for diagonal directions.
static T min(const T a, const T b)
Returns the minimum of two values.
Definition: math_func.hpp:42
Types::NodeList::Titem Node
this will be our node type
Trackdir m_revTd
second (reversed) origin trackdir
Definition: yapf_common.hpp:68
bool PfCalcEstimate(Node &n)
Called by YAPF to calculate cost estimate.
static T KillFirstBit(T value)
Clear the first bit in an integer.
Node::Key Key
key to hash tables
Tpf & Yapf()
to access inherited path finder
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:80
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition: map_func.h:217
static T abs(const T a)
Returns the absolute value of (scalar) variable.
Definition: math_func.hpp:83
bool TreatFirstRedTwoWaySignalAsEOL()
return true if first two-way signal should be treated as dead end
Trackdir m_orgTd
first origin trackdir
Definition: yapf_common.hpp:66
static uint8 FindFirstBit2x64(const int value)
Finds the position of the first non-zero bit in an integer.
TrackdirBits
Enumeration of bitmasks for the TrackDirs.
Definition: track_type.h:106
void PfSetStartupNodes()
Called when YAPF needs to place origin nodes into open list.
Definition: yapf_common.hpp:43
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
Definition: yapf_common.hpp:20
TileIndex m_orgTile
first origin tile
Definition: yapf_common.hpp:65
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition: tile_type.h:85
No track build.
Definition: track_type.h:107
bool m_treat_first_red_two_way_signal_as_eol
in some cases (leaving station) we need to handle first two-way signal differently ...
Definition: yapf_common.hpp:70
YAPF origin provider base class - used when there are two tile/trackdir origins.
Definition: yapf_common.hpp:57
Flag for an invalid trackdir.
Definition: track_type.h:93
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
Definition: yapf_common.hpp:60
static const int YAPF_TILE_CORNER_LENGTH
Length (penalty) of a corner with YAPF.
Tpf & Yapf()
to access inherited path finder
Definition: yapf_common.hpp:29
TrackdirBits m_orgTrackdirs
origin trackdir mask
Definition: yapf_common.hpp:26
void SetDestination(TileIndex tile, TrackdirBits trackdirs)
set the destination tile / more trackdirs
TileIndex m_destTile
destination tile