diff --git a/include/beman/execution/detail/atomic_intrusive_stack.hpp b/include/beman/execution/detail/atomic_intrusive_stack.hpp index 1113e7ef..d673a7b9 100644 --- a/include/beman/execution/detail/atomic_intrusive_stack.hpp +++ b/include/beman/execution/detail/atomic_intrusive_stack.hpp @@ -77,14 +77,11 @@ class atomic_intrusive_stack { //! //! @return If the stack is empty, returns an empty stack. auto pop_all_and_shutdown() noexcept -> ::beman::execution::detail::intrusive_stack { - auto stack = ::beman::execution::detail::intrusive_stack{}; - void* ptr = head_.exchange(this); + void* ptr = head_.exchange(this); if (ptr == this) { - return stack; + return {}; } - auto item = static_cast(ptr); - stack.head_ = item; - return stack; + return ::beman::execution::detail::intrusive_stack{static_cast(ptr)}; } private: diff --git a/include/beman/execution/detail/intrusive_stack.hpp b/include/beman/execution/detail/intrusive_stack.hpp index 276a4d6f..cc258fb8 100644 --- a/include/beman/execution/detail/intrusive_stack.hpp +++ b/include/beman/execution/detail/intrusive_stack.hpp @@ -14,9 +14,6 @@ import std; namespace beman::execution::detail { -template -class atomic_intrusive_stack; - template class intrusive_stack; @@ -24,6 +21,10 @@ class intrusive_stack; template class intrusive_stack { public: + intrusive_stack() = default; + + explicit intrusive_stack(Item* head) noexcept : head_{head} {} + //! @brief Pushes an item to the queue. auto push(Item* item) noexcept -> void { item->*Next = std::exchange(head_, item); } @@ -43,7 +44,6 @@ class intrusive_stack { auto empty() const noexcept -> bool { return !head_; } private: - friend class atomic_intrusive_stack; Item* head_{nullptr}; };