Refureku v2.2.0
C++17 runtime reflection library.
Entity.h
1
8#pragma once
9
10#include <cstddef> //std::size_t
11#include <type_traits>
12
13#include "Refureku/Config.h"
14#include "Refureku/Misc/Pimpl.h"
15#include "Refureku/Misc/GetPimplMacro.h"
16#include "Refureku/TypeInfo/Entity/EEntityKind.h"
17#include "Refureku/Properties/Property.h"
18#include "Refureku/Misc/Visitor.h"
19#include "Refureku/Misc/Predicate.h"
20#include "Refureku/Containers/Vector.h"
21
22namespace rfk
23{
24 //Forward declarations
25 class Struct;
26 class Algorithm;
27
28 class Entity
29 {
30 public:
31 Entity(Entity const&) = delete;
32
41 RFK_NODISCARD REFUREKU_API
42 Property const* getPropertyAt(std::size_t propertyIndex) const noexcept;
43
54 template <typename PropertyType, typename = std::enable_if_t<std::is_base_of_v<Property, PropertyType> && !std::is_same_v<PropertyType, Property>>>
55 RFK_NODISCARD
56 PropertyType const* getProperty(bool isChildClassValid = true) const noexcept;
57
66 RFK_NODISCARD REFUREKU_API
67 Property const* getProperty(Struct const& archetype,
68 bool isChildClassValid = true) const noexcept;
69
77 RFK_NODISCARD REFUREKU_API
78 Property const* getPropertyByName(char const* name) const noexcept;
79
90 RFK_NODISCARD REFUREKU_API
92 void* userData) const;
93
104 template <typename PropertyType, typename = std::enable_if_t<std::is_base_of_v<Property, PropertyType> && !std::is_same_v<PropertyType, Property>>>
105 RFK_NODISCARD
106 Vector<PropertyType const*> getProperties(bool isChildClassValid = true) const noexcept;
107
116 RFK_NODISCARD REFUREKU_API
117 Vector<Property const*> getProperties(Struct const& archetype,
118 bool isChildClassValid = true) const noexcept;
119
127 RFK_NODISCARD REFUREKU_API
128 Vector<Property const*> getPropertiesByName(char const* name) const noexcept;
129
140 RFK_NODISCARD REFUREKU_API
142 void* userData) const;
143
149 RFK_NODISCARD REFUREKU_API
150 std::size_t getPropertiesCount() const noexcept;
151
163 REFUREKU_API bool foreachProperty(Visitor<Property> visitor,
164 void* userData) const;
165
171 RFK_NODISCARD REFUREKU_API
172 char const* getName() const noexcept;
173
180 RFK_NODISCARD REFUREKU_API
181 bool hasSameName(char const* name) const noexcept;
182
188 RFK_NODISCARD REFUREKU_API
189 std::size_t getId() const noexcept;
190
198 RFK_NODISCARD REFUREKU_API
199 EEntityKind getKind() const noexcept;
200
208 RFK_NODISCARD REFUREKU_API
209 Entity const* getOuterEntity() const noexcept;
210
219 REFUREKU_API bool addProperty(Property const& property) noexcept;
220
226 REFUREKU_API void setOuterEntity(Entity const* outerEntity) noexcept;
227
235 REFUREKU_API void setPropertiesCapacity(std::size_t capacity) noexcept;
236
237
238 Entity& operator=(Entity const&) = delete;
239 Entity& operator=(Entity&&) = delete;
240
241 RFK_NODISCARD REFUREKU_API bool operator==(Entity const& other) const noexcept;
242 RFK_NODISCARD REFUREKU_API bool operator!=(Entity const& other) const noexcept;
243
244 protected:
245 //Forward declaration
246 class EntityImpl;
247
248 REFUREKU_INTERNAL Entity(Entity&&) noexcept;
249 REFUREKU_INTERNAL Entity(EntityImpl* implementation) noexcept;
250 REFUREKU_INTERNAL ~Entity() noexcept;
251
252 RFK_GEN_GET_PIMPL(EntityImpl, _pimpl.get())
253
254 private:
256 Pimpl<EntityImpl> _pimpl;
257
258 friend Algorithm;
259 };
260
261 #include "Refureku/TypeInfo/Entity/Entity.inl"
262}
Definition: Entity.h:29
RFK_NODISCARD PropertyType const * getProperty(bool isChildClassValid=true) const noexcept
Retrieve a property of a given type from this entity.
RFK_NODISCARD REFUREKU_API Property const * getPropertyAt(std::size_t propertyIndex) const noexcept
Retrieve the property at the given index. If propertyIndex is greater or equal to the properties coun...
REFUREKU_API void setOuterEntity(Entity const *outerEntity) noexcept
Setter for the field _outerEntity.
RFK_NODISCARD REFUREKU_API Property const * getPropertyByName(char const *name) const noexcept
Retrieve the first property named with the provided name.
RFK_NODISCARD REFUREKU_API char const * getName() const noexcept
Get the name of the entity.
REFUREKU_API bool foreachProperty(Visitor< Property > visitor, void *userData) const
Execute the given visitor on all properties attached to this entity.
RFK_NODISCARD REFUREKU_API Vector< Property const * > getPropertiesByName(char const *name) const noexcept
Retrieve all properties named with the provided name.
RFK_NODISCARD REFUREKU_API Entity const * getOuterEntity() const noexcept
Get the outer entity of the entity. It basically corresponds to the entity this entity was declared i...
RFK_NODISCARD Vector< PropertyType const * > getProperties(bool isChildClassValid=true) const noexcept
Retrieve all properties matching with the provided archetype. If PropertyType uses multiple inheritan...
RFK_NODISCARD REFUREKU_API Vector< Property const * > getPropertiesByPredicate(Predicate< Property > predicate, void *userData) const
Retrieve all properties matching with a predicate in this entity.
RFK_NODISCARD REFUREKU_API bool hasSameName(char const *name) const noexcept
Check that this entity has the same name as the provided string.
REFUREKU_API bool addProperty(Property const &property) noexcept
Add a property to this entity.
REFUREKU_API void setPropertiesCapacity(std::size_t capacity) noexcept
Set the number of properties for this entity. Useful to avoid reallocations when adding a lot of prop...
RFK_NODISCARD REFUREKU_API Property const * getPropertyByPredicate(Predicate< Property > predicate, void *userData) const
Retrieve a property matching with a predicate.
RFK_NODISCARD REFUREKU_API std::size_t getId() const noexcept
Get the program-unique id of the entity.
RFK_NODISCARD REFUREKU_API std::size_t getPropertiesCount() const noexcept
Get the number of properties attached to this entity.
RFK_NODISCARD REFUREKU_API EEntityKind getKind() const noexcept
Get the kind of the entity. Knowing the kind allows to safely cast to child classes....
Definition: Pimpl.h:20
Base class to inherit from to define new properties.
Definition: Property.h:23
Definition: Struct.h:40
Definition: Vector.h:19
Definition: Allocator.h:16
bool(*)(T const &value, void *userData) Predicate
Predicate defining if a value is valid or not.
Definition: Predicate.h:21
bool(*)(T const &value, void *userData) Visitor
Visitor function.
Definition: Visitor.h:21
EEntityKind
Definition: EEntityKind.h:20