| 
									
										
										
										
											2019-04-04 15:55:46 +01: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>
 | 
					
						
							| 
									
										
										
										
											2019-04-25 14:19:00 +01:00
										 |  |  | #include <cassert>
 | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     namespace Detail { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         std::vector<std::string> parseEnums( StringRef enums ) { | 
					
						
							| 
									
										
										
										
											2019-04-21 20:03:44 +03:00
										 |  |  |             auto enumValues = splitStringRef( enums, ',' ); | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  |             std::vector<std::string> parsed; | 
					
						
							|  |  |  |             parsed.reserve( enumValues.size() ); | 
					
						
							|  |  |  |             for( auto const& enumValue : enumValues ) { | 
					
						
							| 
									
										
										
										
											2019-04-21 20:03:44 +03:00
										 |  |  |                 auto identifiers = splitStringRef( enumValue, ':' ); | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  |                 parsed.push_back( Catch::trim( identifiers.back() ) ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return parsed; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-21 19:56:19 +03:00
										 |  |  |         EnumInfo::~EnumInfo() {} | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-21 19:56:19 +03:00
										 |  |  |         StringRef EnumInfo::lookup( int value ) const { | 
					
						
							|  |  |  |             for( auto const& valueToName : m_values ) { | 
					
						
							|  |  |  |                 if( valueToName.first == value ) | 
					
						
							|  |  |  |                     return valueToName.second; | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-21 19:56:19 +03:00
										 |  |  |             return "{** unexpected enum value **}"; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 10:13:11 +01:00
										 |  |  |         std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  |             std::unique_ptr<EnumInfo> enumInfo( new EnumInfo ); | 
					
						
							|  |  |  |             enumInfo->m_name = enumName; | 
					
						
							| 
									
										
										
										
											2019-04-25 10:13:11 +01:00
										 |  |  |             enumInfo->m_values.reserve( values.size() ); | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const auto valueNames = Catch::Detail::parseEnums( allValueNames ); | 
					
						
							|  |  |  |             assert( valueNames.size() == values.size() ); | 
					
						
							|  |  |  |             std::size_t i = 0; | 
					
						
							|  |  |  |             for( auto value : values ) | 
					
						
							| 
									
										
										
										
											2019-04-21 19:56:19 +03:00
										 |  |  |                 enumInfo->m_values.push_back({ value, valueNames[i++] }); | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 10:13:11 +01:00
										 |  |  |             return enumInfo; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { | 
					
						
							|  |  |  |             auto enumInfo = makeEnumInfo( enumName, allValueNames, values ); | 
					
						
							| 
									
										
										
										
											2019-04-04 15:55:46 +01:00
										 |  |  |             EnumInfo* raw = enumInfo.get(); | 
					
						
							|  |  |  |             m_enumInfos.push_back( std::move( enumInfo ) ); | 
					
						
							|  |  |  |             return *raw; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } // Detail
 | 
					
						
							|  |  |  | } // Catch
 | 
					
						
							|  |  |  | 
 |