Eliminate dynamic cast by promoting interface to parent class

This eliminates one use of RTTI in Catch.
This commit is contained in:
Eirik Byrkjeflot Anonsen 2016-04-04 18:51:33 +02:00
parent c984fc3ecd
commit 218d0bdcc7
2 changed files with 18 additions and 5 deletions

View File

@ -226,6 +226,13 @@ namespace Catch
// Implementing class must also provide the following static method: // Implementing class must also provide the following static method:
// static std::string getDescription(); // static std::string getDescription();
virtual bool supportsChainedReporters() const {
return false;
}
virtual void addChainedReporter( Ptr<IStreamingReporter> const& reporter ) {
}
virtual ReporterPreferences getPreferences() const = 0; virtual ReporterPreferences getPreferences() const = 0;
virtual void noMatchingTestCases( std::string const& spec ) = 0; virtual void noMatchingTestCases( std::string const& spec ) = 0;

View File

@ -22,6 +22,13 @@ public:
} }
public: // IStreamingReporter public: // IStreamingReporter
virtual bool supportsChainedReporters() const CATCH_OVERRIDE {
return true;
}
virtual void addChainedReporter( Ptr<IStreamingReporter> const& reporter ) CATCH_OVERRIDE {
add( reporter );
}
virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
return m_reporters[0]->getPreferences(); return m_reporters[0]->getPreferences();
@ -124,16 +131,15 @@ Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingRepo
Ptr<IStreamingReporter> resultingReporter; Ptr<IStreamingReporter> resultingReporter;
if( existingReporter ) { if( existingReporter ) {
MultipleReporters* multi = dynamic_cast<MultipleReporters*>( existingReporter.get() ); if( !existingReporter->supportsChainedReporters() ) {
if( !multi ) { MultipleReporters* multi = new MultipleReporters;
multi = new MultipleReporters;
resultingReporter = Ptr<IStreamingReporter>( multi ); resultingReporter = Ptr<IStreamingReporter>( multi );
if( existingReporter ) if( existingReporter )
multi->add( existingReporter ); multi->addChainedReporter( existingReporter );
} }
else else
resultingReporter = existingReporter; resultingReporter = existingReporter;
multi->add( additionalReporter ); resultingReporter->addChainedReporter( additionalReporter );
} }
else else
resultingReporter = additionalReporter; resultingReporter = additionalReporter;