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
5
#include "
DataStorage/CommonTypes.h
"
6
#include "
Elements/Framework/TypedElementQueryCapabilities.h
"
7
#include "
Elements/Framework/TypedElementQueryContract.h
"
8
#include "
Elements/Framework/TypedElementQueryFunctionArgumentTypes.h
"
9
10
namespace
UE::Editor::DataStorage::Queries::Private
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
19
struct
ForwardTesterBase
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
<>
35
struct
TForwarder
<> :
FQueryContext
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
84
#include "
Elements/Framework/TypedElementQueryCapabilities.inl
"
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
CommonTypes.h
ETextHistoryType::Base
@ Base
TypedElementQueryCapabilities.h
TypedElementQueryCapabilities.inl
TypedElementQueryContract.h
TypedElementQueryFunctionArgumentTypes.h
UE::Editor::DataStorage::Queries::Private
Definition
TypedElementQueryBuilder.cpp:566
UE::Editor::DataStorage::Queries::IContextContract
Definition
TypedElementQueryContract.h:113
UE::Editor::DataStorage::Queries::Private::FQueryContext
Definition
TypedElementQueryCapabilityForwarder.h:17
UE::Editor::DataStorage::Queries::Private::ForwardTesterBase
Definition
TypedElementQueryCapabilityForwarder.h:20
UE::Editor::DataStorage::Queries::Private::ForwardTesterBase::~ForwardTesterBase
virtual ~ForwardTesterBase()=default
UE::Editor::DataStorage::Queries::Private::TForwarder<>::TForwarder
TForwarder(IContextContract &Contract)
Definition
TypedElementQueryCapabilityForwarder.h:38
UE::Editor::DataStorage::Queries::Private::TForwarder<>::TForwarder
TForwarder()=default
UE::Editor::DataStorage::Queries::Private::TForwarder
Definition
TypedElementQueryCapabilityForwarder.h:25
Engine
Source
Runtime
TypedElementFramework
Public
Elements
Framework
TypedElementQueryCapabilityForwarder.h
Generated by
1.9.8