#pragma once // IMPLEMENTATION_DETAIL_OBJECT_SCOPES /// \file object_scope.h /// \author Folling #include #include #include #include /// \defgroup object_scopes Object Scopes /// \brief Scopes define where objects belong to. /// \details They are required to differentiate between different types of objects with NULL as their parent. /// @{ IKARUS_BEGIN_HEADER /// \private \brief The data for an object scope. union IkarusObjectScopeData { /// \private \brief The blueprint data of the scope. IkarusBlueprintScope _blueprint; /// \private \brief The property data of the scope. IkarusPropertyScope _property; /// \private \brief The entity data of the scope. IkarusEntityScope _entity; }; /// The type of an object scope. enum IkarusObjectScopeType { /// \brief The scope is a blueprint scope. IkarusObjectScopeType_Blueprint, /// \brief The scope is a property scope. IkarusObjectScopeType_Property, /// \brief The scope is an entity scope. IkarusObjectScopeType_Entity }; /// \brief The scope of an object. struct IkarusObjectScope { /// \private \brief Represents the type of the scope. IkarusObjectScopeType _type; /// \private \brief Represents the data of the scope. IkarusObjectScopeData _data; }; /// \brief Converts a blueprint scope to an object scope. /// \param scope The scope to convert. /// \return The converted scope. IKA_API IkarusObjectScope ikarus_blueprint_scope_to_object_scope(IkarusBlueprintScope scope); /// \brief Converts a property scope to an object scope. /// \param scope The scope to convert. /// \return The converted scope. IKA_API IkarusObjectScope ikarus_property_scope_to_object_scope(IkarusPropertyScope scope); /// Converts an entity scope to an object scope. /// \param scope The scope to convert. /// \return The converted scope. IKA_API IkarusObjectScope ikarus_entity_scope_to_object_scope(IkarusEntityScope scope); /// \brief Fetches the type of an object scope. /// \param scope The scope to fetch the type of. /// \return The type of the scope. IKA_API IkarusObjectScopeType ikarus_object_scope_get_type(IkarusObjectScope scope); /// \brief Visits an object scope, calling the appropriate function. /// \param scope The scope to visit. /// \param blueprint The function to call if the scope is an #IkarusBlueprintScope. /// \param property The function to call if the scope is an #IkarusPropertyScope. /// \param entity The function to call if the scope is an #IkarusEntityScope. /// \remark function pointers may be null in which case they are not called. IKA_API void ikarus_object_scope_visit( IkarusObjectScope scope, void (*blueprint)(IkarusBlueprintScope, void *), void (*property)(IkarusPropertyScope, void *), void (*entity)(IkarusEntityScope, void *), void * data ); /// @} IKARUS_END_HEADER