#include "InfoStringFromStructConverterBase.h" #include #include InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* structure) : m_structure(structure), m_get_scr_string([](scr_string_t) { assert(false); return ""; }) { } InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* structure, std::function scriptStringValueCallback) : m_structure(structure), m_get_scr_string(std::move(scriptStringValueCallback)) { } InfoString InfoStringFromStructConverterBase::Convert() { FillInfoString(); return std::move(m_info_string); } const char* InfoStringFromStructConverterBase::AssetName(const char* name) { if (name && name[0] == ',') return &name[1]; return name; } void InfoStringFromStructConverterBase::FillFromString(const std::string& key, const size_t offset) { const auto* str = *reinterpret_cast(reinterpret_cast(m_structure) + offset); if (str) m_info_string.SetValueForKey(key, std::string(str)); else m_info_string.SetValueForKey(key, ""); } void InfoStringFromStructConverterBase::FillFromStringBuffer(const std::string& key, const size_t offset, const size_t bufferSize) { const auto* str = reinterpret_cast(reinterpret_cast(m_structure) + offset); const auto strLen = strnlen(str, bufferSize); m_info_string.SetValueForKey(key, std::string(str, strLen)); } void InfoStringFromStructConverterBase::FillFromInt(const std::string& key, const size_t offset) { const auto* num = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, std::to_string(*num)); } void InfoStringFromStructConverterBase::FillFromUint(const std::string& key, const size_t offset) { const auto* num = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, std::to_string(*num)); } void InfoStringFromStructConverterBase::FillFromBool(const std::string& key, const size_t offset) { const auto* bBool = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, *bBool ? "1" : "0"); } void InfoStringFromStructConverterBase::FillFromQBoolean(const std::string& key, const size_t offset) { const auto* iBool = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, *iBool != 0 ? "1" : "0"); } void InfoStringFromStructConverterBase::FillFromFloat(const std::string& key, const size_t offset) { const auto* num = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, std::to_string(*num)); } void InfoStringFromStructConverterBase::FillFromMilliseconds(const std::string& key, const size_t offset) { const auto* millis = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, std::to_string(static_cast(*millis) / 1000.0f)); } void InfoStringFromStructConverterBase::FillFromScriptString(const std::string& key, const size_t offset) { const auto* scrStr = reinterpret_cast(reinterpret_cast(m_structure) + offset); m_info_string.SetValueForKey(key, m_get_scr_string(*scrStr)); } void InfoStringFromStructConverterBase::FillFromEnumInt(const std::string& key, const size_t offset, const char** enumValues, const size_t enumSize) { const auto num = *reinterpret_cast(reinterpret_cast(m_structure) + offset); assert(num >= 0 && num < static_cast(enumSize)); if (num >= 0 && num < static_cast(enumSize)) m_info_string.SetValueForKey(key, std::string(enumValues[num])); else m_info_string.SetValueForKey(key, ""); }