blob: 0119aca47a40fd6998ef2acff3b30a0f309e46d5 [file]
/*
* ObjectArena — abstract interface for the editor's slot-based allocator
* with generational handles.
*
* Ships in the runtime repo so runtime headers (component.hpp, etc.) can
* reference `ObjectArena*` members inside `#ifdef WITH_RIVE_EDITOR`
* blocks. The concrete implementation (ObjectArenaImpl) lives in the
* proprietary editor_native package — downstream runtime consumers never
* instantiate or call it.
*
* Implementations must be thread-compatible with the Rive Thread model:
* mutations from a single consumer thread, reads may be serialized
* through that same thread. See dev/editor_native_plan.md ("Rive Thread:
* Decoupled Rendering") for the full threading contract.
*/
#ifndef _RIVE_EDITOR_OBJECT_ARENA_HPP_
#define _RIVE_EDITOR_OBJECT_ARENA_HPP_
#include "rive/editor/core_handle.hpp"
namespace rive
{
class Core;
class ObjectArena
{
public:
virtual ~ObjectArena() = default;
// Resolve a handle to its live Core object, or nullptr if the handle
// is stale (slot freed, generation bumped), out of range, or never
// allocated.
virtual Core* resolve(CoreHandle handle) const = 0;
// Find the current handle for an object that this arena owns.
// Returns a null handle if the object isn't in this arena.
virtual CoreHandle handleOf(const Core* object) const = 0;
// A borrowed artboard owner calls this before its derived destructor
// touches children. Other externally destroyed entries invalidate their
// registration from Core's destructor.
virtual void ownerDestroyed(Core*) {}
virtual void objectDestroyed(Core*) {}
};
} // namespace rive
#endif