OpenTTD Source  20241120-master-g6d3adc6169
yapf_common.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * 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.
4  * 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.
5  * 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/>.
6  */
7 
10 #ifndef YAPF_COMMON_HPP
11 #define YAPF_COMMON_HPP
12 
13 #include "../../core/bitmath_func.hpp"
14 #include "../../tile_type.h"
15 #include "../../track_type.h"
16 
18 template <class Types>
20 {
21 public:
22  typedef typename Types::Tpf Tpf;
23  typedef typename Types::NodeList::Item Node;
24  typedef typename Node::Key Key;
25 
26 protected:
29 
31  inline Tpf &Yapf()
32  {
33  return *static_cast<Tpf *>(this);
34  }
35 
36 public:
38  void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
39  {
40  this->origin_tile = tile;
41  this->origin_trackdirs = trackdirs;
42  }
43 
46  {
47  bool is_choice = (KillFirstBit(this->origin_trackdirs) != TRACKDIR_BIT_NONE);
48  for (TrackdirBits tdb = this->origin_trackdirs; tdb != TRACKDIR_BIT_NONE; tdb = KillFirstBit(tdb)) {
49  Trackdir td = (Trackdir)FindFirstBit(tdb);
50  Node &n1 = Yapf().CreateNewNode();
51  n1.Set(nullptr, this->origin_tile, td, is_choice);
52  Yapf().AddStartupNode(n1);
53  }
54  }
55 };
56 
58 template <class Types>
60 {
61 public:
62  typedef typename Types::Tpf Tpf;
63  typedef typename Types::NodeList::Item Node;
64  typedef typename Node::Key Key;
65 
66 protected:
73 
75  inline Tpf &Yapf()
76  {
77  return *static_cast<Tpf *>(this);
78  }
79 
80 public:
83  {
84  this->origin_tile = tile;
85  this->origin_td = td;
86  this->reverse_tile = tiler;
87  this->reverse_td = tdr;
88  this->reverse_penalty = reverse_penalty;
89  this->treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
90  }
91 
94  {
95  if (this->origin_tile != INVALID_TILE && this->origin_td != INVALID_TRACKDIR) {
96  Node &n1 = Yapf().CreateNewNode();
97  n1.Set(nullptr, this->origin_tile, this->origin_td, false);
98  Yapf().AddStartupNode(n1);
99  }
100  if (this->reverse_tile != INVALID_TILE && this->reverse_td != INVALID_TRACKDIR) {
101  Node &n2 = Yapf().CreateNewNode();
102  n2.Set(nullptr, this->reverse_tile, this->reverse_td, false);
103  n2.cost = this->reverse_penalty;
104  Yapf().AddStartupNode(n2);
105  }
106  }
107 
110  {
111  return Yapf().PfGetSettings().rail_firstred_twoway_eol && this->treat_first_red_two_way_signal_as_eol;
112  }
113 };
114 
121 template <class Ttypes>
122 class CYapfT
123  : public Ttypes::PfBase
124  , public Ttypes::PfCost
125  , public Ttypes::PfCache
126  , public Ttypes::PfOrigin
127  , public Ttypes::PfDestination
128  , public Ttypes::PfFollow
129 {
130 };
131 
132 
133 
134 #endif /* YAPF_COMMON_HPP */
constexpr uint8_t FindFirstBit(T x)
Search the first set bit in a value.
constexpr T KillFirstBit(T value)
Clear the first bit in an integer.
YAPF origin provider base class - used when origin is one tile / multiple trackdirs.
Definition: yapf_common.hpp:20
Node::Key Key
key to hash tables
Definition: yapf_common.hpp:24
Tpf & Yapf()
to access inherited path finder
Definition: yapf_common.hpp:31
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
Definition: yapf_common.hpp:22
TrackdirBits origin_trackdirs
origin trackdir mask
Definition: yapf_common.hpp:28
void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
Set origin tile / trackdir mask.
Definition: yapf_common.hpp:38
void PfSetStartupNodes()
Called when YAPF needs to place origin nodes into open list.
Definition: yapf_common.hpp:45
TileIndex origin_tile
origin tile
Definition: yapf_common.hpp:27
Types::NodeList::Item Node
this will be our node type
Definition: yapf_common.hpp:23
YAPF origin provider base class - used when there are two tile/trackdir origins.
Definition: yapf_common.hpp:60
Trackdir reverse_td
second (reverse) origin trackdir
Definition: yapf_common.hpp:70
Tpf & Yapf()
to access inherited path finder
Definition: yapf_common.hpp:75
void PfSetStartupNodes()
Called when YAPF needs to place origin nodes into open list.
Definition: yapf_common.hpp:93
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:82
bool TreatFirstRedTwoWaySignalAsEOL()
return true if first two-way signal should be treated as dead end
int reverse_penalty
penalty to be added for using the reverse origin
Definition: yapf_common.hpp:71
Node::Key Key
key to hash tables
Definition: yapf_common.hpp:64
TileIndex reverse_tile
second (reverse) origin tile
Definition: yapf_common.hpp:69
Trackdir origin_td
first origin trackdir
Definition: yapf_common.hpp:68
Types::Tpf Tpf
the pathfinder class (derived from THIS class)
Definition: yapf_common.hpp:62
bool 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:72
Types::NodeList::Item Node
this will be our node type
Definition: yapf_common.hpp:63
TileIndex origin_tile
first origin tile
Definition: yapf_common.hpp:67
YAPF template that uses Ttypes template argument to determine all YAPF components (base classes) from...
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition: tile_type.h:95
Trackdir
Enumeration for tracks and directions.
Definition: track_type.h:67
@ INVALID_TRACKDIR
Flag for an invalid trackdir.
Definition: track_type.h:86
TrackdirBits
Allow incrementing of Trackdir variables.
Definition: track_type.h:98
@ TRACKDIR_BIT_NONE
No track build.
Definition: track_type.h:99