#include <catch2/internal/catch_enum_values_registry.hpp>
#include <catch2/internal/catch_string_manip.hpp>
#include <cassert>
namespace
Catch {
IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() =
default
;
namespace
Detail {
namespace
{
StringRef extractInstanceName(StringRef enumInstance) {
size_t
name_start = enumInstance.size();
while
(name_start > 0 && enumInstance[name_start - 1] !=
':'
) {
--name_start;
}
return
enumInstance.substr(name_start, enumInstance.size() - name_start);
}
}
std::vector<StringRef> parseEnums( StringRef enums ) {
auto
enumValues = splitStringRef( enums,
','
);
std::vector<StringRef> parsed;
parsed.reserve( enumValues.size() );
for
(
auto
const
& enumValue : enumValues ) {
parsed.push_back(trim(extractInstanceName(enumValue)));
}
return
parsed;
}
EnumInfo::~EnumInfo() =
default
;
StringRef EnumInfo::lookup(
int
value )
const
{
for
(
auto
const
& valueToName : m_values ) {
if
( valueToName.first == value )
return
valueToName.second;
}
return
"{** unexpected enum value **}"
_sr;
}
Catch::Detail::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<
int
>
const
& values ) {
auto
enumInfo = Catch::Detail::make_unique<EnumInfo>();
enumInfo->m_name = enumName;
enumInfo->m_values.reserve( values.size() );
const
auto
valueNames = Catch::Detail::parseEnums( allValueNames );
assert
( valueNames.size() == values.size() );
std::
size_t
i = 0;
for
(
auto
value : values )
enumInfo->m_values.emplace_back(value, valueNames[i++]);
return
enumInfo;
}
EnumInfo
const
& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<
int
>
const
& values ) {
m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));
return
*m_enumInfos.back();
}
}
}