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)
|
|
|
|
*/
|
|
|
|
#ifndef TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED
|
|
|
|
#define TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED
|
|
|
|
|
|
|
|
#include "catch_stringref.h"
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
namespace Detail {
|
|
|
|
struct EnumInfo {
|
|
|
|
StringRef m_name;
|
2019-09-08 14:07:18 +02:00
|
|
|
std::vector<std::pair<int, StringRef>> m_values;
|
2019-04-04 16:55:46 +02:00
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
~EnumInfo();
|
|
|
|
|
|
|
|
StringRef lookup( int value ) const;
|
|
|
|
};
|
|
|
|
} // namespace Detail
|
2019-04-04 16:55:46 +02:00
|
|
|
|
|
|
|
struct IMutableEnumValuesRegistry {
|
|
|
|
virtual ~IMutableEnumValuesRegistry();
|
|
|
|
|
2019-04-21 18:56:19 +02:00
|
|
|
virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0;
|
2019-04-04 16:55:46 +02:00
|
|
|
|
|
|
|
template<typename E>
|
2019-04-21 18:56:19 +02:00
|
|
|
Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) {
|
2019-09-06 18:36:59 +02:00
|
|
|
static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int");
|
2019-04-04 16:55:46 +02:00
|
|
|
std::vector<int> intValues;
|
|
|
|
intValues.reserve( values.size() );
|
|
|
|
for( auto enumValue : values )
|
|
|
|
intValues.push_back( static_cast<int>( enumValue ) );
|
|
|
|
return registerEnum( enumName, allEnums, intValues );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // Catch
|
|
|
|
|
|
|
|
#endif //TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED
|