diff --git a/language/libs/pointers.hpp b/language/libs/pointers.hpp index 2438da8..97e3862 100644 --- a/language/libs/pointers.hpp +++ b/language/libs/pointers.hpp @@ -176,7 +176,19 @@ class SlotRef::Owner { public: Owner() = default; - Owner(Owner const&) = delete; + +/** + * Take ownership of another owner's slot. + * + * @param owner The owner to be disowned. + */ + + Owner(Owner&& owner) noexcept + : mRecord{owner.mRecord} + { + owner.mRecord = nullptr; + } + Owner& operator =(Owner const&) = delete; ~Owner() noexcept { @@ -203,6 +215,20 @@ class SlotRef::Owner return SlotRef{*mRecord}; } +/** + * Re-target the owned slot. + * + * @note Ignored when no slot is owned. + * @param target The new target. + */ + + void retarget(void* const target) + { + if (mRecord) { + mRecord->target = target; + } + } + private: Registry::Record* mRecord{nullptr}; }; @@ -282,8 +308,10 @@ class Target Target(Target&& target) noexcept(std::is_nothrow_move_constructible_v) : mValue{std::forward(target.mValue)} - , mOwner{} - {} + , mOwner{std::move(target.mOwner)} + { + mOwner.retarget(&mValue); + } Target& operator =(Target const& target) noexcept(std::is_nothrow_copy_assignable_v) { @@ -371,7 +399,7 @@ int main() for (int i{0}; i != 4; ++i) { noisies.emplace_back(Target::forwardCtor{}, "goodbye"); } - std::cout << "vecRef=" << vecRef.get() << '\n'; + std::cout << "vecRef=" << vecRef->name << '\n'; std::cout << '\n' << R"(return 0;)" << '\n'; return 0;