1 /* 2 * Created by Phil on 4/4/2019. 3 * Copyright 2019 Two Blue Cubes Ltd. All rights reserved. 4 * 5 * Distributed under the Boost Software License, Version 1.0. (See accompanying 6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 #ifndef TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED 9 #define TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED 10 11 #include "catch_stringref.h" 12 13 #include <vector> 14 15 namespace Catch { 16 17 namespace Detail { 18 struct EnumInfo { 19 StringRef m_name; 20 std::vector<std::pair<int, StringRef>> m_values; 21 22 ~EnumInfo(); 23 24 StringRef lookup( int value ) const; 25 }; 26 } // namespace Detail 27 28 struct IMutableEnumValuesRegistry { 29 virtual ~IMutableEnumValuesRegistry(); 30 31 virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0; 32 33 template<typename E> registerEnumIMutableEnumValuesRegistry34 Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) { 35 static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int"); 36 std::vector<int> intValues; 37 intValues.reserve( values.size() ); 38 for( auto enumValue : values ) 39 intValues.push_back( static_cast<int>( enumValue ) ); 40 return registerEnum( enumName, allEnums, intValues ); 41 } 42 }; 43 44 } // Catch 45 46 #endif //TWOBLUECUBES_CATCH_INTERFACESENUMVALUESREGISTRY_H_INCLUDED 47