diff --git a/.gitignore b/.gitignore index 8f313ddbc..6d624695a 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/include/etl/singleton_base.h b/include/etl/singleton_base.h index 6b68aafb0..eb9653b4b 100644 --- a/include/etl/singleton_base.h +++ b/include/etl/singleton_base.h @@ -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 + /// : singleton /// { /// public: /// Origin(int x, int y) @@ -112,43 +113,52 @@ 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 + template class singleton_base { - protected: + public: //*********************************************************************** - /// Constructs the instance of singleton. - /// theInstance Reference to T, which will be returned when instance() is called. + // Returns a reference to the instance. //*********************************************************************** - explicit singleton_base(T& theInstance) + static T& instance() { - ETL_ASSERT(m_self == nullptr, ETL_ERROR(etl::singleton_base_already_created)); - m_self = &theInstance; + ETL_ASSERT(m_self != ETL_NULLPTR, ETL_ERROR(etl::singleton_base_not_created)); + + return *m_self; } //*********************************************************************** - /// Removes the internal reference to the instance passed in the constructor. + /// Returns whether an instance has been attached to singleton or not. //*********************************************************************** - ~singleton_base() { m_self = nullptr; } + static bool is_valid() + { + return (m_self != ETL_NULLPTR); + } - public: + protected: //*********************************************************************** - // Returns a reference to the instance. + /// Constructs the instance of singleton. + /// theInstance Reference to T, which will be returned when instance() is called. //*********************************************************************** - static T& instance() + explicit singleton_base(T& theInstance) { - ETL_ASSERT(m_self != nullptr, ETL_ERROR(etl::singleton_base_not_created)); - return *m_self; + ETL_ASSERT(m_self == ETL_NULLPTR, ETL_ERROR(etl::singleton_base_already_created)); + + m_self = &theInstance; } //*********************************************************************** - /// Returns whether an instance has been attached to singleton or not. + /// Removes the internal reference to the instance passed in the constructor. //*********************************************************************** - static bool is_valid() { return (m_self != nullptr); } + ~singleton_base() + { + m_self = ETL_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 - T* singleton_base::m_self = nullptr; + T* singleton_base::m_self = ETL_NULLPTR; } #endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ce9e2a664..90b9fbb4c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/c++03/CMakeLists.txt b/test/syntax_check/c++03/CMakeLists.txt index fad0c6eb0..651b23e60 100644 --- a/test/syntax_check/c++03/CMakeLists.txt +++ b/test/syntax_check/c++03/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/c++11/CMakeLists.txt b/test/syntax_check/c++11/CMakeLists.txt index f426cecca..68c48d232 100644 --- a/test/syntax_check/c++11/CMakeLists.txt +++ b/test/syntax_check/c++11/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/c++14/CMakeLists.txt b/test/syntax_check/c++14/CMakeLists.txt index b7bc68b99..5d50945fd 100644 --- a/test/syntax_check/c++14/CMakeLists.txt +++ b/test/syntax_check/c++14/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/c++17/CMakeLists.txt b/test/syntax_check/c++17/CMakeLists.txt index 5d8761ab2..be7879086 100644 --- a/test/syntax_check/c++17/CMakeLists.txt +++ b/test/syntax_check/c++17/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/c++20/CMakeLists.txt b/test/syntax_check/c++20/CMakeLists.txt index f38c48ada..71a5bb167 100644 --- a/test/syntax_check/c++20/CMakeLists.txt +++ b/test/syntax_check/c++20/CMakeLists.txt @@ -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 diff --git a/test/syntax_check/singleton_base.h.t.cpp b/test/syntax_check/singleton_base.h.t.cpp new file mode 100644 index 000000000..723ffcf9e --- /dev/null +++ b/test/syntax_check/singleton_base.h.t.cpp @@ -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 diff --git a/test/test_singleton_base.cpp b/test/test_singleton_base.cpp index 40cfa5430..fec07c59a 100644 --- a/test/test_singleton_base.cpp +++ b/test/test_singleton_base.cpp @@ -34,7 +34,7 @@ SOFTWARE. #include #include -class Test_Singleton: public ::etl::singleton_base +class Test_Singleton: public etl::singleton_base { public: @@ -62,7 +62,6 @@ namespace //************************************************************************* TEST(test1) { - CHECK(!Test_Singleton::is_valid()); CHECK_THROW(Test_Singleton::instance(), etl::singleton_base_not_created); diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 7506cfa14..7809c4383 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -3190,6 +3190,7 @@ + @@ -7076,6 +7077,21 @@ true true + + true + true + true + true + true + true + true + true + true + true + true + true + true + true true @@ -8912,6 +8928,7 @@ true +