mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-27 03:06:49 +00:00
Use std::span and std::string to define UniversalId related TypeData
This commit is contained in:
parent
ceab7557f3
commit
7ba397da7d
1 changed files with 65 additions and 70 deletions
|
@ -3,8 +3,10 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <compare>
|
#include <compare>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <span>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <string_view>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -14,12 +16,12 @@ namespace
|
||||||
{
|
{
|
||||||
CSMWorld::UniversalId::Class mClass;
|
CSMWorld::UniversalId::Class mClass;
|
||||||
CSMWorld::UniversalId::Type mType;
|
CSMWorld::UniversalId::Type mType;
|
||||||
const char* mName;
|
std::string_view mName;
|
||||||
const char* mIcon;
|
std::string_view mIcon;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TypeData sNoArg[] = {
|
constexpr TypeData sNoArg[] = {
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, "-", 0 },
|
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, "-", ":placeholder" },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Globals, "Global Variables",
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Globals, "Global Variables",
|
||||||
":./global-variable.png" },
|
":./global-variable.png" },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Gmsts, "Game Settings", ":./gmst.png" },
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Gmsts, "Game Settings", ":./gmst.png" },
|
||||||
|
@ -81,11 +83,9 @@ namespace
|
||||||
":./start-script.png" },
|
":./start-script.png" },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_MetaDatas, "Metadata",
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_MetaDatas, "Metadata",
|
||||||
":./metadata.png" },
|
":./metadata.png" },
|
||||||
// end marker
|
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TypeData sIdArg[] = {
|
constexpr TypeData sIdArg[] = {
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Global, "Global Variable",
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Global, "Global Variable",
|
||||||
":./global-variable.png" },
|
":./global-variable.png" },
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Gmst, "Game Setting", ":./gmst.png" },
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Gmst, "Game Setting", ":./gmst.png" },
|
||||||
|
@ -165,19 +165,15 @@ namespace
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_StartScript, "Start Script",
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_StartScript, "Start Script",
|
||||||
":./start-script.png" },
|
":./start-script.png" },
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_MetaData, "Metadata", ":./metadata.png" },
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_MetaData, "Metadata", ":./metadata.png" },
|
||||||
// end marker
|
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TypeData sIndexArg[] = {
|
constexpr TypeData sIndexArg[] = {
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_VerificationResults,
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_VerificationResults,
|
||||||
"Verification Results", ":./menu-verify.png" },
|
"Verification Results", ":./menu-verify.png" },
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_LoadErrorLog, "Load Error Log",
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_LoadErrorLog, "Load Error Log",
|
||||||
":./error-log.png" },
|
":./error-log.png" },
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_Search, "Global Search",
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_Search, "Global Search",
|
||||||
":./menu-search.png" },
|
":./menu-search.png" },
|
||||||
// end marker
|
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WriteToStream
|
struct WriteToStream
|
||||||
|
@ -195,12 +191,12 @@ namespace
|
||||||
|
|
||||||
struct GetTypeData
|
struct GetTypeData
|
||||||
{
|
{
|
||||||
const TypeData* operator()(std::monostate /*value*/) const { return sNoArg; }
|
std::span<const TypeData> operator()(std::monostate /*value*/) const { return sNoArg; }
|
||||||
|
|
||||||
const TypeData* operator()(int /*value*/) const { return sIndexArg; }
|
std::span<const TypeData> operator()(int /*value*/) const { return sIndexArg; }
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
const TypeData* operator()(const T& /*value*/) const
|
std::span<const TypeData> operator()(const T& /*value*/) const
|
||||||
{
|
{
|
||||||
return sIdArg;
|
return sIdArg;
|
||||||
}
|
}
|
||||||
|
@ -216,20 +212,20 @@ CSMWorld::UniversalId::UniversalId(const std::string& universalId)
|
||||||
{
|
{
|
||||||
std::string type = universalId.substr(0, index);
|
std::string type = universalId.substr(0, index);
|
||||||
|
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (type == sIdArg[i].mName)
|
if (type == value.mName)
|
||||||
{
|
{
|
||||||
mType = sIdArg[i].mType;
|
mType = value.mType;
|
||||||
mClass = sIdArg[i].mClass;
|
mClass = value.mClass;
|
||||||
mValue = universalId.substr(index + 2);
|
mValue = universalId.substr(index + 2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; sIndexArg[i].mName; ++i)
|
for (const TypeData& value : sIndexArg)
|
||||||
if (type == sIndexArg[i].mName)
|
if (type == value.mName)
|
||||||
{
|
{
|
||||||
mType = sIndexArg[i].mType;
|
mType = value.mType;
|
||||||
mClass = sIndexArg[i].mClass;
|
mClass = value.mClass;
|
||||||
|
|
||||||
std::istringstream stream(universalId.substr(index + 2));
|
std::istringstream stream(universalId.substr(index + 2));
|
||||||
|
|
||||||
|
@ -245,11 +241,11 @@ CSMWorld::UniversalId::UniversalId(const std::string& universalId)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i = 0; sNoArg[i].mName; ++i)
|
for (const TypeData& value : sIndexArg)
|
||||||
if (universalId == sNoArg[i].mName)
|
if (universalId == value.mName)
|
||||||
{
|
{
|
||||||
mType = sNoArg[i].mType;
|
mType = value.mType;
|
||||||
mClass = sNoArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,26 +257,26 @@ CSMWorld::UniversalId::UniversalId(Type type)
|
||||||
: mType(type)
|
: mType(type)
|
||||||
, mValue(std::monostate{})
|
, mValue(std::monostate{})
|
||||||
{
|
{
|
||||||
for (int i = 0; sNoArg[i].mName; ++i)
|
for (const TypeData& value : sNoArg)
|
||||||
if (type == sNoArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mClass = sNoArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (type == sIdArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mValue = std::string();
|
mValue = std::string();
|
||||||
mClass = sIdArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; sIndexArg[i].mName; ++i)
|
for (const TypeData& value : sIndexArg)
|
||||||
if (type == sIndexArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mValue = int{};
|
mValue = int{};
|
||||||
mClass = sIndexArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,10 +287,10 @@ CSMWorld::UniversalId::UniversalId(Type type, const std::string& id)
|
||||||
: mType(type)
|
: mType(type)
|
||||||
, mValue(id)
|
, mValue(id)
|
||||||
{
|
{
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (type == sIdArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mClass = sIdArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
throw std::logic_error("invalid ID argument UniversalId type: " + std::to_string(type));
|
throw std::logic_error("invalid ID argument UniversalId type: " + std::to_string(type));
|
||||||
|
@ -304,10 +300,10 @@ CSMWorld::UniversalId::UniversalId(Type type, ESM::RefId id)
|
||||||
: mType(type)
|
: mType(type)
|
||||||
, mValue(id)
|
, mValue(id)
|
||||||
{
|
{
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (type == sIdArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mClass = sIdArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
throw std::logic_error("invalid RefId argument UniversalId type: " + std::to_string(type));
|
throw std::logic_error("invalid RefId argument UniversalId type: " + std::to_string(type));
|
||||||
|
@ -317,10 +313,10 @@ CSMWorld::UniversalId::UniversalId(Type type, int index)
|
||||||
: mType(type)
|
: mType(type)
|
||||||
, mValue(index)
|
, mValue(index)
|
||||||
{
|
{
|
||||||
for (int i = 0; sIndexArg[i].mName; ++i)
|
for (const TypeData& value : sIndexArg)
|
||||||
if (type == sIndexArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
mClass = sIndexArg[i].mClass;
|
mClass = value.mClass;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,11 +356,11 @@ int CSMWorld::UniversalId::getIndex() const
|
||||||
|
|
||||||
std::string CSMWorld::UniversalId::getTypeName() const
|
std::string CSMWorld::UniversalId::getTypeName() const
|
||||||
{
|
{
|
||||||
const TypeData* typeData = std::visit(GetTypeData{}, mValue);
|
const std::span<const TypeData> typeData = std::visit(GetTypeData{}, mValue);
|
||||||
|
|
||||||
for (int i = 0; typeData[i].mName; ++i)
|
for (const TypeData& value : typeData)
|
||||||
if (typeData[i].mType == mType)
|
if (value.mType == mType)
|
||||||
return typeData[i].mName;
|
return std::string(value.mName);
|
||||||
|
|
||||||
throw std::logic_error("failed to retrieve UniversalId type name");
|
throw std::logic_error("failed to retrieve UniversalId type name");
|
||||||
}
|
}
|
||||||
|
@ -382,11 +378,11 @@ std::string CSMWorld::UniversalId::toString() const
|
||||||
|
|
||||||
std::string CSMWorld::UniversalId::getIcon() const
|
std::string CSMWorld::UniversalId::getIcon() const
|
||||||
{
|
{
|
||||||
const TypeData* typeData = std::visit(GetTypeData{}, mValue);
|
const std::span<const TypeData> typeData = std::visit(GetTypeData{}, mValue);
|
||||||
|
|
||||||
for (int i = 0; typeData[i].mName; ++i)
|
for (const TypeData& value : typeData)
|
||||||
if (typeData[i].mType == mType)
|
if (value.mType == mType)
|
||||||
return typeData[i].mIcon ? typeData[i].mIcon : ":placeholder";
|
return std::string(value.mIcon);
|
||||||
|
|
||||||
throw std::logic_error("failed to retrieve UniversalId type icon");
|
throw std::logic_error("failed to retrieve UniversalId type icon");
|
||||||
}
|
}
|
||||||
|
@ -395,9 +391,9 @@ std::vector<CSMWorld::UniversalId::Type> CSMWorld::UniversalId::listReferenceabl
|
||||||
{
|
{
|
||||||
std::vector<CSMWorld::UniversalId::Type> list;
|
std::vector<CSMWorld::UniversalId::Type> list;
|
||||||
|
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (sIdArg[i].mClass == Class_RefRecord)
|
if (value.mClass == Class_RefRecord)
|
||||||
list.push_back(sIdArg[i].mType);
|
list.push_back(value.mType);
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
@ -406,31 +402,30 @@ std::vector<CSMWorld::UniversalId::Type> CSMWorld::UniversalId::listTypes(int cl
|
||||||
{
|
{
|
||||||
std::vector<CSMWorld::UniversalId::Type> list;
|
std::vector<CSMWorld::UniversalId::Type> list;
|
||||||
|
|
||||||
for (int i = 0; sNoArg[i].mName; ++i)
|
for (const TypeData& value : sNoArg)
|
||||||
if (sNoArg[i].mClass & classes)
|
if (value.mClass & classes)
|
||||||
list.push_back(sNoArg[i].mType);
|
list.push_back(value.mType);
|
||||||
|
|
||||||
for (int i = 0; sIdArg[i].mName; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (sIdArg[i].mClass & classes)
|
if (value.mClass & classes)
|
||||||
list.push_back(sIdArg[i].mType);
|
list.push_back(value.mType);
|
||||||
|
|
||||||
for (int i = 0; sIndexArg[i].mName; ++i)
|
for (const TypeData& value : sIndexArg)
|
||||||
if (sIndexArg[i].mClass & classes)
|
if (value.mClass & classes)
|
||||||
list.push_back(sIndexArg[i].mType);
|
list.push_back(value.mType);
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type CSMWorld::UniversalId::getParentType(Type type)
|
CSMWorld::UniversalId::Type CSMWorld::UniversalId::getParentType(Type type)
|
||||||
{
|
{
|
||||||
for (int i = 0; sIdArg[i].mType; ++i)
|
for (const TypeData& value : sIdArg)
|
||||||
if (type == sIdArg[i].mType)
|
if (type == value.mType)
|
||||||
{
|
{
|
||||||
if (sIdArg[i].mClass == Class_RefRecord)
|
if (value.mClass == Class_RefRecord)
|
||||||
return Type_Referenceables;
|
return Type_Referenceables;
|
||||||
|
|
||||||
if (sIdArg[i].mClass == Class_SubRecord || sIdArg[i].mClass == Class_Record
|
if (value.mClass == Class_SubRecord || value.mClass == Class_Record || value.mClass == Class_Resource)
|
||||||
|| sIdArg[i].mClass == Class_Resource)
|
|
||||||
{
|
{
|
||||||
if (type == Type_Cell_Missing)
|
if (type == Type_Cell_Missing)
|
||||||
return Type_Cells;
|
return Type_Cells;
|
||||||
|
|
Loading…
Reference in a new issue