Replace shared_ptr with unique_ptr for reporters

This commit is contained in:
Martin Hořeňovský 2020-01-25 14:07:29 +01:00
parent 827733fe81
commit 7134ad9913
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
6 changed files with 32 additions and 28 deletions

View File

@ -28,7 +28,7 @@ namespace Catch {
class StartupExceptionRegistry;
using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
using IReporterFactoryPtr = std::unique_ptr<IReporterFactory>;
struct IRegistryHub {
virtual ~IRegistryHub();
@ -44,8 +44,8 @@ namespace Catch {
struct IMutableRegistryHub {
virtual ~IMutableRegistryHub();
virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0;
virtual void registerListener( IReporterFactoryPtr const& factory ) = 0;
virtual void registerReporter( std::string const& name, IReporterFactoryPtr factory ) = 0;
virtual void registerListener( IReporterFactoryPtr factory ) = 0;
virtual void registerTest(std::unique_ptr<TestCaseInfo>&& testInfo, std::unique_ptr<ITestInvoker>&& invoker) = 0;
virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0;

View File

@ -261,7 +261,7 @@ namespace Catch {
virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0;
virtual std::string getDescription() const = 0;
};
using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
using IReporterFactoryPtr = std::unique_ptr<IReporterFactory>;
struct IReporterRegistry {
using FactoryMap = std::map<std::string, IReporterFactoryPtr>;

View File

@ -43,11 +43,11 @@ namespace Catch {
}
public: // IMutableRegistryHub
void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override {
m_reporterRegistry.registerReporter( name, factory );
void registerReporter( std::string const& name, IReporterFactoryPtr factory ) override {
m_reporterRegistry.registerReporter( name, std::move(factory) );
}
void registerListener( IReporterFactoryPtr const& factory ) override {
m_reporterRegistry.registerListener( factory );
void registerListener( IReporterFactoryPtr factory ) override {
m_reporterRegistry.registerListener( std::move(factory) );
}
void registerTest( std::unique_ptr<TestCaseInfo>&& testInfo, std::unique_ptr<ITestInvoker>&& invoker ) override {
m_testCaseRegistry.registerTest( std::move(testInfo), std::move(invoker) );

View File

@ -17,7 +17,7 @@ namespace Catch {
class ReporterFactory : public IReporterFactory {
IStreamingReporterPtr create( ReporterConfig const& config ) const override {
return std::unique_ptr<T>( new T( config ) );
return std::make_unique<T>( config );
}
std::string getDescription() const override {
@ -50,7 +50,7 @@ namespace Catch {
public:
ListenerRegistrar() {
getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() );
getMutableRegistryHub().registerListener( std::make_unique<ListenerFactory>() );
}
};
}

View File

@ -18,17 +18,21 @@
namespace Catch {
ReporterRegistry::ReporterRegistry():
m_factories({
{"automake", std::make_shared<ReporterFactory<AutomakeReporter>>() },
{"compact", std::make_shared<ReporterFactory<CompactReporter>>() },
{"console", std::make_shared<ReporterFactory<ConsoleReporter>>() },
{"junit", std::make_shared<ReporterFactory<JunitReporter>>() },
{"sonarqube", std::make_shared<ReporterFactory<SonarQubeReporter>>() },
{"tap", std::make_shared<ReporterFactory<TAPReporter>>() },
{"teamcity", std::make_shared<ReporterFactory<TeamCityReporter>>() },
{"xml", std::make_shared<ReporterFactory<XmlReporter>>() },
}) {}
ReporterRegistry::ReporterRegistry() {
// Because it is impossible to move out of initializer list,
// we have to add the elements manually
m_factories["automake"] = std::make_unique<ReporterFactory<AutomakeReporter>>();
m_factories["compact"] = std::make_unique<ReporterFactory<CompactReporter>>();
m_factories["console"] = std::make_unique<ReporterFactory<ConsoleReporter>>();
m_factories["junit"] = std::make_unique<ReporterFactory<JunitReporter>>();
m_factories["sonarqube"] = std::make_unique<ReporterFactory<SonarQubeReporter>>();
m_factories["tap"] = std::make_unique<ReporterFactory<TAPReporter>>();
m_factories["teamcity"] = std::make_unique<ReporterFactory<TeamCityReporter>>();
m_factories["xml"] = std::make_unique<ReporterFactory<XmlReporter>>();
}
ReporterRegistry::~ReporterRegistry() = default;
IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const {
auto it = m_factories.find( name );
@ -37,11 +41,11 @@ namespace Catch {
return it->second->create( ReporterConfig( config ) );
}
void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) {
m_factories.emplace(name, factory);
void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr factory ) {
m_factories.emplace(name, std::move(factory));
}
void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) {
m_listeners.push_back( factory );
void ReporterRegistry::registerListener( IReporterFactoryPtr factory ) {
m_listeners.push_back( std::move(factory) );
}
IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {

View File

@ -18,12 +18,12 @@ namespace Catch {
public:
ReporterRegistry();
~ReporterRegistry() override = default;
~ReporterRegistry() override; // = default, out of line to allow fwd decl
IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override;
void registerReporter( std::string const& name, IReporterFactoryPtr const& factory );
void registerListener( IReporterFactoryPtr const& factory );
void registerReporter( std::string const& name, IReporterFactoryPtr factory );
void registerListener( IReporterFactoryPtr factory );
FactoryMap const& getFactories() const override;
Listeners const& getListeners() const override;