diff --git a/radiant/eclass.cpp b/radiant/eclass.cpp index c5179263..d8efbf0e 100644 --- a/radiant/eclass.cpp +++ b/radiant/eclass.cpp @@ -57,9 +57,9 @@ EClassModules& EntityClassManager_getEClassModules(); */ void CleanEntityList( EntityClasses& entityClasses ){ - for ( EntityClasses::iterator i = entityClasses.begin(); i != entityClasses.end(); ++i ) + for ( auto [ name, eclass ] : entityClasses ) { - ( *i ).second->free( ( *i ).second ); + eclass->free( eclass ); } entityClasses.clear(); } @@ -70,11 +70,11 @@ void Eclass_Clear(){ } EntityClass* EClass_InsertSortedList( EntityClasses& entityClasses, EntityClass *entityClass ){ - std::pair result = entityClasses.insert( EntityClasses::value_type( entityClass->name(), entityClass ) ); - if ( !result.second ) { + auto [ it, inserted ] = entityClasses.insert( EntityClasses::value_type( entityClass->name(), entityClass ) ); + if ( !inserted ) { entityClass->free( entityClass ); } - return ( *result.first ).second; + return it->second; } EntityClass* Eclass_InsertAlphabetized( EntityClass *e ){ @@ -82,9 +82,9 @@ EntityClass* Eclass_InsertAlphabetized( EntityClass *e ){ } void Eclass_forEach( EntityClassVisitor& visitor ){ - for ( EntityClasses::iterator i = g_entityClasses.begin(); i != g_entityClasses.end(); ++i ) + for ( auto [ name, eclass ] : g_entityClasses ) { - visitor.visit( ( *i ).second ); + visitor.visit( eclass ); } } @@ -92,10 +92,10 @@ void Eclass_forEach( EntityClassVisitor& visitor ){ class RadiantEclassCollector : public EntityClassCollector { public: - void insert( EntityClass* eclass ){ + void insert( EntityClass* eclass ) override { Eclass_InsertAlphabetized( eclass ); } - void insert( const char* name, const ListAttributeType& list ){ + void insert( const char* name, const ListAttributeType& list ) override { g_listTypes.insert( ListAttributeTypes::value_type( name, list ) ); } }; @@ -157,8 +157,6 @@ public: } } - // for a given name, we grab the first .def in the vfs - // this allows to override baseq3/scripts/entities.def for instance const auto relPath = StringStream( m_directory, name ); scanner.scanFile( g_collector, relPath ); @@ -182,6 +180,12 @@ void EntityClassQuake3_constructDirectory( const char* directory, const char* ex } +/* facts: + modules are alpha sorted, so .def .ent loading order + all base & mod files of the same type are alpha sorted together + equal file name in mod is ignored + equal eclass name inserted later is ignored +*/ void EntityClassQuake3_Construct(){ const auto baseDirectory = StringStream( GlobalRadiant().getGameToolsPath(), GlobalRadiant().getRequiredGameDescriptionKeyValue( "basegame" ), '/' ); const auto gameDirectory = StringStream( GlobalRadiant().getGameToolsPath(), GlobalRadiant().getGameName(), '/' ); @@ -201,9 +205,9 @@ void EntityClassQuake3_Construct(){ EntityClassQuake3_constructDirectory( gameDirectory, table.getExtension(), paths ); } - for ( Paths::iterator i = paths.begin(); i != paths.end(); ++i ) + for ( const auto& [ name, path ] : paths ) { - EntityClassesLoadFile( table, ( *i ).second ) ( ( *i ).first.c_str() ); + EntityClassesLoadFile( table, path ) ( name.c_str() ); } } }; diff --git a/radiant/eclass_fgd.cpp b/radiant/eclass_fgd.cpp index f02bc6d8..a8c29d02 100644 --- a/radiant/eclass_fgd.cpp +++ b/radiant/eclass_fgd.cpp @@ -52,41 +52,41 @@ ListAttributeTypes g_listTypesFGD; void EntityClassFGD_clear(){ g_EntityClassFGD_classes.clear(); - for ( BaseClasses::iterator i = g_EntityClassFGD_bases.begin(); i != g_EntityClassFGD_bases.end(); ++i ) + for ( auto [ name, eclass ] : g_EntityClassFGD_bases ) { - ( *i ).second->free( ( *i ).second ); + eclass->free( eclass ); } g_EntityClassFGD_bases.clear(); g_listTypesFGD.clear(); } EntityClass* EntityClassFGD_insertUniqueBase( EntityClass* entityClass, bool allowfree = true ){ - std::pair result = g_EntityClassFGD_bases.insert( BaseClasses::value_type( entityClass->name(), entityClass ) ); - if ( !result.second ) { + auto [ it, inserted ] = g_EntityClassFGD_bases.insert( BaseClasses::value_type( entityClass->name(), entityClass ) ); + if ( !inserted ) { globalErrorStream() << "duplicate base class: " << makeQuoted( entityClass->name() ) << '\n'; if( allowfree ){ eclass_capture_state( entityClass ); entityClass->free( entityClass ); } } - return ( *result.first ).second; + return it->second; } EntityClass* EntityClassFGD_insertUnique( EntityClass* entityClass ){ EntityClassFGD_insertUniqueBase( entityClass, false ); - std::pair result = g_EntityClassFGD_classes.insert( EntityClasses::value_type( entityClass->name(), entityClass ) ); - if ( !result.second ) { + auto [ it, inserted ] = g_EntityClassFGD_classes.insert( EntityClasses::value_type( entityClass->name(), entityClass ) ); + if ( !inserted ) { globalErrorStream() << "duplicate entity class: " << makeQuoted( entityClass->name() ) << '\n'; eclass_capture_state( entityClass ); entityClass->free( entityClass ); } - return ( *result.first ).second; + return it->second; } void EntityClassFGD_forEach( EntityClassVisitor& visitor ){ - for ( EntityClasses::iterator i = g_EntityClassFGD_classes.begin(); i != g_EntityClassFGD_classes.end(); ++i ) + for ( auto [ name, eclass ] : g_EntityClassFGD_classes ) { - visitor.visit( ( *i ).second ); + visitor.visit( eclass ); } } @@ -448,10 +448,10 @@ void EntityClassFGD_parseClass( Tokeniser& tokeniser, bool fixedsize, bool isBas tokeniser.nextLine(); } - for ( ListAttributeType::const_iterator i = listType.begin(); i != listType.end(); ++i ) + for ( const auto& [ name, value ] : listType ) { - if ( string_equal( attribute.m_value.c_str(), ( *i ).first.c_str() ) ) { - attribute.m_value = ( *i ).second; + if ( string_equal( attribute.m_value.c_str(), name.c_str() ) ) { + attribute.m_value = value; } } @@ -634,11 +634,11 @@ const ListAttributeType* EntityClassFGD_findListType( const char *name ){ void EntityClassFGD_resolveInheritance( EntityClass* derivedClass ){ if ( derivedClass->inheritanceResolved == false ) { derivedClass->inheritanceResolved = true; - for ( StringList::iterator j = derivedClass->m_parent.begin(); j != derivedClass->m_parent.end(); ++j ) + for ( const auto& parentName : derivedClass->m_parent ) { - BaseClasses::iterator i = g_EntityClassFGD_bases.find( ( *j ).c_str() ); + BaseClasses::iterator i = g_EntityClassFGD_bases.find( parentName.c_str() ); if ( i == g_EntityClassFGD_bases.end() ) { - globalErrorStream() << "failed to find entityDef " << makeQuoted( ( *j ).c_str() ) << " inherited by " << makeQuoted( derivedClass->name() ) << '\n'; + globalErrorStream() << "failed to find entityDef " << makeQuoted( parentName.c_str() ) << " inherited by " << makeQuoted( derivedClass->name() ) << '\n'; } else { @@ -654,9 +654,9 @@ void EntityClassFGD_resolveInheritance( EntityClass* derivedClass ){ derivedClass->maxs = parentClass->maxs; } - for ( EntityClassAttributes::iterator k = parentClass->m_attributes.begin(); k != parentClass->m_attributes.end(); ++k ) + for ( const auto& [ key, attr ] : parentClass->m_attributes ) { - EntityClass_insertAttribute( *derivedClass, ( *k ).first.c_str(), ( *k ).second ); + EntityClass_insertAttribute( *derivedClass, key.c_str(), attr ); } for( size_t flag = 0; flag < MAX_FLAGS; ++flag ){ @@ -713,23 +713,23 @@ public: } { - for ( EntityClasses::iterator i = g_EntityClassFGD_classes.begin(); i != g_EntityClassFGD_classes.end(); ++i ) + for ( auto [ name, eclass ] : g_EntityClassFGD_classes ) { - EntityClassFGD_resolveInheritance( ( *i ).second ); - if ( ( *i ).second->fixedsize && ( *i ).second->m_modelpath.empty() ) { - if ( !( *i ).second->sizeSpecified ) { - globalErrorStream() << "size not specified for entity class: " << makeQuoted( ( *i ).second->name() ) << '\n'; + EntityClassFGD_resolveInheritance( eclass ); + if ( eclass->fixedsize && eclass->m_modelpath.empty() ) { + if ( !eclass->sizeSpecified ) { + globalErrorStream() << "size not specified for entity class: " << makeQuoted( eclass->name() ) << '\n'; } - if ( !( *i ).second->colorSpecified ) { - globalErrorStream() << "color not specified for entity class: " << makeQuoted( ( *i ).second->name() ) << '\n'; + if ( !eclass->colorSpecified ) { + globalErrorStream() << "color not specified for entity class: " << makeQuoted( eclass->name() ) << '\n'; } } } } { - for ( BaseClasses::iterator i = g_EntityClassFGD_bases.begin(); i != g_EntityClassFGD_bases.end(); ++i ) + for ( auto [ name, eclass ] : g_EntityClassFGD_bases ) { - eclass_capture_state( ( *i ).second ); + eclass_capture_state( eclass ); } } diff --git a/radiant/eclass_xml.cpp b/radiant/eclass_xml.cpp index d14f5c37..9fd2f5ae 100644 --- a/radiant/eclass_xml.cpp +++ b/radiant/eclass_xml.cpp @@ -529,6 +529,8 @@ const char* GetExtension(){ void ScanFile( EntityClassCollector& collector, const char *filename ){ TextFileInputStream inputFile( filename ); if ( !inputFile.failed() ) { + globalOutputStream() << "parsing entity classes from " << makeQuoted( filename ) << '\n'; + XMLStreamParser parser( inputFile ); EclassXMLImporter importer( collector );