// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp #pragma once #ifndef NAZARA_OBJECTHANDLER_HPP #define NAZARA_OBJECTHANDLER_HPP #include #include #include #include namespace Nz { namespace Detail { struct NAZARA_CORE_API HandleData { void* object; static std::shared_ptr GetEmptyObject(); }; } template class ObjectHandle; template class HandledObject { friend ObjectHandle; public: HandledObject() = default; HandledObject(const HandledObject& object); HandledObject(HandledObject&& object) noexcept; ~HandledObject(); template ObjectHandle CreateHandle(); std::shared_ptr GetHandleData(); HandledObject& operator=(const HandledObject& object); HandledObject& operator=(HandledObject&& object) noexcept; NazaraSignal(OnHandledObjectDestruction, HandledObject* /*emitter*/); protected: void UnregisterAllHandles() noexcept; private: void InitHandleData(); std::shared_ptr m_handleData; }; } #include #endif // NAZARA_OBJECTHANDLER_HPP