From eb285643ed5dab8125e9c6bc94abd7ef562096a5 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 27 Feb 2025 23:58:57 +0100 Subject: Finish work on deducing this, for now --- asl/base/defer.hpp | 96 +++++++++++++++++++++++----------------------- asl/base/defer_tests.cpp | 64 +++++++++++++++---------------- asl/base/utility_tests.cpp | 3 +- 3 files changed, 81 insertions(+), 82 deletions(-) (limited to 'asl/base') 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 -class DeferCallback -{ - Callback m_callback; - bool m_moved = false; - -public: - template - 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 - DeferCallback operator<<(Callback&& callback) const - { - return DeferCallback(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 +class DeferCallback +{ + Callback m_callback; + bool m_moved = false; + +public: + template + 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 + DeferCallback operator<<(Callback&& callback) const + { + return DeferCallback(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 static constexpr int identify(T&&) { return 4; } struct IdentifySelf { - template - 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(); } -- cgit