20 #include "../direction_type.h"
21 #include "../signal_type.h"
22 #include "../tile_type.h"
23 #include "../track_type.h"
26 template <
typename T>
struct ArrayT;
29 template <
typename T,
size_t N>
struct ArrayT<T[N]> {
30 static const size_t length = N;
39 template <
typename E,
typename T>
40 inline typename ArrayT<T>::item_t
ItemAtT(E idx,
const T &t,
typename ArrayT<T>::item_t t_unk)
42 if ((
size_t)idx >= ArrayT<T>::length) {
53 template <
typename E,
typename T>
54 inline typename ArrayT<T>::item_t
ItemAtT(E idx,
const T &t,
typename ArrayT<T>::item_t t_unk, E idx_inv,
typename ArrayT<T>::item_t t_inv)
56 if ((
size_t)idx < ArrayT<T>::length) {
71 template <
typename E,
typename T>
72 inline CStrA ComposeNameT(E value, T &t,
const char *t_unk, E val_inv,
const char *name_inv)
75 if (value == val_inv) {
77 }
else if (value == 0) {
80 for (
size_t i = 0; i < ArrayT<T>::length; i++) {
81 if ((value & (1 << i)) == 0)
continue;
82 out.AddFormat(
"%s%s", (out.
Size() > 0 ?
"+" :
""), (
const char*)t[i]);
83 value &= ~(E)(1 << i);
85 if (value != 0) out.AddFormat(
"%s%s", (out.
Size() > 0 ?
"+" :
""), t_unk);
87 return out.Transfer();
110 m_type_id = src.m_type_id;
116 if ((
size_t)m_ptr < (
size_t)other.m_ptr)
return true;
117 if ((
size_t)m_ptr > (
size_t)other.m_ptr)
return false;
118 if (m_type_id < other.m_type_id)
return true;
123 typedef std::map<KnownStructKey, CStrA> KNOWN_NAMES;
140 void CDECL
WriteLine(
const char *format, ...) WARN_FORMAT(2, 3);
141 void WriteValue(const
char *name, const
char *value_str);
150 void BeginStruct(
size_t type_id,
const char *name,
const void *ptr);