OpenTTD Source: src/pathfinder/yapf/yapf_type.hpp Source File

OpenTTD Source 14.0-RC3

yapf_type.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_TYPE_HPP
11 #define YAPF_TYPE_HPP
12
13 #include <iomanip>
14 #include <sstream>
15
16 /* Enum used in PfCalcCost() to see why was the segment closed. */
17 enum EndSegmentReason {
18 /* The following reasons can be saved into cached segment */
19 ESR_DEAD_END = 0,
20 ESR_RAIL_TYPE,
21 ESR_INFINITE_LOOP,
22 ESR_SEGMENT_TOO_LONG,
23 ESR_CHOICE_FOLLOWS,
24 ESR_DEPOT,
25 ESR_WAYPOINT,
26 ESR_STATION,
27 ESR_SAFE_TILE,
28
29 /* The following reasons are used only internally by PfCalcCost().
30 * They should not be found in the cached segment. */
31 ESR_PATH_TOO_LONG,
32 ESR_FIRST_TWO_WAY_RED,
33 ESR_LOOK_AHEAD_END,
34 ESR_TARGET_REACHED,
35
36 /* Special values */
37 ESR_NONE = 0xFF,
38 };
39
40 enum EndSegmentReasonBits {
41 ESRB_NONE = 0,
42
43 ESRB_DEAD_END = 1 << ESR_DEAD_END,
44 ESRB_RAIL_TYPE = 1 << ESR_RAIL_TYPE,
45 ESRB_INFINITE_LOOP = 1 << ESR_INFINITE_LOOP,
46 ESRB_SEGMENT_TOO_LONG = 1 << ESR_SEGMENT_TOO_LONG,
47 ESRB_CHOICE_FOLLOWS = 1 << ESR_CHOICE_FOLLOWS,
48 ESRB_DEPOT = 1 << ESR_DEPOT,
49 ESRB_WAYPOINT = 1 << ESR_WAYPOINT,
50 ESRB_STATION = 1 << ESR_STATION,
51 ESRB_SAFE_TILE = 1 << ESR_SAFE_TILE,
52
53 ESRB_PATH_TOO_LONG = 1 << ESR_PATH_TOO_LONG,
54 ESRB_FIRST_TWO_WAY_RED = 1 << ESR_FIRST_TWO_WAY_RED,
55 ESRB_LOOK_AHEAD_END = 1 << ESR_LOOK_AHEAD_END,
56 ESRB_TARGET_REACHED = 1 << ESR_TARGET_REACHED,
57
58 /* Additional (composite) values. */
59
60 /* What reasons mean that the target can be found and needs to be detected. */
61 ESRB_POSSIBLE_TARGET = ESRB_DEPOT | ESRB_WAYPOINT | ESRB_STATION | ESRB_SAFE_TILE,
62
63 /* What reasons can be stored back into cached segment. */
64 ESRB_CACHED_MASK = ESRB_DEAD_END | ESRB_RAIL_TYPE | ESRB_INFINITE_LOOP | ESRB_SEGMENT_TOO_LONG | ESRB_CHOICE_FOLLOWS | ESRB_DEPOT | ESRB_WAYPOINT | ESRB_STATION | ESRB_SAFE_TILE,
65
66 /* Reasons to abort pathfinding in this direction. */
67 ESRB_ABORT_PF_MASK = ESRB_DEAD_END | ESRB_PATH_TOO_LONG | ESRB_INFINITE_LOOP | ESRB_FIRST_TWO_WAY_RED,
68 };
69
70 DECLARE_ENUM_AS_BIT_SET(EndSegmentReasonBits)
71
72 inline std::string ValueStr(EndSegmentReasonBits bits)
73 {
74 static const char * const end_segment_reason_names[] = {
75 "DEAD_END", "RAIL_TYPE", "INFINITE_LOOP", "SEGMENT_TOO_LONG", "CHOICE_FOLLOWS",
76 "DEPOT", "WAYPOINT", "STATION", "SAFE_TILE",
77 "PATH_TOO_LONG", "FIRST_TWO_WAY_RED", "LOOK_AHEAD_END", "TARGET_REACHED"
78 };
79
80 std::stringstream ss;
81 ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << bits; // 0x%04X
82 ss << " (" << ComposeNameT(bits, end_segment_reason_names, "UNK", ESRB_NONE, "NONE") << ")";
83 return ss.str();
84 }
85
86 #endif /* YAPF_TYPE_HPP */
ESR_WAYPOINT
@ ESR_WAYPOINT
waypoint encountered (could be a target next time)
Definition: yapf_type.hpp:25
ComposeNameT
std::string ComposeNameT(E value, T &t, const char *t_unk, E val_inv, const char *name_inv)
Helper template function that returns compound bitfield name that is concatenation of names of each s...
Definition: dbg_helpers.h:67
ESR_STATION
@ ESR_STATION
station encountered (could be a target next time)
Definition: yapf_type.hpp:26
ESR_TARGET_REACHED
@ ESR_TARGET_REACHED
we have just reached the destination
Definition: yapf_type.hpp:34
ESR_LOOK_AHEAD_END
@ ESR_LOOK_AHEAD_END
we have just passed the last look-ahead signal
Definition: yapf_type.hpp:33
ESR_SEGMENT_TOO_LONG
@ ESR_SEGMENT_TOO_LONG
the segment is too long (possible infinite loop)
Definition: yapf_type.hpp:22
ESR_DEPOT
@ ESR_DEPOT
stop in the depot (could be a target next time)
Definition: yapf_type.hpp:24
ESR_RAIL_TYPE
@ ESR_RAIL_TYPE
the next tile has a different rail type than our tiles
Definition: yapf_type.hpp:20
EndSegmentReason
EndSegmentReason
Definition: yapf_type.hpp:17
ValueStr
std::string ValueStr(Trackdir td)
Return name of given Trackdir.
Definition: dbg_helpers.cpp:26
ESR_FIRST_TWO_WAY_RED
@ ESR_FIRST_TWO_WAY_RED
first signal was 2-way and it was red
Definition: yapf_type.hpp:32
ESR_DEAD_END
@ ESR_DEAD_END
track ends here
Definition: yapf_type.hpp:19
DECLARE_ENUM_AS_BIT_SET
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
Definition: company_manager_face.h:29
ESR_PATH_TOO_LONG
@ ESR_PATH_TOO_LONG
the path is too long (searching for the nearest depot in the given radius)
Definition: yapf_type.hpp:31
ESR_NONE
@ ESR_NONE
no reason to end the segment here
Definition: yapf_type.hpp:37
ESR_INFINITE_LOOP
@ ESR_INFINITE_LOOP
infinite loop detected
Definition: yapf_type.hpp:21
ESR_SAFE_TILE
@ ESR_SAFE_TILE
safe waiting position found (could be a target)
Definition: yapf_type.hpp:27
ESR_CHOICE_FOLLOWS
@ ESR_CHOICE_FOLLOWS
the next tile contains a choice (the track splits to more than one segments)
Definition: yapf_type.hpp:23