#include #include #include #include "constants.h" //------------------------------------------------------------------------------ uint32 Type::Field::get_type_info() const { return type_info; } //------------------------------------------------------------------------------ uint32 Type::Field::get_offset() const { return _offset; } //------------------------------------------------------------------------------ uint32 Type::Field::get_size() const { return (type_info & TYPE_INFO_CAT_ARRAY) ? 0 : 1 << (type_info & 0003); } //------------------------------------------------------------------------------ uint32 Type::get_uid() const { return _uid; } //------------------------------------------------------------------------------ uint32 Type::get_field_count() const { return _field_count; } //------------------------------------------------------------------------------ Type::Field Type::get_field(uint32 index) const { return get_field_info(index).field; } //------------------------------------------------------------------------------ bool Type::has_flag(uint32 flag) const { return !!(_flags & flag); } //------------------------------------------------------------------------------ Type::TypeName Type::get_name() const { const auto* base = (const char*)(_fields + _field_count); StringView logger_name(base, _logger_name_len); base += _logger_name_len; StringView event_name(base, _event_name_len); return { logger_name, event_name }; } //------------------------------------------------------------------------------ Type::FieldInfo Type::get_field_info(uint32 index) const { Field field = _fields[index]; // :( const auto* base = (const char*)(_fields + _field_count); base += _logger_name_len + _event_name_len; for (const Field* cursor = _fields; index-- > 0; ++cursor) base += cursor->name_size; StringView name(base, field.name_size); return { name, field }; } //------------------------------------------------------------------------------ void Type::patch() { for (uint32 i = 0; i < get_field_count(); ++i) { Field* field = const_cast(_fields + i); if (field->_internal_type == FIELD_INTERNAL_VALUE) continue; if ((field->type_info & TYPE_INFO_SPECIAL_MASK) != 0) fatal("unexpected special value in type"); if (field->_internal_type == FIELD_INTERNAL_REF) { field->type_info |= TYPE_INFO_SPECIAL_REF; continue; } field->type_info = field->name_size; field->type_info |= TYPE_INFO_SPECIAL_DEF_ID; field->name_size = 0; } }