LeviLamina
Loading...
Searching...
No Matches
ScopedValue.h
1#pragma once
2
3#include <type_traits>
4#include <utility>
5
6namespace ll {
7
8template <class T>
9class [[nodiscard]] ScopedValue {
10public:
11 explicit ScopedValue(T& value, T replacement) noexcept(
12 std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_assignable_v<T>
13 )
14 : mValue(value),
15 mPrevious(std::exchange(value, std::move(replacement))) {}
16
17 ~ScopedValue() noexcept(std::is_nothrow_move_assignable_v<T>) { mValue = std::move(mPrevious); }
18
19 ScopedValue(ScopedValue const&) = delete;
20 ScopedValue& operator=(ScopedValue const&) = delete;
21 ScopedValue(ScopedValue&&) = delete;
22 ScopedValue& operator=(ScopedValue&&) = delete;
23
24private:
25 T& mValue;
26 T mPrevious;
27};
28
29template <class T, class U>
30ScopedValue(T&, U&&) -> ScopedValue<T>;
31
32} // namespace ll
Definition ScopedValue.h:9