| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #include "catch_enum_values_registry.h" |
| | #include "catch_string_manip.h" |
| | #include "catch_stream.h" |
| |
|
| | #include <map> |
| | #include <cassert> |
| |
|
| | namespace Catch { |
| |
|
| | IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {} |
| |
|
| | 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() {} |
| |
|
| | StringRef EnumInfo::lookup( int value ) const { |
| | for( auto const& valueToName : m_values ) { |
| | if( valueToName.first == value ) |
| | return valueToName.second; |
| | } |
| | return "{** unexpected enum value **}"_sr; |
| | } |
| |
|
| | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { |
| | std::unique_ptr<EnumInfo> enumInfo( new 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(); |
| | } |
| |
|
| | } |
| | } |
| |
|
| |
|