mirror of
https://github.com/ETLCPP/etl.git
synced 2026-11-09 14:49:53 +08:00
Updates to singleton_base
This commit is contained in:
parent
5e3b029af0
commit
c1a1d24712
1
.gitignore
vendored
1
.gitignore
vendored
@ -388,3 +388,4 @@ support/time remaining test.xlsx
|
||||
test/vs2022/Debug MSVC C++20 - Force C++03
|
||||
test/vs2022/Release MSVC C++20 - No STL - Optimised -O2 - Sanitiser
|
||||
test/test_file_list.txt
|
||||
test/etl_error_handler/assert_function/build-make
|
||||
|
||||
@ -39,6 +39,7 @@ SOFTWARE.
|
||||
|
||||
#include "platform.h"
|
||||
#include "error_handler.h"
|
||||
#include "nullptr.h"
|
||||
#include "file_error_numbers.h"
|
||||
|
||||
namespace etl
|
||||
@ -93,7 +94,7 @@ namespace etl
|
||||
/// Usage example:
|
||||
///
|
||||
/// class Origin
|
||||
/// : singleton<Origin>
|
||||
/// : singleton<Origin>
|
||||
/// {
|
||||
/// public:
|
||||
/// Origin(int x, int y)
|
||||
@ -112,9 +113,29 @@ namespace etl
|
||||
/// to be created by the user before calling instance(). This way, the user has better control
|
||||
/// over the instance lifetime instead of e.g. lazy initialization.
|
||||
//***********************************************************************
|
||||
template<class T>
|
||||
template <typename T>
|
||||
class singleton_base
|
||||
{
|
||||
public:
|
||||
|
||||
//***********************************************************************
|
||||
// Returns a reference to the instance.
|
||||
//***********************************************************************
|
||||
static T& instance()
|
||||
{
|
||||
ETL_ASSERT(m_self != ETL_NULLPTR, ETL_ERROR(etl::singleton_base_not_created));
|
||||
|
||||
return *m_self;
|
||||
}
|
||||
|
||||
//***********************************************************************
|
||||
/// Returns whether an instance has been attached to singleton<T> or not.
|
||||
//***********************************************************************
|
||||
static bool is_valid()
|
||||
{
|
||||
return (m_self != ETL_NULLPTR);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
//***********************************************************************
|
||||
@ -123,32 +144,21 @@ namespace etl
|
||||
//***********************************************************************
|
||||
explicit singleton_base(T& theInstance)
|
||||
{
|
||||
ETL_ASSERT(m_self == nullptr, ETL_ERROR(etl::singleton_base_already_created));
|
||||
ETL_ASSERT(m_self == ETL_NULLPTR, ETL_ERROR(etl::singleton_base_already_created));
|
||||
|
||||
m_self = &theInstance;
|
||||
}
|
||||
|
||||
//***********************************************************************
|
||||
/// Removes the internal reference to the instance passed in the constructor.
|
||||
//***********************************************************************
|
||||
~singleton_base() { m_self = nullptr; }
|
||||
|
||||
public:
|
||||
|
||||
//***********************************************************************
|
||||
// Returns a reference to the instance.
|
||||
//***********************************************************************
|
||||
static T& instance()
|
||||
{
|
||||
ETL_ASSERT(m_self != nullptr, ETL_ERROR(etl::singleton_base_not_created));
|
||||
return *m_self;
|
||||
~singleton_base()
|
||||
{
|
||||
m_self = ETL_NULLPTR;
|
||||
}
|
||||
|
||||
//***********************************************************************
|
||||
/// Returns whether an instance has been attached to singleton<T> or not.
|
||||
//***********************************************************************
|
||||
static bool is_valid() { return (m_self != nullptr); }
|
||||
|
||||
private:
|
||||
|
||||
static T* m_self;
|
||||
};
|
||||
|
||||
@ -156,7 +166,7 @@ namespace etl
|
||||
/// No violation of one definition rule as this is a class template
|
||||
//***********************************************************************
|
||||
template<class T>
|
||||
T* singleton_base<T>::m_self = nullptr;
|
||||
T* singleton_base<T>::m_self = ETL_NULLPTR;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -233,6 +233,7 @@ add_executable(etl_tests
|
||||
test_set.cpp
|
||||
test_shared_message.cpp
|
||||
test_singleton.cpp
|
||||
test_singleton_base.cpp
|
||||
test_smallest.cpp
|
||||
test_span_dynamic_extent.cpp
|
||||
test_span_fixed_extent.cpp
|
||||
|
||||
@ -260,6 +260,7 @@ target_sources(t98 PRIVATE etl_profile.h
|
||||
../set.h.t.cpp
|
||||
../shared_message.h.t.cpp
|
||||
../singleton.h.t.cpp
|
||||
../singleton_base.h.t.cpp
|
||||
../smallest.h.t.cpp
|
||||
../span.h.t.cpp
|
||||
../sqrt.h.t.cpp
|
||||
|
||||
@ -260,6 +260,7 @@ target_sources(t11 PRIVATE etl_profile.h
|
||||
../set.h.t.cpp
|
||||
../shared_message.h.t.cpp
|
||||
../singleton.h.t.cpp
|
||||
../singleton_base.h.t.cpp
|
||||
../smallest.h.t.cpp
|
||||
../span.h.t.cpp
|
||||
../sqrt.h.t.cpp
|
||||
|
||||
@ -260,6 +260,7 @@ target_sources(t14 PRIVATE etl_profile.h
|
||||
../set.h.t.cpp
|
||||
../shared_message.h.t.cpp
|
||||
../singleton.h.t.cpp
|
||||
../singleton_base.h.t.cpp
|
||||
../smallest.h.t.cpp
|
||||
../span.h.t.cpp
|
||||
../sqrt.h.t.cpp
|
||||
|
||||
@ -260,6 +260,7 @@ target_sources(t17 PRIVATE etl_profile.h
|
||||
../set.h.t.cpp
|
||||
../shared_message.h.t.cpp
|
||||
../singleton.h.t.cpp
|
||||
../singleton_base.h.t.cpp
|
||||
../smallest.h.t.cpp
|
||||
../span.h.t.cpp
|
||||
../sqrt.h.t.cpp
|
||||
|
||||
@ -260,6 +260,7 @@ target_sources(t20 PRIVATE etl_profile.h
|
||||
../set.h.t.cpp
|
||||
../shared_message.h.t.cpp
|
||||
../singleton.h.t.cpp
|
||||
../singleton_base.h.t.cpp
|
||||
../smallest.h.t.cpp
|
||||
../span.h.t.cpp
|
||||
../sqrt.h.t.cpp
|
||||
|
||||
29
test/syntax_check/singleton_base.h.t.cpp
Normal file
29
test/syntax_check/singleton_base.h.t.cpp
Normal file
@ -0,0 +1,29 @@
|
||||
/******************************************************************************
|
||||
The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2024 John Wellbelove
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files(the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions :
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#include <etl/singleton_base.h>
|
||||
@ -34,7 +34,7 @@ SOFTWARE.
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
|
||||
class Test_Singleton: public ::etl::singleton_base<Test_Singleton>
|
||||
class Test_Singleton: public etl::singleton_base<Test_Singleton>
|
||||
{
|
||||
public:
|
||||
|
||||
@ -62,7 +62,6 @@ namespace
|
||||
//*************************************************************************
|
||||
TEST(test1)
|
||||
{
|
||||
|
||||
CHECK(!Test_Singleton::is_valid());
|
||||
CHECK_THROW(Test_Singleton::instance(), etl::singleton_base_not_created);
|
||||
|
||||
|
||||
@ -3190,6 +3190,7 @@
|
||||
<ClInclude Include="..\..\include\etl\scaled_rounding.h" />
|
||||
<ClInclude Include="..\..\include\etl\shared_message.h" />
|
||||
<ClInclude Include="..\..\include\etl\singleton.h" />
|
||||
<ClInclude Include="..\..\include\etl\singleton_base.h" />
|
||||
<ClInclude Include="..\..\include\etl\span.h" />
|
||||
<ClInclude Include="..\..\include\etl\standard_deviation.h" />
|
||||
<ClInclude Include="..\..\include\etl\state_chart.h" />
|
||||
@ -7076,6 +7077,21 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++14 - No STL|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - Force C++03|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\syntax_check\singleton_base.h.t.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No virtual imessage|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++ 20 - No Tests|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No STL|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++14|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MSVC C++20 - No STL - Optimised -O2|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MSVC C++20 - No STL - Optimised -O2 - Sanitiser|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++17|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++17 - No STL|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release MSVC C++20 - Optimised O2|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No virtual messages|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++14 - No STL|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - Force C++03|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\syntax_check\smallest.h.t.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug MSVC C++20 - No virtual imessage|Win32'">true</ExcludedFromBuild>
|
||||
@ -8912,6 +8928,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\test_singleton.cpp" />
|
||||
<ClCompile Include="..\test_singleton_base.cpp" />
|
||||
<ClCompile Include="..\test_span_dynamic_extent.cpp" />
|
||||
<ClCompile Include="..\test_span_fixed_extent.cpp" />
|
||||
<ClCompile Include="..\test_standard_deviation.cpp" />
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user