diff options
Diffstat (limited to 'asl/base')
-rw-r--r-- | asl/base/defer.hpp | 96 | ||||
-rw-r--r-- | asl/base/defer_tests.cpp | 64 | ||||
-rw-r--r-- | asl/base/utility_tests.cpp | 3 |
3 files changed, 81 insertions, 82 deletions
diff --git a/asl/base/defer.hpp b/asl/base/defer.hpp index e881d8a..122312a 100644 --- a/asl/base/defer.hpp +++ b/asl/base/defer.hpp @@ -1,48 +1,48 @@ -#pragma once
-
-#include "asl/base/utility.hpp"
-#include "asl/base/functional.hpp"
-
-namespace asl
-{
-
-template<invocable Callback>
-class DeferCallback
-{
- Callback m_callback;
- bool m_moved = false;
-
-public:
- template<typename T>
- explicit DeferCallback(T&& callback) : m_callback(ASL_FWD(callback))
- {
- }
-
- ASL_DELETE_COPY(DeferCallback);
-
- DeferCallback(DeferCallback&& other) :
- m_callback(ASL_MOVE(other.m_callback)), m_moved(exchange(other.m_moved, true))
- {
- }
-
- DeferCallback& operator=(DeferCallback&&) = delete;
-
- ~DeferCallback()
- {
- if (!m_moved) { invoke(m_callback); }
- }
-};
-
-struct DeferFactory
-{
- template<invocable Callback>
- DeferCallback<Callback> operator<<(Callback&& callback) const
- {
- return DeferCallback<Callback>(ASL_FWD(callback));
- }
-};
-
-} // namespace asl
-
-#define ASL_DEFER auto ASL_CONCAT(_defer_, __COUNTER__) = ::asl::DeferFactory{} <<
-
+#pragma once + +#include "asl/base/utility.hpp" +#include "asl/base/functional.hpp" + +namespace asl +{ + +template<invocable Callback> +class DeferCallback +{ + Callback m_callback; + bool m_moved = false; + +public: + template<typename T> + explicit DeferCallback(T&& callback) : m_callback(ASL_FWD(callback)) + { + } + + ASL_DELETE_COPY(DeferCallback); + + DeferCallback(DeferCallback&& other) : + m_callback(ASL_MOVE(other.m_callback)), m_moved(exchange(other.m_moved, true)) + { + } + + DeferCallback& operator=(DeferCallback&&) = delete; + + ~DeferCallback() + { + if (!m_moved) { invoke(m_callback); } + } +}; + +struct DeferFactory +{ + template<invocable Callback> + DeferCallback<Callback> operator<<(Callback&& callback) const + { + return DeferCallback<Callback>(ASL_FWD(callback)); + } +}; + +} // namespace asl + +#define ASL_DEFER auto ASL_CONCAT(_defer_, __COUNTER__) = ::asl::DeferFactory{} << + diff --git a/asl/base/defer_tests.cpp b/asl/base/defer_tests.cpp index b5139d5..488350f 100644 --- a/asl/base/defer_tests.cpp +++ b/asl/base/defer_tests.cpp @@ -1,32 +1,32 @@ -#include "asl/base/defer.hpp"
-#include "asl/testing/testing.hpp"
-
-ASL_TEST(defer)
-{
- uint32_t a = 0;
-
- {
- ASL_DEFER [&a]() { a |= 1; };
- ASL_TEST_EXPECT(a == 0);
-
- {
- ASL_DEFER [&a]() { a |= 2; };
- ASL_DEFER [&a]() { a |= 4; };
- ASL_TEST_EXPECT(a == 0);
- }
-
- ASL_TEST_EXPECT(a == 6);
-
- {
- ASL_DEFER [&a]() { a |= 8; };
- ASL_TEST_EXPECT(a == 6);
- }
-
- ASL_TEST_EXPECT(a == 14);
-
- ASL_DEFER [&a]() { a |= 16; };
- ASL_TEST_EXPECT(a == 14);
- }
-
- ASL_TEST_EXPECT(a == 31);
-}
+#include "asl/base/defer.hpp" +#include "asl/testing/testing.hpp" + +ASL_TEST(defer) +{ + uint32_t a = 0; + + { + ASL_DEFER [&a]() { a |= 1; }; + ASL_TEST_EXPECT(a == 0); + + { + ASL_DEFER [&a]() { a |= 2; }; + ASL_DEFER [&a]() { a |= 4; }; + ASL_TEST_EXPECT(a == 0); + } + + ASL_TEST_EXPECT(a == 6); + + { + ASL_DEFER [&a]() { a |= 8; }; + ASL_TEST_EXPECT(a == 6); + } + + ASL_TEST_EXPECT(a == 14); + + ASL_DEFER [&a]() { a |= 16; }; + ASL_TEST_EXPECT(a == 14); + } + + ASL_TEST_EXPECT(a == 31); +} diff --git a/asl/base/utility_tests.cpp b/asl/base/utility_tests.cpp index d959369..8fd6479 100644 --- a/asl/base/utility_tests.cpp +++ b/asl/base/utility_tests.cpp @@ -8,8 +8,7 @@ template<typename T> static constexpr int identify(T&&) { return 4; } struct IdentifySelf { - template<typename Self> - constexpr int get(this Self&& self) { return identify(ASL_FWD(self)); } + constexpr int get(this auto&& self) { return identify(ASL_FWD(self)); } }; static int get_const_lref(const IdentifySelf& i) { return ASL_FWD(i).get(); } |