1 #ifndef EVE_TOC_INSTANCE_H_INCLUDED 2 #define EVE_TOC_INSTANCE_H_INCLUDED 44 #include <type_traits> 56 #define TOC_LIMIT_OVERFLOWS(mmin, mmax, test) \ 57 (((uint32_t)mmin > (uint32_t)mmax) ? \ 58 ((int32_t)test > std::numeric_limits<int16_t>::max() || (int32_t)test < std::numeric_limits<int16_t>::min()) : \ 59 ((uint32_t)test > std::numeric_limits<uint16_t>::max() || (uint32_t)test < std::numeric_limits<uint16_t>::min())) 64 #define TOC_NEED_EXTERN_LIMITS(mmin, mmax) \ 65 (TOC_LIMIT_OVERFLOWS(mmin, mmax, mmin) || TOC_LIMIT_OVERFLOWS(mmin, mmax, mmax)) 73 template <
class SegmentLoc>
76 typedef typename SegmentLoc::segment_t segment_t;
77 static const uint8_t m_segment = SEGMENT_NONE;
86 template <
class SegmentLoc,
class MemberType, MemberType SegmentLoc::segment_t::*member,
bool arrayBased>
87 struct CLocationTraits
90 static constexpr
size_t raw_size =
sizeof(
typename std::remove_extent<MemberType>::type);
91 static constexpr
size_t raw_count =
sizeof(MemberType) /
sizeof(
typename std::remove_extent<MemberType>::type);
92 static constexpr
size_t aligned_size = raw_size;
95 static constexpr uint8_t m_segment = SegmentLoc::m_segment;
96 static constexpr
size_t m_offset = (uint16_t) (uint32_t) &(((
typename SegmentLoc::segment_t*)NULL)->*member);
97 static constexpr
size_t m_size = (arrayBased && raw_size == 1) ? raw_count : aligned_size;
98 static constexpr
size_t m_count = (arrayBased && raw_size == 1) ? 1 : raw_count;
105 #define DECLARE_SEGMENT(...) 107 #define TOC_BEGIN() \ 108 DEF_STATIC_COUNTER(ConstId); \ 113 #define TOC_DECLARE_MIN_MAX(mmin, mmax) \ 114 TOC_DECLARE_INT(GET_STATIC_COUNTER(ConstId) * 2 + 0, mmin, TOC_NEED_EXTERN_LIMITS(mmin, mmax)); \ 115 TOC_DECLARE_INT(GET_STATIC_COUNTER(ConstId) * 2 + 1, mmax, TOC_NEED_EXTERN_LIMITS(mmin, mmax)); \ 116 INC_STATIC_COUNTER(ConstId) 121 #define TOC_INT_PARAM(name, text, uuid, mmin, mmax, loc, ...) \ 122 TOC_DECLARE_MIN_MAX(mmin, mmax); 124 #define TOC_BOOL_PARAM(name, text, uuid, loc, ...) 126 #define TOC_STRING_PARAM(name, text, uuid, loc, ...) 128 #define TOC_BINARY_PARAM(name, text, uuid, loc, ...) 130 #define TOC_STRUCT_PARAM(name, text, uuid, pfix, end, loc, ...) 132 #define TOC_SERVICE(name) 138 typedef IntToType<GET_STATIC_COUNTER(ConstId)> CTocTableNumConstEntries; \ 139 typedef IntToType<CTocTableNumConstEntries::value * 2 - 1> CTocTableLastConstId; \ 140 typedef IntToType<CTocTableLastConstId::value + 1> CTocTableFirstNameId; \ 141 typedef typename string_table_t<CTocTableLastConstId>::type CTocTableConstPool; 143 #include EVE_TOC_GEN_H 146 #undef TOC_STRING_PARAM 147 #undef TOC_BINARY_PARAM 149 #undef TOC_BOOL_PARAM 150 #undef TOC_STRUCT_PARAM 158 #define DECLARE_SEGMENT(...) 160 #define TOC_BEGIN() \ 161 DEF_STATIC_COUNTER(VarId); 163 #ifdef TOC_USE_TEXT_UUID 164 #define TOC_LABELS_PER_ENTRY 2 165 #define TOC_STORE_TEXT_AND_CLASS(text, clazz) \ 166 TOC_DECLARE_LABEL(GET_STATIC_COUNTER(VarId) * TOC_LABELS_PER_ENTRY + 0, text); \ 167 TOC_DECLARE_LABEL(GET_STATIC_COUNTER(VarId) * TOC_LABELS_PER_ENTRY + 1, clazz); 168 #define TOC_TEXT_LABEL_OFFSET(text) \ 170 #define TOC_UUID_LABEL_OFFSET(uuid) \ 173 #define TOC_LABELS_PER_ENTRY 1 174 #define TOC_STORE_TEXT_AND_CLASS(text, clazz) \ 175 TOC_DECLARE_LABEL(GET_STATIC_COUNTER(VarId) * TOC_LABELS_PER_ENTRY + 0, text); 176 #define TOC_TEXT_LABEL_OFFSET(text) \ 178 #define TOC_UUID_LABEL_OFFSET(uuid) \ 185 #define TOC_MAKE_BASE(name, text, uuid, loc, array_based, ...)\ 186 struct CVar_ ## loc ## _ ## name; \ 187 struct CVarName_ ## name; \ 188 struct CLoc_ ## loc; \ 189 TOC_DECLARE_NAME(GET_STATIC_COUNTER(VarId) + CTocTableFirstNameId::value, name);\ 190 TOC_STORE_TEXT_AND_CLASS(text, uuid) \ 191 struct CVar_ ## loc ## _ ## name : public \ 193 CVar_ ## loc ## _ ## name, \ 196 CSegment<CLoc_ ## loc>, \ 197 decltype(CSegment<CLoc_ ## loc>::segment_t::name), \ 198 &CSegment<CLoc_ ## loc>::segment_t::name, \ 204 static const int m_id = GET_STATIC_COUNTER(VarId); \ 206 INC_STATIC_COUNTER(VarId) 211 #define TOC_INT_PARAM(name, text, uuid, mmin, mmax, loc, ...) \ 212 TOC_MAKE_BASE(name, text, uuid, loc, false, ##__VA_ARGS__); 214 #define TOC_BOOL_PARAM(name, text, uuid, loc, ...) \ 215 TOC_MAKE_BASE(name, text, uuid, loc, false, ##__VA_ARGS__); 217 #define TOC_STRING_PARAM(name, text, uuid, loc, ...) \ 218 TOC_MAKE_BASE(name, text, uuid, loc, true, ##__VA_ARGS__); 220 #define TOC_BINARY_PARAM(name, text, uuid, loc, ...) \ 221 TOC_MAKE_BASE(name, text, uuid, loc, true, ##__VA_ARGS__); 223 #define TOC_STRUCT_PARAM(name, text, uuid, pfix, end, loc, ...) \ 224 TOC_MAKE_BASE(name, text, uuid, loc, false, ##__VA_ARGS__); \ 225 struct CVar_ ## pfix ## _ ## end; \ 226 struct CLoc_ ## pfix \ 228 typedef typename std::remove_extent< \ 229 decltype(CSegment<CLoc_ ## loc>::segment_t::name) \ 233 #define TOC_SERVICE(name) \ 234 TOC_MAKE_BASE(name, "", 0, SERVICES, false, __); 240 :
public CTocTable<IntToType<T::value - 1> >
244 struct CTocTable<IntToType<0> >
251 typedef IntToType<__LINE__> CTocTableEndLine; \ 252 typedef IntToType<GET_STATIC_COUNTER(VarId)> CTocTableNumEntries; \ 253 typedef IntToType<CTocTableNumEntries::value * TOC_LABELS_PER_ENTRY - 1> CTocTableLastLabelId; \ 254 typedef IntToType<CTocTableLastConstId::value + CTocTableNumEntries::value> CTocTableLastUniqueId; \ 255 typedef IntToType<CTocTableNumEntries::value - 1> CBleIdTableLastId; \ 256 typedef CTocTable<CTocTableEndLine> CTocTableFinal; \ 257 typedef CStringPool<CTocTableLastUniqueId> CStringPoolFinal; \ 258 typedef CLabelPool<CTocTableLastLabelId> CLabelPoolFinal; \ 259 typedef CBleIdTranslateTable<CBleIdTableLastId> CBleIdTranslateTableFinal; \ 260 typedef typename string_table_t<CTocTableLastUniqueId>::type CStringPoolImpl; 262 #include EVE_TOC_GEN_H 265 #undef TOC_STRING_PARAM 266 #undef TOC_BINARY_PARAM 268 #undef TOC_BOOL_PARAM 269 #undef TOC_STRUCT_PARAM 274 uint8_t type, uint16_t flags, uint16_t name,
275 size_t offset,
size_t segment,
size_t size,
size_t count,
276 int32_t mmin, int32_t mmax,
277 uint16_t label, uint16_t uuid>
278 struct CTocTableEntry
280 #pragma GCC diagnostic push 281 #pragma GCC diagnostic ignored "-Wnarrowing" 282 constexpr CTocTableEntry()
297 #pragma GCC diagnostic pop 299 static_assert(type < (1 << 4),
"TOC: Invalid type");
300 static_assert(name < (1 << 12),
"TOC: String pool is too long");
301 static_assert(offset < (1 << 13),
"TOC: Segment is too long");
302 static_assert(segment < (1 << 3),
"TOC: Invalid segment");
303 static_assert(size < (1 << 8),
"TOC: Invalid size");
304 static_assert(count < (1 << 8),
"TOC: Invalid count");
313 #define TOC_NAME_OFFSET(name) \ 314 CStringPoolImpl::name ## _t::offset 316 #define TOC_LABEL_OFFSET(id) \ 317 (sizeof(CStringPoolFinal) + CLabelTableEntry<IntToType<GET_STATIC_COUNTER(VarId) * TOC_LABELS_PER_ENTRY + (id)> >::offset) 319 #define TOC_STRING_PARAM(name, text, uuid, loc, ...) \ 320 TOC_DECLARE_BLE_ID(CVar_ ## loc ## _ ## name); \ 322 struct CTocTable<IntToType<__LINE__> > \ 323 : public CTocTable <IntToType<__LINE__ - 1> > \ 325 const CTocTableEntry< \ 326 TOC_VAL_TYPE_STRING, \ 327 CVar_ ## loc ## _ ## name::m_flags, \ 328 TOC_NAME_OFFSET(name), \ 329 CVar_ ## loc ## _ ## name::m_offset, \ 330 CVar_ ## loc ## _ ## name::m_segment, \ 331 CVar_ ## loc ## _ ## name::m_size, \ 332 CVar_ ## loc ## _ ## name::m_count, \ 335 TOC_TEXT_LABEL_OFFSET(text), \ 336 TOC_UUID_LABEL_OFFSET(uuid) \ 340 #define TOC_BINARY_PARAM(name, text, uuid, loc, ...) \ 341 TOC_DECLARE_BLE_ID(CVar_ ## loc ## _ ## name); \ 343 struct CTocTable<IntToType<__LINE__> > \ 344 : public CTocTable <IntToType<__LINE__ - 1> > \ 346 const CTocTableEntry< \ 347 TOC_VAL_TYPE_STRING, \ 348 CVar_ ## loc ## _ ## name::m_flags \ 350 TOC_NAME_OFFSET(name), \ 351 CVar_ ## loc ## _ ## name::m_offset, \ 352 CVar_ ## loc ## _ ## name::m_segment, \ 353 CVar_ ## loc ## _ ## name::m_size, \ 354 CVar_ ## loc ## _ ## name::m_count, \ 357 TOC_TEXT_LABEL_OFFSET(text), \ 358 TOC_UUID_LABEL_OFFSET(uuid) \ 362 #define TOC_INT_PARAM(name, text, uuid, mmin, mmax, loc, ...) \ 363 TOC_DECLARE_BLE_ID(CVar_ ## loc ## _ ## name); \ 365 struct CTocTable<IntToType<__LINE__> > \ 366 : public CTocTable <IntToType<__LINE__ - 1> > \ 368 const CTocTableEntry< \ 370 CVar_ ## loc ## _ ## name::m_flags, \ 371 TOC_NAME_OFFSET(name), \ 372 CVar_ ## loc ## _ ## name::m_offset, \ 373 CVar_ ## loc ## _ ## name::m_segment, \ 374 CVar_ ## loc ## _ ## name::m_size, \ 375 CVar_ ## loc ## _ ## name::m_count, \ 378 TOC_TEXT_LABEL_OFFSET(text), \ 379 TOC_UUID_LABEL_OFFSET(uuid) \ 383 #define TOC_BOOL_PARAM(name, text, uuid, loc, ...) \ 384 TOC_DECLARE_BLE_ID(CVar_ ## loc ## _ ## name); \ 386 struct CTocTable<IntToType<__LINE__> > \ 387 : public CTocTable <IntToType<__LINE__ - 1> > \ 389 const CTocTableEntry< \ 391 CVar_ ## loc ## _ ## name::m_flags, \ 392 TOC_NAME_OFFSET(name), \ 393 CVar_ ## loc ## _ ## name::m_offset, \ 394 CVar_ ## loc ## _ ## name::m_segment, \ 395 CVar_ ## loc ## _ ## name::m_size, \ 396 CVar_ ## loc ## _ ## name::m_count, \ 399 TOC_TEXT_LABEL_OFFSET(text), \ 400 TOC_UUID_LABEL_OFFSET(uuid) \ 404 #define TOC_STRUCT_PARAM(name, text, uuid, pfix, end, loc, ...) \ 405 TOC_DECLARE_BLE_ID(CVar_ ## loc ## _ ## name); \ 407 struct CTocTable<IntToType<__LINE__> > \ 408 : public CTocTable <IntToType<__LINE__ - 1> > \ 410 const CTocTableEntry< \ 411 TOC_VAL_TYPE_STRUCT, \ 412 CVar_ ## loc ## _ ## name::m_flags, \ 413 TOC_NAME_OFFSET(name), \ 414 CVar_ ## loc ## _ ## name::m_offset, \ 415 CVar_ ## loc ## _ ## name::m_segment, \ 416 CVar_ ## loc ## _ ## name::m_size, \ 417 CVar_ ## loc ## _ ## name::m_count, \ 419 CVar_ ## end::m_id - CVar_ ## loc ## _ ## name::m_id, \ 420 TOC_TEXT_LABEL_OFFSET(text), \ 421 TOC_UUID_LABEL_OFFSET(uuid) \ 425 #define TOC_SERVICE(name) \ 426 TOC_DECLARE_BLE_ID(CVar_SERVICES_ ## name); \ 428 struct CTocTable<IntToType<__LINE__> > \ 429 : public CTocTable <IntToType<__LINE__ - 1> > \ 431 const CTocTableEntry< \ 432 TOC_VAL_TYPE_SERVICE, \ 434 TOC_NAME_OFFSET(name), \ 435 CVar_SERVICES_ ## name::m_offset, \ 436 CVar_SERVICES_ ## name::m_segment, \ 437 CVar_SERVICES_ ## name::m_size, \ 438 CVar_SERVICES_ ## name::m_count, \ 441 TOC_TEXT_LABEL_OFFSET(""), \ 442 TOC_UUID_LABEL_OFFSET(0) \ 448 #include EVE_TOC_GEN_H 451 #undef TOC_STRING_PARAM 452 #undef TOC_BINARY_PARAM 454 #undef TOC_BOOL_PARAM 455 #undef TOC_STRUCT_PARAM 459 #ifdef INSTATIATE_TOC_RECORDS 460 extern "C" void INSTATIATE_TOC_RECORDS(
struct toc_blob_t *Ptr);
461 void INSTATIATE_TOC_RECORDS(
struct toc_blob_t *Ptr)
463 static constexpr CTocTableFinal TocTable;
464 static constexpr CBleIdTranslateTableFinal BleIdTranslateTable;
465 static constexpr
struct {
466 CStringPoolFinal poolStrings;
467 CLabelPoolFinal poolLabels;
470 Ptr->
StringPool = (
const char *) &TocStringPool;
471 Ptr->
Count =
sizeof(TocTable) /
sizeof(
toc_t);
473 if (CBleIdTranslateTableFinal::empty) {
474 Ptr->BleIdTable = NULL;
477 Ptr->BleIdTable = (
const uint8_t *) &BleIdTranslateTable;
478 Ptr->BleIdCount =
sizeof(BleIdTranslateTable);
A part of TOC table compile-time generator.
Applikasjon-spesifikk parameter beskrivelse.
#define BIND_SEGMENT(type, tag)
The utility macro binds a segment structure "type" with tag "tag". See toc-instance.h for defails.
A part of TOC table compile-time generator.
#define TOC_NEED_EXTERN_LIMITS(mmin, mmax)
#define TOC_FLAG_EXTERN_LIMITS
A part of TOC table compile-time generator.
A part of TOC table compile-time generator.
A part of TOC table compile-time generator.
A part of TOC table compile-time generator.