UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TypedElementQueryCapabilityForwarder.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
9
11{
12 // Class fragments use to composite a class that forwards its calls to the query context contract.
13 // If the forwarder contains any virtual calls, the forwarder won't be fully inlined and will add an additional pointer dereference
14 // to each call. To avoid this, the forwarder doesn't directly inherit from the capability interfaces. Static asserts are added
15 // to verify that the implementation is complete.
16
17 struct FQueryContext {};
18
20 {
21 virtual ~ForwardTesterBase() = default;
22 };
23
24 template<typename... Capabilities> struct TForwarder
25 {
26 static_assert(sizeof...(Capabilities) < 0,
27 "Specialization for query context forwards missing. The most likely reason is the addition of a new query "
28 "context capability that wasn't specialized.");
29 };
30
31 template<typename Base, typename...Capabilities>
32 struct TForwarder<Base, Capabilities...> : Base, TForwarder<Capabilities...>{};
33
34 template<>
36 {
37 TForwarder() = default;
38 explicit TForwarder(IContextContract& Contract) : Contract(&Contract) {}
39
40 protected:
41 IContextContract* Contract = nullptr;
42 };
43
44#define ArgTypeName(Type, Name) Type Name
45#define ArgName(Type, Name) Name
46
47#define Function0(Capability, Return, Function) Return Function() \
48 { return this->Contract-> Function (); }
49#define Function1(Capability, Return, Function, Arg1) Return Function(ArgTypeName Arg1 ) \
50 { return this->Contract-> Function (ArgName Arg1 ); }
51#define Function2(Capability, Return, Function, Arg1, Arg2) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 ) \
52 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 ); }
53#define Function3(Capability, Return, Function, Arg1, Arg2, Arg3) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 , ArgTypeName Arg3 ) \
54 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 , ArgName Arg3); }
55#define Function4(Capability, Return, Function, Arg1, Arg2, Arg3, Arg4) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 , ArgTypeName Arg3 , ArgTypeName Arg4 ) \
56 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 , ArgName Arg3 , ArgName Arg4); }
57
58#define ConstFunction0(Capability, Return, Function) Return Function() const \
59 { return this->Contract-> Function (); }
60#define ConstFunction1(Capability, Return, Function, Arg1) Return Function(ArgTypeName Arg1 ) const \
61 { return this->Contract-> Function (ArgName Arg1 ); }
62#define ConstFunction2(Capability, Return, Function, Arg1, Arg2) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 ) const \
63 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 ); }
64#define ConstFunction3(Capability, Return, Function, Arg1, Arg2, Arg3) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 , ArgTypeName Arg3 ) const \
65 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 , ArgName Arg3); }
66#define ConstFunction4(Capability, Return, Function, Arg1, Arg2, Arg3, Arg4) Return Function(ArgTypeName Arg1 , ArgTypeName Arg2 , ArgTypeName Arg3 , ArgTypeName Arg4 ) const \
67 { return this->Contract-> Function (ArgName Arg1 , ArgName Arg2 , ArgName Arg3 , ArgName Arg4); }
68
69#define CapabilityStart(Capability, Flags) \
70 template<typename... Capabilities> \
71 struct TForwarder< Capability , Capabilities...> : TForwarder<Capabilities...> \
72 { \
73 TForwarder() = default; \
74 explicit TForwarder(IContextContract& Contract) : TForwarder<Capabilities...>(Contract) {}
75
76#define CapabilityEnd(Capability) \
77 }; \
78 struct Capability##Forwarder : TForwarder< Capability , I##Capability <ForwardTesterBase>> {}; \
79 static_assert(!std::is_abstract_v<Capability##Forwarder>, \
80 "One or more functions are not implemented in the " #Capability " forwarder.");
81
82#define WithWrappers 1
83
85
86#undef ArgTypeName
87#undef ArgName
88#undef Function0
89#undef Function1
90#undef Function2
91#undef Function3
92#undef Function4
93#undef ConstFunction0
94#undef ConstFunction1
95#undef ConstFunction2
96#undef ConstFunction3
97#undef ConstFunction4
98#undef CapabilityStart
99#undef CapabilityEnd
100#undef WithWrappers
101} // namespace UE::Editor::DataStorage::Queries::Private
Definition TypedElementQueryBuilder.cpp:566
Definition TypedElementQueryContract.h:113
Definition TypedElementQueryCapabilityForwarder.h:17
Definition TypedElementQueryCapabilityForwarder.h:20
TForwarder(IContextContract &Contract)
Definition TypedElementQueryCapabilityForwarder.h:38
Definition TypedElementQueryCapabilityForwarder.h:25