performance improvement - getCurrentContext

inlined getCurrentContext and getMutableContext
Further work on #1086.
Brings test from 0m37.913 to 0m25.584s
Catch2 is now faster than Catch 1.x!!
This commit is contained in:
Neal Coombes 2017-11-17 14:55:30 -06:00
parent fe725648a7
commit f18366150e
2 changed files with 26 additions and 14 deletions

View File

@ -45,21 +45,16 @@ namespace Catch {
IResultCapture* m_resultCapture = nullptr; IResultCapture* m_resultCapture = nullptr;
}; };
namespace { IMutableContext *IMutableContext::currentContext = nullptr;
Context* currentContext = nullptr;
} void IMutableContext::createContext()
IMutableContext& getCurrentMutableContext() { {
if( !currentContext )
currentContext = new Context(); currentContext = new Context();
return *currentContext;
}
IContext& getCurrentContext() {
return getCurrentMutableContext();
} }
void cleanUpContext() { void cleanUpContext() {
delete currentContext; delete IMutableContext::currentContext;
currentContext = nullptr; IMutableContext::currentContext = nullptr;
} }
IContext::~IContext() = default; IContext::~IContext() = default;
IMutableContext::~IMutableContext() = default; IMutableContext::~IMutableContext() = default;

View File

@ -15,6 +15,7 @@ namespace Catch {
struct IResultCapture; struct IResultCapture;
struct IRunner; struct IRunner;
struct IConfig; struct IConfig;
struct IMutableContext;
using IConfigPtr = std::shared_ptr<IConfig const>; using IConfigPtr = std::shared_ptr<IConfig const>;
@ -33,10 +34,26 @@ namespace Catch {
virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
virtual void setRunner( IRunner* runner ) = 0; virtual void setRunner( IRunner* runner ) = 0;
virtual void setConfig( IConfigPtr const& config ) = 0; virtual void setConfig( IConfigPtr const& config ) = 0;
private:
static IMutableContext *currentContext;
friend IMutableContext& getCurrentMutableContext();
friend void cleanUpContext();
static void createContext();
}; };
IContext& getCurrentContext(); inline IMutableContext& getCurrentMutableContext()
IMutableContext& getCurrentMutableContext(); {
if( !IMutableContext::currentContext )
IMutableContext::createContext();
return *IMutableContext::currentContext;
}
inline IContext& getCurrentContext()
{
return getCurrentMutableContext();
}
void cleanUpContext(); void cleanUpContext();
} }