From d33190b204061c0dc4ca2bc4e577f6a44d33b802 Mon Sep 17 00:00:00 2001 From: Folling Date: Fri, 25 Aug 2023 08:52:34 +0200 Subject: [PATCH] object type interface Signed-off-by: Folling --- include/ikarus/types/object_type.h | 36 +++++++++++++++++++----------- src/types/object_type.cpp | 32 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/types/object_type.cpp diff --git a/include/ikarus/types/object_type.h b/include/ikarus/types/object_type.h index 1c0cf9d..fd8685a 100644 --- a/include/ikarus/types/object_type.h +++ b/include/ikarus/types/object_type.h @@ -9,39 +9,40 @@ IKARUS_BEGIN_HEADER /// @{ /// \brief The type of a folder. -/// \remark folders have the first bit set and then mirror the object type of the underlying object +/// \remark These values are identical to the associated values of IkarusObjectType. enum IkarusFolderType { /// \brief Not a folder or no folder. IkarusFolderType_None = 0, /// \brief An IkarusBlueprintFolder - IkarusFolderType_BlueprintFolder = 0b1000'0001, + IkarusFolderType_BlueprintFolder = 17, /// \brief An IkarusPropertyFolder - IkarusFolderType_PropertyFolder = 0b1000'0010, + IkarusFolderType_PropertyFolder = 18, /// \brief An IkarusEntityFolder - IkarusFolderType_EntityFolder = 0b1000'0011, + IkarusFolderType_EntityFolder = 19, }; /// \brief The type of an object. -/// \remark folders have the first bit set and then mirror the object type of the underlying object +/// \remark Folders have the 4th bit set. enum IkarusObjectType { /// \brief Not an object or no object. IkarusObjectType_None = 0, /// \brief An IkarusBlueprint. - IkarusObjectType_Blueprint = 0b0000'0001, + IkarusObjectType_Blueprint = 1, /// \brief An IkarusProperty. - IkarusObjectType_Property = 0b0000'0010, + IkarusObjectType_Property = 2, /// \brief An IkarusEntity. - IkarusObjectType_Entity = 0b0000'0011, + IkarusObjectType_Entity = 3, /// \brief An IkarusBlueprintFolder - IkarusObjectType_BlueprintFolder = 0b1000'0001, + IkarusObjectType_BlueprintFolder = IkarusFolderType_BlueprintFolder, /// \brief An IkarusPropertyFolder - IkarusObjectType_PropertyFolder = 0b1000'0010, + IkarusObjectType_PropertyFolder = IkarusFolderType_PropertyFolder, /// \brief An IkarusEntityFolder - IkarusObjectType_EntityFolder = 0b1000'0011, + IkarusObjectType_EntityFolder = IkarusFolderType_EntityFolder, }; +// because of the nature of bitsets, the largest possible object-type is 31 /// \brief A bitset of IkarusObjectType%s. -enum ObjectTypes { +enum IkarusObjectTypes { /// \brief No object type. IkarusObjectTypes_None = 0, /// \brief An IkarusBlueprint. @@ -58,6 +59,15 @@ enum ObjectTypes { IkarusObjectTypes_EntityFolder = 1 << IkarusObjectType_EntityFolder, }; +/// \brief Converts an IkarusFolderType to an IkarusObjectType. +/// \param type The IkarusFolderType to convert. +/// \return The converted IkarusObjectType, representing the folder type. +IKA_API IkarusObjectType ikarus_folder_type_to_object_type(IkarusFolderType type); +/// \brief Converts an IkarusObjectType to a bitset of IkarusObjectTypes. +/// \param type The IkarusObjectType to convert. +/// \return The converted IkarusObjectTypes, representing the object type. +IKA_API IkarusObjectTypes ikarus_object_type_to_bitset(IkarusObjectType type); + // @} -IKARUS_END_HEADER \ No newline at end of file +IKARUS_END_HEADER diff --git a/src/types/object_type.cpp b/src/types/object_type.cpp new file mode 100644 index 0000000..7f5e377 --- /dev/null +++ b/src/types/object_type.cpp @@ -0,0 +1,32 @@ +#include + +#include + +IkarusObjectType ikarus_folder_type_to_object_type(IkarusFolderType type) { + return static_cast(type); +} + +IkarusObjectTypes ikarus_object_type_to_bitset(IkarusObjectType type) { + if (type == 0) { + return static_cast(0); + } + + return static_cast(1 << type); +} + +TEST_CASE("folder_to_object_type_conversion", "[object_type]") { + REQUIRE(ikarus_folder_type_to_object_type(IkarusFolderType_None) == IkarusObjectType_None); + REQUIRE(ikarus_folder_type_to_object_type(IkarusFolderType_BlueprintFolder) == IkarusObjectType_BlueprintFolder); + REQUIRE(ikarus_folder_type_to_object_type(IkarusFolderType_PropertyFolder) == IkarusObjectType_PropertyFolder); + REQUIRE(ikarus_folder_type_to_object_type(IkarusFolderType_EntityFolder) == IkarusObjectType_EntityFolder); +} + +TEST_CASE("object_type_to_bitset_conversion", "[object_type]") { + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_None) == IkarusObjectTypes_None); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_Blueprint) == IkarusObjectTypes_Blueprint); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_Property) == IkarusObjectTypes_Property); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_Entity) == IkarusObjectTypes_Entity); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_BlueprintFolder) == IkarusObjectTypes_BlueprintFolder); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_PropertyFolder) == IkarusObjectTypes_PropertyFolder); + REQUIRE(ikarus_object_type_to_bitset(IkarusObjectType_EntityFolder) == IkarusObjectTypes_EntityFolder); +}