UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VVMNativeTuple.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Templates/UnrealTemplate.h" // Forward
7
8namespace Verse
9{
10
11/* Verse tuple struct template used for accessing native C++ tuples
12
13Usage examples:
14
15Verse::TNativeTuple<int64, double> MultiResultVTuple()
16{
17 Verse::TNativeTuple<int64, double> TupID = {123, 42.0}; // Create using initializer list
18 int64 Elem0 = TupID.Get<0>(); // Copy value
19 double& Elem1 = TupID.Get<1>(); // Reference value
20
21 TupID.Get<0>() = 4321; // In-place element assignment
22 Elem1 = 5678.0; // Alter referenced element
23
24 return {42, 123.0}; // return using initializer list
25}
26*/
27
28//-------------------------------------------------------------------------------------------------
29// Verse native tuple struct - unspecialized
30template <typename... Types>
32
33//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34// Helper for tuple element accessor
35template <size_t Idx, typename Type>
37
38//-------------------------------------------------------------------------------------------------
39// Verse native tuple - empty specialization
40template <>
42{
43};
44
45//-------------------------------------------------------------------------------------------------
46// Singly typed tuple - this is important to provide so that sizeof(TNativeTuple<float>) == sizeof(float),
47// otherwise if the below tuple definition is used, we get sizeof(TNativeTuple<float>) == sizeof(float) + sizeof(TNativeTuple<>)
48template <typename Type>
50{
52
53 TNativeTuple() = default;
54
55 TNativeTuple(const Type& Arg)
56 : First(Arg)
57 {
58 }
59
62 : First(Forward<TArg>(Arg))
63 {
64 }
65
66 template <size_t Idx>
67 constexpr auto& Get()
68 {
69 return TGetTupleElem<Idx, TNativeTuple<Type>>::Get(*this);
70 }
71
72 template <size_t Idx>
73 constexpr const auto& Get() const
74 {
75 return TGetTupleElem<Idx, TNativeTuple<Type>>::Get(*this);
76 }
77
78 friend bool operator==(const TNativeTuple<Type>& Lhs, const TNativeTuple<Type>& Rhs)
79 {
80 return Lhs.First == Rhs.First;
81 }
82 friend bool operator!=(const TNativeTuple<Type>& Lhs, const TNativeTuple<Type>& Rhs)
83 {
84 return !(Lhs == Rhs);
85 }
86};
87
88//-------------------------------------------------------------------------------------------------
89// Recursively defined tuple
90template <typename Type, typename... RestTypes>
92{
93 // Use the Get<idx>() accessors rather than these data members directly - they may change
94 // Note that order is important to ensure Elem0, Elem1, ... ElemN
95 // It must match the structure layout expected by the BP VM
98
99 TNativeTuple() = default;
100
101 TNativeTuple(const Type& Arg, const RestTypes&... Args)
102 : First(Arg)
103 , Rest(Args...)
104 {
105 }
106
107 template <typename TArg, typename... TArgs, typename = typename TEnableIf<sizeof...(RestTypes) == sizeof...(TArgs)>::Type>
108 TNativeTuple(TArg&& Arg, TArgs&&... Args)
109 : First(Forward<TArg>(Arg))
110 , Rest(Forward<TArgs>(Args)...)
111 {
112 }
113
114 template <typename OtherType, typename... OtherRestTypes, typename = typename TEnableIf<sizeof...(RestTypes) == sizeof...(OtherRestTypes)>::Type>
120
121 // Get reference to element 0 .. N - can also be used for assignment
122 // Value = MyTuple.Get<0>; MyTuple.Get<3> = NewValue;
123 template <size_t Idx>
124 constexpr auto& Get()
125 {
126 return TGetTupleElem<Idx, TNativeTuple<Type, RestTypes...>>::Get(*this);
127 }
128
129 // Get const reference to element 0 .. N
130 // Value = MyTuple.Get<3>;
131 template <size_t Idx>
132 constexpr const auto& Get() const
133 {
134 return TGetTupleElem<Idx, TNativeTuple<Type, RestTypes...>>::Get(*this);
135 }
136
138 {
139 return Lhs.First == Rhs.First && Lhs.Rest == Rhs.Rest;
140 }
142 {
143 return !(Lhs == Rhs);
144 }
145};
146
147//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
148// Helper for tuple element accessor - Zeroth specialization
149template <typename Type, typename... RestTypes>
151{
153 {
154 return Data.First;
155 }
156
157 constexpr static const Type& Get(const TNativeTuple<Type, RestTypes...>& Data)
158 {
159 return Data.First;
160 }
161};
162
163//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
164// Helper for tuple element accessor - recursive definition
165template <size_t Idx, typename Type, typename... RestTypes>
167{
168 constexpr static decltype(auto) Get(TNativeTuple<Type, RestTypes...>& Data)
169 {
170 return TGetTupleElem<Idx - 1, TNativeTuple<RestTypes...>>::Get(Data.Rest);
171 }
172
173 constexpr static decltype(auto) Get(const TNativeTuple<Type, RestTypes...>& Data)
174 {
175 return TGetTupleElem<Idx - 1, TNativeTuple<RestTypes...>>::Get(Data.Rest);
176 }
177};
178
179} // namespace Verse
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition EnableIf.h:20
Definition Archive.h:36
static constexpr const Type & Get(const TNativeTuple< Type, RestTypes... > &Data)
Definition VVMNativeTuple.h:157
static constexpr Type & Get(TNativeTuple< Type, RestTypes... > &Data)
Definition VVMNativeTuple.h:152
static constexpr decltype(auto) Get(TNativeTuple< Type, RestTypes... > &Data)
Definition VVMNativeTuple.h:168
static constexpr decltype(auto) Get(const TNativeTuple< Type, RestTypes... > &Data)
Definition VVMNativeTuple.h:173
Definition VVMNativeTuple.h:36
friend bool operator==(const TNativeTuple< Type, RestTypes... > &Lhs, const TNativeTuple< Type, RestTypes... > &Rhs)
Definition VVMNativeTuple.h:137
TNativeTuple(const Type &Arg, const RestTypes &... Args)
Definition VVMNativeTuple.h:101
TNativeTuple< RestTypes... > Rest
Definition VVMNativeTuple.h:97
TNativeTuple(const TNativeTuple< OtherType, OtherRestTypes... > &Other)
Definition VVMNativeTuple.h:115
Type First
Definition VVMNativeTuple.h:96
friend bool operator!=(const TNativeTuple< Type, RestTypes... > &Lhs, const TNativeTuple< Type, RestTypes... > &Rhs)
Definition VVMNativeTuple.h:141
constexpr auto & Get()
Definition VVMNativeTuple.h:124
constexpr const auto & Get() const
Definition VVMNativeTuple.h:132
TNativeTuple(TArg &&Arg, TArgs &&... Args)
Definition VVMNativeTuple.h:108
TNativeTuple(TArg &&Arg)
Definition VVMNativeTuple.h:61
Type First
Definition VVMNativeTuple.h:51
constexpr auto & Get()
Definition VVMNativeTuple.h:67
friend bool operator!=(const TNativeTuple< Type > &Lhs, const TNativeTuple< Type > &Rhs)
Definition VVMNativeTuple.h:82
TNativeTuple(const Type &Arg)
Definition VVMNativeTuple.h:55
friend bool operator==(const TNativeTuple< Type > &Lhs, const TNativeTuple< Type > &Rhs)
Definition VVMNativeTuple.h:78
constexpr const auto & Get() const
Definition VVMNativeTuple.h:73
Definition VVMNativeTuple.h:31