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