Added generic singletons facility

<sigh> yes, I know - but we have them - may as well make them consistent and safer
This commit is contained in:
Phil Nash 2018-06-15 21:25:04 +01:00 committed by Martin Hořeňovský
parent 38248f3f2c
commit eb783fc20e
4 changed files with 84 additions and 0 deletions

View File

@ -14,6 +14,7 @@
#include "catch_exception_translator_registry.h" #include "catch_exception_translator_registry.h"
#include "catch_tag_alias_registry.h" #include "catch_tag_alias_registry.h"
#include "catch_startup_exception_registry.h" #include "catch_startup_exception_registry.h"
#include "catch_singletons.hpp"
namespace Catch { namespace Catch {
@ -84,6 +85,7 @@ namespace Catch {
return *getTheRegistryHub(); return *getTheRegistryHub();
} }
void cleanUp() { void cleanUp() {
cleanupSingletons();
delete getTheRegistryHub(); delete getTheRegistryHub();
getTheRegistryHub() = nullptr; getTheRegistryHub() = nullptr;
cleanUpContext(); cleanUpContext();

View File

@ -0,0 +1,36 @@
/*
* Created by Phil Nash on 15/6/2018.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#include "catch_singletons.hpp"
#include <vector>
namespace Catch {
namespace {
static auto getSingletons() -> std::vector<ISingleton*>*& {
static std::vector<ISingleton*>* g_singletons = nullptr;
if( !g_singletons )
g_singletons = new std::vector<ISingleton*>();
return g_singletons;
}
}
ISingleton::~ISingleton() {}
void addSingleton(ISingleton* singleton ) {
getSingletons()->push_back( singleton );
}
void cleanupSingletons() {
auto& singletons = getSingletons();
for( auto singleton : *singletons )
delete singleton;
delete singletons;
singletons = nullptr;
}
} // namespace Catch

View File

@ -0,0 +1,44 @@
/*
* Created by Phil Nash on 15/6/2018.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED
namespace Catch {
struct ISingleton {
virtual ~ISingleton();
};
void addSingleton( ISingleton* singleton );
void cleanupSingletons();
template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT>
class Singleton : SingletonImplT, public ISingleton {
static auto getInternal() -> Singleton* {
static Singleton* s_instance = nullptr;
if( !s_instance ) {
s_instance = new Singleton;
addSingleton( s_instance );
}
return s_instance;
}
public:
static auto get() -> InterfaceT const& {
return *getInternal();
}
static auto getMutable() -> MutableInterfaceT& {
return *getInternal();
}
};
} // namespace Catch
#endif // TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED

View File

@ -117,6 +117,7 @@ set(INTERNAL_HEADERS
${HEADER_DIR}/internal/catch_section.h ${HEADER_DIR}/internal/catch_section.h
${HEADER_DIR}/internal/catch_section_info.h ${HEADER_DIR}/internal/catch_section_info.h
${HEADER_DIR}/internal/catch_session.h ${HEADER_DIR}/internal/catch_session.h
${HEADER_DIR}/internal/catch_singletons.hpp
${HEADER_DIR}/internal/catch_startup_exception_registry.h ${HEADER_DIR}/internal/catch_startup_exception_registry.h
${HEADER_DIR}/internal/catch_stream.h ${HEADER_DIR}/internal/catch_stream.h
${HEADER_DIR}/internal/catch_stringref.h ${HEADER_DIR}/internal/catch_stringref.h
@ -183,6 +184,7 @@ set(IMPL_SOURCES
${HEADER_DIR}/internal/catch_section.cpp ${HEADER_DIR}/internal/catch_section.cpp
${HEADER_DIR}/internal/catch_section_info.cpp ${HEADER_DIR}/internal/catch_section_info.cpp
${HEADER_DIR}/internal/catch_session.cpp ${HEADER_DIR}/internal/catch_session.cpp
${HEADER_DIR}/internal/catch_singletons.cpp
${HEADER_DIR}/internal/catch_startup_exception_registry.cpp ${HEADER_DIR}/internal/catch_startup_exception_registry.cpp
${HEADER_DIR}/internal/catch_stream.cpp ${HEADER_DIR}/internal/catch_stream.cpp
${HEADER_DIR}/internal/catch_stringref.cpp ${HEADER_DIR}/internal/catch_stringref.cpp