Refureku v2.2.0
C++17 runtime reflection library.
Database.h
1
8#pragma once
9
10#include "Refureku/Config.h"
11#include "Refureku/Misc/Pimpl.h"
12#include "Refureku/Misc/Visitor.h"
13#include "Refureku/Misc/Predicate.h"
14#include "Refureku/Containers/Vector.h"
15#include "Refureku/TypeInfo/Variables/EVarFlags.h"
16#include "Refureku/TypeInfo/Functions/EFunctionFlags.h"
17#include "Refureku/TypeInfo/Functions/FunctionHelper.h"
18
19namespace rfk
20{
21 //Forward declarations
22 class Entity;
23 class Namespace;
25 class Archetype;
26 class Struct;
27 using Class = Struct;
28 class Enum;
30 class Variable;
31 class Function;
32 class Method;
33 class StaticMethod;
34 class Field;
35 class StaticField;
36 class EnumValue;
37
38 namespace internal
39 {
40 class DefaultEntityRegistererImpl;
41 class ArchetypeRegistererImpl;
42 class NamespaceFragmentRegistererImpl;
43 class ClassTemplateInstantiationRegistererImpl;
44 }
45
46 class Database final
47 {
48 public:
49 REFUREKU_INTERNAL Database() noexcept;
50 Database(Database const&) = delete;
51 Database(Database&&) = delete;
52 REFUREKU_INTERNAL ~Database() noexcept;
53
61 RFK_NODISCARD REFUREKU_API
62 Entity const* getEntityById(std::size_t id) const noexcept;
63
71 RFK_NODISCARD REFUREKU_API
72 Namespace const* getNamespaceById(std::size_t id) const noexcept;
73
85 RFK_NODISCARD REFUREKU_API
86 Namespace const* getNamespaceByName(char const* name) const;
87
98 RFK_NODISCARD REFUREKU_API
100 void* userData) const;
101
112 RFK_NODISCARD REFUREKU_API
114 void* userData) const;
115
128 void* userData) const;
129
135 REFUREKU_API std::size_t getFileLevelNamespacesCount() const noexcept;
136
144 RFK_NODISCARD REFUREKU_API
145 Archetype const* getArchetypeById(std::size_t id) const noexcept;
146
156 RFK_NODISCARD REFUREKU_API
157 Archetype const* getFileLevelArchetypeByName(char const* name) const noexcept;
158
169 RFK_NODISCARD REFUREKU_API
171 void* userData) const;
172
180 RFK_NODISCARD REFUREKU_API
181 Struct const* getStructById(std::size_t id) const noexcept;
182
190 RFK_NODISCARD REFUREKU_API
191 Struct const* getFileLevelStructByName(char const* name) const noexcept;
192
203 RFK_NODISCARD REFUREKU_API
205 void* userData) const;
206
217 RFK_NODISCARD REFUREKU_API
219 void* userData) const;
220
232 REFUREKU_API bool foreachFileLevelStruct(Visitor<Struct> visitor,
233 void* userData) const;
234
240 REFUREKU_API std::size_t getFileLevelStructsCount() const noexcept;
241
249 RFK_NODISCARD REFUREKU_API
250 Class const* getClassById(std::size_t id) const noexcept;
251
259 RFK_NODISCARD REFUREKU_API
260 Class const* getFileLevelClassByName(char const* name) const noexcept;
261
272 RFK_NODISCARD REFUREKU_API
274 void* userData) const;
275
286 RFK_NODISCARD REFUREKU_API
288 void* userData) const;
289
301 REFUREKU_API bool foreachFileLevelClass(Visitor<Class> visitor,
302 void* userData) const;
303
309 REFUREKU_API std::size_t getFileLevelClassesCount() const noexcept;
310
318 RFK_NODISCARD REFUREKU_API
319 Enum const* getEnumById(std::size_t id) const noexcept;
320
328 RFK_NODISCARD REFUREKU_API
329 Enum const* getFileLevelEnumByName(char const* name) const noexcept;
330
341 RFK_NODISCARD REFUREKU_API
343 void* userData) const;
344
355 RFK_NODISCARD REFUREKU_API
357 void* userData) const;
358
370 REFUREKU_API bool foreachFileLevelEnum(Visitor<Enum> visitor,
371 void* userData) const;
372
378 REFUREKU_API std::size_t getFileLevelEnumsCount() const noexcept;
379
387 RFK_NODISCARD REFUREKU_API
388 FundamentalArchetype const* getFundamentalArchetypeById(std::size_t id) const noexcept;
389
397 RFK_NODISCARD REFUREKU_API
398 FundamentalArchetype const* getFundamentalArchetypeByName(char const* name) const noexcept;
399
407 RFK_NODISCARD REFUREKU_API
408 Variable const* getVariableById(std::size_t id) const noexcept;
409
419 RFK_NODISCARD REFUREKU_API
420 Variable const* getFileLevelVariableByName(char const* name,
421 EVarFlags flags = EVarFlags::Default) const noexcept;
422
433 RFK_NODISCARD REFUREKU_API
435 void* userData) const;
436
447 RFK_NODISCARD REFUREKU_API
449 void* userData) const;
450
462 REFUREKU_API bool foreachFileLevelVariable(Visitor<Variable> visitor,
463 void* userData) const;
464
470 REFUREKU_API std::size_t getFileLevelVariablesCount() const noexcept;
471
479 RFK_NODISCARD REFUREKU_API
480 Function const* getFunctionById(std::size_t id) const noexcept;
481
491 template <typename FunctionSignature>
492 RFK_NODISCARD Function const* getFileLevelFunctionByName(char const* name,
493 EFunctionFlags flags = EFunctionFlags::Default) const noexcept;
494
504 RFK_NODISCARD REFUREKU_API
505 Function const* getFileLevelFunctionByName(char const* name,
506 EFunctionFlags flags = EFunctionFlags::Default) const noexcept;
507
517 RFK_NODISCARD REFUREKU_API
519 EFunctionFlags flags = EFunctionFlags::Default) const noexcept;
520
531 RFK_NODISCARD REFUREKU_API
533 void* userData) const;
534
545 RFK_NODISCARD REFUREKU_API
547 void* userData) const;
548
560 REFUREKU_API bool foreachFileLevelFunction(Visitor<Function> visitor,
561 void* userData) const;
562
568 REFUREKU_API std::size_t getFileLevelFunctionsCount() const noexcept;
569
577 RFK_NODISCARD REFUREKU_API
578 Method const* getMethodById(std::size_t id) const noexcept;
579
587 RFK_NODISCARD REFUREKU_API
588 StaticMethod const* getStaticMethodById(std::size_t id) const noexcept;
589
597 RFK_NODISCARD REFUREKU_API
598 Field const* getFieldById(std::size_t id) const noexcept;
599
607 RFK_NODISCARD REFUREKU_API
608 StaticField const* getStaticFieldById(std::size_t id) const noexcept;
609
617 RFK_NODISCARD REFUREKU_API
618 EnumValue const* getEnumValueById(std::size_t id) const noexcept;
619
620 private:
621 //Forward declaration
622 class DatabaseImpl;
623
625 Pimpl<DatabaseImpl> _pimpl;
626
633 REFUREKU_API static Database& getInstance() noexcept;
634
635 friend internal::DefaultEntityRegistererImpl;
636 friend internal::ArchetypeRegistererImpl;
637 friend internal::NamespaceFragmentRegistererImpl;
638 friend NamespaceFragment;
639 friend internal::ClassTemplateInstantiationRegistererImpl;
640 friend REFUREKU_API Database const& getDatabase() noexcept;
641 };
642
648 REFUREKU_API Database const& getDatabase() noexcept;
649
650 #include "Refureku/TypeInfo/Database.inl"
651}
Definition: Archetype.h:16
Definition: Database.h:47
RFK_NODISCARD REFUREKU_API Method const * getMethodById(std::size_t id) const noexcept
Retrieve a method by id.
REFUREKU_API bool foreachFileLevelVariable(Visitor< Variable > visitor, void *userData) const
Execute the given visitor on all file level variables.
RFK_NODISCARD REFUREKU_API Variable const * getVariableById(std::size_t id) const noexcept
Retrieve a variable by id.
RFK_NODISCARD REFUREKU_API Function const * getFileLevelFunctionByPredicate(Predicate< Function > predicate, void *userData) const
Retrieve the first file level function satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Namespace const * getNamespaceById(std::size_t id) const noexcept
Retrieve a namespace by id.
RFK_NODISCARD REFUREKU_API StaticField const * getStaticFieldById(std::size_t id) const noexcept
Retrieve a static field by id.
RFK_NODISCARD REFUREKU_API Namespace const * getFileLevelNamespaceByPredicate(Predicate< Namespace > predicate, void *userData) const
Retrieve the first file level namespace satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Vector< Archetype const * > getFileLevelArchetypesByPredicate(Predicate< Archetype > predicate, void *userData) const
Retrieve all file level archetypes satisfying the provided predicate.
REFUREKU_API bool foreachFileLevelStruct(Visitor< Struct > visitor, void *userData) const
Execute the given visitor on all file level structs.
REFUREKU_API bool foreachFileLevelEnum(Visitor< Enum > visitor, void *userData) const
Execute the given visitor on all file level enums.
RFK_NODISCARD REFUREKU_API Archetype const * getArchetypeById(std::size_t id) const noexcept
Retrieve an archetype by id.
REFUREKU_API std::size_t getFileLevelClassesCount() const noexcept
Get the number of reflected file level classes in the database.
REFUREKU_API bool foreachFileLevelNamespace(Visitor< Namespace > visitor, void *userData) const
Execute the given visitor on all file level namespaces.
RFK_NODISCARD REFUREKU_API Vector< Function const * > getFileLevelFunctionsByPredicate(Predicate< Function > predicate, void *userData) const
Retrieve all file level functions satisfying the provided predicate.
REFUREKU_API std::size_t getFileLevelStructsCount() const noexcept
Get the number of reflected file level structs in the database.
RFK_NODISCARD REFUREKU_API Enum const * getFileLevelEnumByPredicate(Predicate< Enum > predicate, void *userData) const
Retrieve the first file level enum satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Entity const * getEntityById(std::size_t id) const noexcept
Retrieve an entity by id.
RFK_NODISCARD REFUREKU_API Archetype const * getFileLevelArchetypeByName(char const *name) const noexcept
Retrieve a file level archetype by name. This method costs heavier performance as it will basically c...
RFK_NODISCARD REFUREKU_API Struct const * getFileLevelStructByName(char const *name) const noexcept
Retrieve a file level struct by name.
RFK_NODISCARD REFUREKU_API Vector< Function const * > getFileLevelFunctionsByName(char const *name, EFunctionFlags flags=EFunctionFlags::Default) const noexcept
Retrieve all file level functions by name.
RFK_NODISCARD REFUREKU_API Vector< Variable const * > getFileLevelVariablesByPredicate(Predicate< Variable > predicate, void *userData) const
Retrieve all file level variables satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API FundamentalArchetype const * getFundamentalArchetypeByName(char const *name) const noexcept
Retrieve a fundamental archetype by name.
RFK_NODISCARD REFUREKU_API Function const * getFunctionById(std::size_t id) const noexcept
Retrieve a function by id.
RFK_NODISCARD REFUREKU_API Class const * getFileLevelClassByName(char const *name) const noexcept
Retrieve a file level class by name.
REFUREKU_API bool foreachFileLevelFunction(Visitor< Function > visitor, void *userData) const
Execute the given visitor on all file level functions.
REFUREKU_API std::size_t getFileLevelEnumsCount() const noexcept
Get the number of reflected file level classes in the database.
friend REFUREKU_API Database const & getDatabase() noexcept
Get a reference to the database of this program.
RFK_NODISCARD REFUREKU_API Namespace const * getNamespaceByName(char const *name) const
Retrieve a namespace by name. Can search nested namespaces directly using :: separator....
RFK_NODISCARD REFUREKU_API Field const * getFieldById(std::size_t id) const noexcept
Retrieve a field by id.
RFK_NODISCARD REFUREKU_API Vector< Namespace const * > getFileLevelNamespacesByPredicate(Predicate< Namespace > predicate, void *userData) const
Retrieve all file level namespaces satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Vector< Enum const * > getFileLevelEnumsByPredicate(Predicate< Enum > predicate, void *userData) const
Retrieve all file level enums satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Struct const * getFileLevelStructByPredicate(Predicate< Struct > predicate, void *userData) const
Retrieve the first level struct satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Vector< Struct const * > getFileLevelStructsByPredicate(Predicate< Struct > predicate, void *userData) const
Retrieve all file level structs satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API EnumValue const * getEnumValueById(std::size_t id) const noexcept
Retrieve an enum value by id.
REFUREKU_API std::size_t getFileLevelFunctionsCount() const noexcept
Get the number of reflected file level functions in the database.
RFK_NODISCARD Function const * getFileLevelFunctionByName(char const *name, EFunctionFlags flags=EFunctionFlags::Default) const noexcept
Retrieve a file level function by name and signature.
RFK_NODISCARD REFUREKU_API StaticMethod const * getStaticMethodById(std::size_t id) const noexcept
Retrieve a static method by id.
RFK_NODISCARD REFUREKU_API Struct const * getStructById(std::size_t id) const noexcept
Retrieve a struct by id.
RFK_NODISCARD REFUREKU_API Variable const * getFileLevelVariableByPredicate(Predicate< Variable > predicate, void *userData) const
Retrieve the first file level variable satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Variable const * getFileLevelVariableByName(char const *name, EVarFlags flags=EVarFlags::Default) const noexcept
Retrieve a file level (non-member) variable by name.
REFUREKU_API bool foreachFileLevelClass(Visitor< Class > visitor, void *userData) const
Execute the given visitor on all file level classes.
REFUREKU_API std::size_t getFileLevelVariablesCount() const noexcept
Get the number of reflected file level variables in the database.
RFK_NODISCARD REFUREKU_API FundamentalArchetype const * getFundamentalArchetypeById(std::size_t id) const noexcept
Retrieve a fundamental archetype by id.
RFK_NODISCARD REFUREKU_API Class const * getFileLevelClassByPredicate(Predicate< Class > predicate, void *userData) const
Retrieve the first level struct satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Class const * getClassById(std::size_t id) const noexcept
Retrieve a class by id.
RFK_NODISCARD REFUREKU_API Vector< Class const * > getFileLevelClassesByPredicate(Predicate< Class > predicate, void *userData) const
Retrieve all file level classes satisfying the provided predicate.
RFK_NODISCARD REFUREKU_API Enum const * getEnumById(std::size_t id) const noexcept
Retrieve an enum by id.
REFUREKU_API std::size_t getFileLevelNamespacesCount() const noexcept
Get the number of reflected file level namespaces in the database.
RFK_NODISCARD REFUREKU_API Enum const * getFileLevelEnumByName(char const *name) const noexcept
Retrieve a file level enum by name.
Definition: Entity.h:29
Definition: Enum.h:18
Definition: EnumValue.h:19
Definition: Field.h:18
Definition: Function.h:17
Definition: FundamentalArchetype.h:15
Definition: Method.h:24
Definition: NamespaceFragment.h:18
Definition: Namespace.h:26
Definition: Pimpl.h:20
Definition: StaticField.h:19
Definition: StaticMethod.h:16
Definition: Struct.h:40
Definition: Variable.h:16
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
EFunctionFlags
Definition: EFunctionFlags.h:17
bool(*)(T const &value, void *userData) Visitor
Visitor function.
Definition: Visitor.h:21
EVarFlags
Definition: EVarFlags.h:16