15#include "../direction_type.h"
16#include "../signal_type.h"
17#include "../tile_type.h"
18#include "../track_type.h"
24template <
typename T,
size_t N>
struct ArrayT<T[N]> {
25 static const size_t length = N;
34template <
typename E,
typename T>
48template <
typename E,
typename T>
66template <
typename E,
typename T>
67inline std::string
ComposeNameT(E value, T &t,
const char *t_unk, E val_inv,
const char *name_inv)
70 if (value == val_inv) {
72 }
else if (value == 0) {
75 for (
size_t i = 0; i < ArrayT<T>::length; i++) {
76 if ((value & (1 << i)) == 0)
continue;
77 out += (!out.empty() ?
"+" :
"");
79 value &= ~(E)(1 << i);
82 out += (!out.empty() ?
"+" :
"");
95inline std::string
ComposeNameT(E value, std::span<const std::string_view> names, std::string_view unknown_name)
98 if (value.base() == 0) {
101 for (
size_t i = 0; i < std::size(names); ++i) {
102 if (!value.Test(
static_cast<E::EnumType
>(i)))
continue;
103 out += (!out.empty() ?
"+" :
"");
105 value.Reset(
static_cast<E::EnumType
>(i));
107 if (value.base() != 0) {
108 out += (!out.empty() ?
"+" :
"");
135 if ((
size_t)m_ptr < (
size_t)other.m_ptr)
return true;
136 if ((
size_t)m_ptr > (
size_t)other.m_ptr)
return false;
137 if (m_type_id < other.m_type_id)
return true;
142 typedef std::map<KnownStructKey, std::string> KNOWN_NAMES;
155 bool FindKnownName(
size_t type_id,
const void *ptr, std::string &name);
159 void WriteValue(
const std::string &name,
int value);
160 void WriteValue(
const std::string &name,
const std::string &value_str);
164 template <
typename E>
void WriteEnumT(
const std::string &name, E e)
169 void BeginStruct(
size_t type_id,
const std::string &name,
const void *ptr);
173 template <
typename S>
void WriteStructT(
const std::string &name,
const S *s)
182 std::string known_as;
185 std::string known_as_str = std::string(
"known_as.") + known_as;
196 template <
typename S>
void WriteStructT(
const std::string &name,
const std::deque<S> *s)
205 std::string known_as;
208 std::string known_as_str = std::string(
"known_as.") + known_as;
213 size_t num_items = s->size();
214 this->
WriteValue(
"num_items", std::to_string(num_items));
215 for (
size_t i = 0; i < num_items; i++) {
216 const auto &item = (*s)[i];
std::string ValueStr(Trackdir td)
Return name of given Trackdir.
ArrayT< T >::Item ItemAtT(E idx, const T &t, typename ArrayT< T >::Item t_unk)
Helper template function that returns item of array at given index or t_unk when index is out of boun...
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...
DiagDirection
Enumeration for diagonal directions.
SignalType
Type of signal, i.e.
Helper template class that provides C array length and item type.
Used as a key into map of known object instances.
Class that represents the dump-into-string target.
int m_indent
current indent/nesting level
void WriteEnumT(const std::string &name, E e)
Dump given enum value (as a number and as named value)
std::string m_out
the output string
void WriteValue(const std::string &name, int value)
Write 'name = value' with indent and new-line.
std::stack< std::string > m_cur_struct
here we will track the current structure name
void BeginStruct(size_t type_id, const std::string &name, const void *ptr)
Open new structure (one level deeper than the current one) 'name = {<LF>'.
std::string GetCurrentStructName()
Return structured name of the current class/structure.
KNOWN_NAMES m_known_names
map of known object instances and their structured names
bool FindKnownName(size_t type_id, const void *ptr, std::string &name)
Find the given instance in our anti-recursion repository.
void WriteTile(const std::string &name, TileIndex t)
Write name & TileIndex to the output.
void WriteIndent()
Write some leading spaces into the output.
static size_t & LastTypeId()
Keep track of the last assigned type_id.
void EndStruct()
Close structure '}<LF>'.
void WriteStructT(const std::string &name, const S *s)
Dump nested object (or only its name if this instance is already known).
void WriteStructT(const std::string &name, const std::deque< S > *s)
Dump nested object (or only its name if this instance is already known).
Trackdir
Enumeration for tracks and directions.
TrackdirBits
Allow incrementing of Trackdir variables.