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);