2019-04-04 16:55:46 +02:00
|
|
|
/*
|
|
|
|
* Created by Phil on 4/4/2019.
|
|
|
|
* Copyright 2019 Two Blue Cubes Ltd. All rights reserved.
|
|
|
|
*
|
|
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
*/
|
|
|
|
#include "catch_enum_values_registry.h"
|
|
|
|
#include "catch_string_manip.h"
|
|
|
|
#include "catch_stream.h"
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}
|
|
|
|
|
|
|
|
namespace Detail {
|
|
|
|
|
|
|
|
std::vector<std::string> parseEnums( StringRef enums ) {
|
2019-04-21 19:03:44 +02:00
|
|
|
auto enumValues = splitStringRef( enums, ',' );
|
2019-04-04 16:55:46 +02:00
|
|
|
std::vector<std::string> parsed;
|
|
|
|
parsed.reserve( enumValues.size() );
|
|
|
|
for( auto const& enumValue : enumValues ) {
|
2019-04-21 19:03:44 +02:00
|
|
|
auto identifiers = splitStringRef( enumValue, ':' );
|
2019-04-04 16:55:46 +02:00
|
|
|
parsed.push_back( Catch::trim( identifiers.back() ) );
|
|
|
|
}
|
|
|
|
return parsed;
|
|
|
|
}
|
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
EnumInfo::~EnumInfo() {}
|
2019-04-04 16:55:46 +02:00
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
StringRef EnumInfo::lookup( int value ) const {
|
|
|
|
for( auto const& valueToName : m_values ) {
|
|
|
|
if( valueToName.first == value )
|
|
|
|
return valueToName.second;
|
2019-04-04 16:55:46 +02:00
|
|
|
}
|
2019-04-21 18:56:19 +02:00
|
|
|
return "{** unexpected enum value **}";
|
|
|
|
}
|
2019-04-04 16:55:46 +02:00
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
|
2019-04-04 16:55:46 +02:00
|
|
|
std::unique_ptr<EnumInfo> enumInfo( new EnumInfo );
|
|
|
|
enumInfo->m_name = enumName;
|
|
|
|
|
|
|
|
const auto valueNames = Catch::Detail::parseEnums( allValueNames );
|
|
|
|
assert( valueNames.size() == values.size() );
|
|
|
|
std::size_t i = 0;
|
|
|
|
for( auto value : values )
|
2019-04-21 18:56:19 +02:00
|
|
|
enumInfo->m_values.push_back({ value, valueNames[i++] });
|
2019-04-04 16:55:46 +02:00
|
|
|
|
|
|
|
EnumInfo* raw = enumInfo.get();
|
|
|
|
m_enumInfos.push_back( std::move( enumInfo ) );
|
|
|
|
return *raw;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // Detail
|
|
|
|
} // Catch
|
|
|
|
|