From f18366150e85f057e0e06ed33c7ad181c7e57a29 Mon Sep 17 00:00:00 2001 From: Neal Coombes Date: Fri, 17 Nov 2017 14:55:30 -0600 Subject: [PATCH] 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!! --- include/internal/catch_context.cpp | 19 +++++++------------ include/internal/catch_context.h | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/include/internal/catch_context.cpp b/include/internal/catch_context.cpp index c917a1d4..0341a6f1 100644 --- a/include/internal/catch_context.cpp +++ b/include/internal/catch_context.cpp @@ -45,21 +45,16 @@ namespace Catch { IResultCapture* m_resultCapture = nullptr; }; - namespace { - Context* currentContext = nullptr; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); + IMutableContext *IMutableContext::currentContext = nullptr; + + void IMutableContext::createContext() + { + currentContext = new Context(); } void cleanUpContext() { - delete currentContext; - currentContext = nullptr; + delete IMutableContext::currentContext; + IMutableContext::currentContext = nullptr; } IContext::~IContext() = default; IMutableContext::~IMutableContext() = default; diff --git a/include/internal/catch_context.h b/include/internal/catch_context.h index c88236a9..eb8611cc 100644 --- a/include/internal/catch_context.h +++ b/include/internal/catch_context.h @@ -15,6 +15,7 @@ namespace Catch { struct IResultCapture; struct IRunner; struct IConfig; + struct IMutableContext; using IConfigPtr = std::shared_ptr; @@ -33,10 +34,26 @@ namespace Catch { virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setRunner( IRunner* runner ) = 0; virtual void setConfig( IConfigPtr const& config ) = 0; + + private: + static IMutableContext *currentContext; + friend IMutableContext& getCurrentMutableContext(); + friend void cleanUpContext(); + static void createContext(); }; - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); + inline IMutableContext& getCurrentMutableContext() + { + if( !IMutableContext::currentContext ) + IMutableContext::createContext(); + return *IMutableContext::currentContext; + } + + inline IContext& getCurrentContext() + { + return getCurrentMutableContext(); + } + void cleanUpContext(); }