UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TypedElementQueryBuilder.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#include <tuple>
4#include <type_traits>
5#include <utility>
11
13{
14 using namespace UE::Editor::DataStorage;
15
16 namespace Private
17 {
18 // This assumes that the types are unique, but for queries this should be true and otherwise
19 // both results would point to the first found index.
20 template<typename Target, typename ArgsCurrent, typename... ArgsRemainder>
22 {
23 if constexpr (std::is_same_v<Target, ArgsCurrent>)
24 {
25 return 0;
26 }
27 else
28 {
29 return 1 + GetVarArgIndex<Target, ArgsRemainder...>();
30 }
31 }
32
33 template<typename Type>
35 {
36 using BaseType = typename std::remove_reference_t<Type>;
37 if constexpr (std::is_const_v<BaseType>)
38 {
40 }
41 else
42 {
44 }
45 }
46
47 template<typename Type>
49 {
50 using BaseType = typename std::remove_reference_t<Type>;
52
54 if constexpr (SubsystemTraits::RequiresGameThread())
55 {
57 }
58 if constexpr (SubsystemTraits::IsHotReloadable())
59 {
61 }
62 if constexpr (std::is_const_v<BaseType>)
63 {
65 }
66
67 return Result;
68 }
69 } // namespace Private
70
71 //
72 // FDependecy
73 //
74
75 template<typename... TargetTypes>
77 {
78 ReadOnly({ TargetTypes::StaticClass()... });
79 return *this;
80 }
81
82 template<typename... TargetTypes>
84 {
85 ReadWrite({ TargetTypes::StaticClass()... });
86 return *this;
87 }
88
89
90 //
91 // FObserver
92 //
93
94 template<TColumnType ColumnType>
96 {
97 return FObserver(FObserver::EEvent::Add, ColumnType::StaticStruct());
98 }
99
100 template<TColumnType ColumnType>
102 {
103 return FObserver(FObserver::EEvent::Remove, ColumnType::StaticStruct());
104 }
105
106 template<TColumnType ColumnType>
108 {
109 return SetMonitoredColumn(ColumnType::StaticStruct());
110 }
111
112
113 //
114 // FQueryContextForwarder
115 //
116
123
124 const void* FQueryContextForwarder::GetColumn(const UScriptStruct* ColumnType) const
125 {
126 return ParentContext.GetColumn(ColumnType);
127 }
128
130 {
131 return ParentContext.GetMutableColumn(ColumnType);
132 }
133
139
145
147 {
148 return ParentContext.HasColumn(ColumnType);
149 }
150
155
160
166
171
176
181
186
191
196
201
206
211
216
222
228
229 void FQueryContextForwarder::PushCommand(void(* CommandFunction)(void*), void* CommandData)
230 {
231 return ParentContext.PushCommand(CommandFunction, CommandData);
232 }
233
234 //
235 // FCachedQueryContext
236 //
237
238 template<typename... Dependencies>
244
245 template<typename... Dependencies>
247 {
248 Query.DependencyTypes.Reserve(sizeof...(Dependencies));
249 Query.DependencyFlags.Reserve(sizeof...(Dependencies));
250
251 ( Query.DependencyTypes.Emplace(Dependencies::StaticClass()), ... );
252 ( Query.DependencyFlags.Emplace(Private::GetDependencyFlags<Dependencies>()), ... );
253
254 Query.CachedDependencies.AddDefaulted(sizeof...(Dependencies));
255 }
256
257 template<typename... Dependencies>
258 template<typename Dependency>
260 {
261 // Don't allow a dependency registered as const to be found.
262 constexpr uint32 Index = Private::GetVarArgIndex<std::remove_const_t<Dependency>, Dependencies...>();
263 static_assert(Index < sizeof...(Dependencies), "Requested dependency isn't part of the query context cache.");
264 return *static_cast<Dependency*>(Description.CachedDependencies[Index].Get());
265 }
266
267 template<typename... Dependencies>
268 template<typename Dependency>
270 {
271 // Allow access to dependencies registered with and without const.
272 constexpr uint32 Index = Private::GetVarArgIndex<Dependency, Dependencies...>();
273 if constexpr (Index < sizeof...(Dependencies))
274 {
275 return *static_cast<Dependency*>(Description.CachedDependencies[Index].Get());
276 }
277 else
278 {
279 constexpr uint32 ConstIndex = Private::GetVarArgIndex<std::add_const_t<Dependency>, Dependencies...>();
280 static_assert(ConstIndex < sizeof...(Dependencies), "Requested dependency isn't part of the query context cache.");
281 return *static_cast<Dependency*>(Description.CachedDependencies[ConstIndex].Get());
282 }
283 }
284
285 //
286 // Select
287 //
288 namespace Private
289 {
290 template<typename T>
291 concept HasStaticStructMethod = requires
292 {
293 { T::StaticStruct() } -> UE::same_as<UScriptStruct*>;
294 };
295
296 template<typename Context>
297 concept SourceQueryContext = requires(Context& Ctx, int32 TypeCount, char** RetrievedAddresses,
299 {
300 { Ctx.GetColumnsUnguarded(TypeCount, RetrievedAddresses, ColumnTypes, AccessTypes) };
302 { Ctx.GetRowCount() } -> UE::convertible_to<uint32>;
303 };
304
305 template<typename Source, typename Target>
309
310 template<typename... Columns>
311 constexpr bool AreAllColumnsReferences()
312 {
313 if constexpr (sizeof...(Columns) > 0)
314 {
315 return (std::is_reference_v<Columns> && ...);
316 }
317 else
318 {
319 return true;
320 }
321 }
322
323 template<typename... Columns>
324 constexpr bool AreAllColumnsPointers()
325 {
326 if constexpr (sizeof...(Columns) > 0)
327 {
328 return (std::is_pointer_v<Columns> && ...);
329 }
330 else
331 {
332 return true;
333 }
334 }
335
336 template<typename Column>
337 using BaseColumnType = std::remove_pointer_t<std::remove_reference_t<Column>>;
338
339 template<typename Column>
340 using UndecoratedColumnType = std::remove_cv_t<BaseColumnType<Column>>;
341
342 template<typename Column>
343 constexpr bool IsValidColumnType()
344 {
345 // Do not combine these two into a single statement as that would also allow invalid arguments like "MyColumn*&"
346 if constexpr (std::is_reference_v<Column>)
347 {
348 using BaseType = typename std::remove_const_t<std::remove_reference_t<Column>>;
350 }
351 else if constexpr (std::is_pointer_v<Column>)
352 {
353 using BaseType = typename std::remove_const_t<std::remove_pointer_t<Column>>;
355 }
356 else
357 {
358 return false;
359 }
360 }
361
362 template<typename Column>
367
368 template<typename RowType>
369 concept IsRowHandleType = std::is_same_v<std::remove_cv_t<std::remove_pointer_t<RowType>>, RowHandle>;
370
371 template<typename RowType, typename... Columns>
373 {
374 if constexpr (std::is_pointer_v<RowType> && std::is_const_v<std::remove_pointer_t<RowType>>)
375 {
376 return AreAllColumnsPointers<Columns...>();
377 }
378 else
379 {
380 return AreAllColumnsReferences<Columns...>();
381 }
382 }
383
384 template<typename T> concept IsFunctor = requires{ &T::operator(); };
385
386 template<SourceQueryContext SourceContext, bool ValidateColumns, typename... ColumnTypes>
388 {
389 std::tuple<BaseColumnType<ColumnTypes>*...> Columns;
390 static constexpr bool bArePointerColumns = AreAllColumnsPointers<ColumnTypes...>();
391
392 template<typename Column>
393 bool CheckValidity(const FQueryDescription& Description)
394 {
395 const UScriptStruct* ColumnType = Column::StaticStruct();
396 if (const TWeakObjectPtr<const UScriptStruct>* Match = Description.SelectionTypes.FindByPredicate(
397 [ColumnType](const TWeakObjectPtr<const UScriptStruct>& Entry)
398 {
399 return Entry == ColumnType;
400 }); Match != nullptr)
401 {
402 size_t Index = Match - Description.SelectionTypes.GetData();
403 if (Description.SelectionAccessTypes[Index] == EQueryAccessType::ReadOnly)
404 {
405 if (std::is_const_v<Column>)
406 {
407 return true;
408 }
409 else
410 {
411 checkf(false,
412 TEXT("Provided query callback couldn't be bound because target read-only column of type '%s' is bound to a mutable reference."),
413 *ColumnType->GetName());
414 return false;
415 }
416 }
417 else
418 {
419 return true;
420 }
421 }
422 else
423 {
424 checkf(false,
425 TEXT("Provided query callback couldn't be bound because target query doesn't contain a column of type '%s'."),
426 *ColumnType->GetName());
427 return false;
428 }
429 }
430
431 FFunctionColumnInfo(const FQueryDescription& Description, SourceContext& Context)
432 {
433 if constexpr (ValidateColumns)
434 {
435 if (!(CheckValidity<BaseColumnType<ColumnTypes>>(Description) && ...))
436 {
437 return;
438 }
439 }
440
441 char* ColumnAddresses[sizeof...(ColumnTypes)];
442 Context.GetColumnsUnguarded(sizeof...(ColumnTypes), ColumnAddresses,
443 Description.SelectionTypes.GetData(), Description.SelectionAccessTypes.GetData());
444 std::apply([ColumnAddresses](auto&&... Column)
445 {
446 int Index = 0;
447 ((Column = reinterpret_cast<BaseColumnType<ColumnTypes>*>(ColumnAddresses[Index++])), ...);
448 }, Columns);
449 }
450 };
451
452 template<SourceQueryContext SourceContext, bool ValidateColumns>
454 {
455 FFunctionColumnInfo(const FQueryDescription&, SourceContext&) {}
456 static constexpr bool bArePointerColumns = false;
457 };
458
459 template<SourceQueryContext SourceType, typename TargetType>
462 {
463 using BaseContextType = std::remove_reference_t<TargetType>;
465
466 FContextInfo(const FQueryDescription& Description, SourceType& Context)
467 : ContextWrapper(Description, Context)
468 {}
469 };
470
471 template<SourceQueryContext SourceType>
472 struct FContextInfo<SourceType, const SourceType&>
473 {
474 const SourceType& ContextWrapper;
475
476 FContextInfo(const FQueryDescription& Description, SourceType& Context)
477 : ContextWrapper(Context)
478 {}
479 };
480
481 template<SourceQueryContext SourceType>
482 struct FContextInfo<SourceType, SourceType&>
483 {
484 SourceType& ContextWrapper;
485
486 FContextInfo(const FQueryDescription& Description, SourceType& Context)
487 : ContextWrapper(Context)
488 {}
489 };
490
491 template<SourceQueryContext SourceContext, bool ValidateColumns, typename TargetContext, typename RowHandleType, typename... Args>
494 : public FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>
495 , public FContextInfo<SourceContext, TargetContext>
496 {
497 using SuperColumn = FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>;
499
501 : SuperColumn(Description, Context)
502 , SuperContext(Description, Context)
503 {}
504
505 template<typename CallerType>
506 void Call(SourceContext& Context, const CallerType& Caller)
507 {
508 TConstArrayView<RowHandle> Rows = Context.GetRowHandles();
509 if constexpr (SuperColumn::bArePointerColumns || std::is_pointer_v<RowHandleType>)
510 {
511 if constexpr (sizeof...(Args) > 0)
512 {
513 std::apply([this, Rows = Rows.GetData(), &Caller](auto&&... Column)
514 {
515 Caller(this->ContextWrapper, Rows, Column...);
516 }, this->Columns);
517 }
518 else
519 {
520 Caller(this->ContextWrapper, Rows.GetData());
521 }
522 }
523 else
524 {
525 for (RowHandle Row : Rows)
526 {
527 if constexpr (sizeof...(Args) > 0)
528 {
529 std::apply([this, Row, &Caller](auto&&... Column)
530 {
531 Caller(this->ContextWrapper, Row, *Column...);
532 ((++Column), ...);
533 }, this->Columns);
534 }
535 else
536 {
537 Caller(this->ContextWrapper, Row);
538 }
539 }
540 }
541 }
542 };
543
544 template<SourceQueryContext SourceContext, bool ValidateColumns, typename TargetContext, typename... Args>
547 : public FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>
548 , public FContextInfo<SourceContext, TargetContext>
549 {
550 using SuperColumn = FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>;
552
553 FContextColumnsFunction(const FQueryDescription& Description, SourceContext& Context)
554 : SuperColumn(Description, Context)
555 , SuperContext(Description, Context)
556 {}
557
558 template<typename CallerType>
559 void Call(SourceContext& Context, const CallerType& Caller)
560 {
561 if constexpr (sizeof...(Args) > 0)
562 {
564 {
565 std::apply(
566 [this, &Caller](auto&&... Column)
567 {
568 Caller(this->ContextWrapper, Column...);
569 }, this->Columns);
570 }
571 else
572 {
573 auto CallForwarder = [this, &Caller](auto&&... Column)
574 {
575 Caller(this->ContextWrapper, *Column...);
576 ((++Column), ...);
577 };
578 const uint32 RowCount = Context.GetRowCount();
579 for (uint32 Index = 0; Index < RowCount; ++Index)
580 {
581 std::apply(CallForwarder, this->Columns);
582 }
583 }
584 }
585 else
586 {
587 Caller(this->ContextWrapper);
588 }
589 }
590 };
591
592 template<SourceQueryContext SourceContext, bool ValidateColumns, typename RowHandleType, typename... Columns>
593 struct FRowHandleColumnsFunction : public FFunctionColumnInfo<SourceContext, ValidateColumns, Columns...>
594 {
596
597 FRowHandleColumnsFunction(const FQueryDescription& Description, SourceContext& Context)
598 : Super(Description, Context)
599 {}
600
601 template<typename CallerType>
602 void Call(SourceContext& Context, const CallerType& Caller)
603 {
604 TConstArrayView<RowHandle> Rows = Context.GetRowHandles();
605 if constexpr (Super::bArePointerColumns || std::is_pointer_v<RowHandleType>)
606 {
607 if constexpr (sizeof...(Columns) > 0)
608 {
609 std::apply([Rows = Rows.GetData(), &Caller](auto&&... Column)
610 {
611 Caller(Rows, Column...);
612 }, this->Columns);
613 }
614 else
615 {
616 Caller(Rows.GetData());
617 }
618 }
619 else
620 {
621 for (RowHandle Row : Rows)
622 {
623 if constexpr (sizeof...(Columns) > 0)
624 {
625 std::apply([Row, &Caller](auto&&... Column)
626 {
627 Caller(Row, *Column...);
628 ((++Column), ...);
629 }, this->Columns);
630 }
631 else
632 {
633 Caller(Row);
634 }
635 }
636 }
637 }
638 };
639
640 template<SourceQueryContext SourceContext, bool ValidateColumns, typename... Args>
641 struct FColumnsFunction : public FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>
642 {
643 using Super = FFunctionColumnInfo<SourceContext, ValidateColumns, Args...>;
644
645 FColumnsFunction(const FQueryDescription& Description, SourceContext& Context)
646 : Super(Description, Context)
647 {}
648
649 template<typename CallerType>
650 void Call(SourceContext& Context, const CallerType& Caller)
651 {
652 if constexpr (sizeof...(Args) > 0)
653 {
654 if constexpr (Super::bArePointerColumns)
655 {
656 std::apply(
657 [&Caller](auto&&... Column)
658 {
659 Caller(Column...);
660 }, this->Columns);
661 }
662 else
663 {
664 auto CallForwarder = [&Caller](auto&&... Column)
665 {
666 Caller(*Column...);
667 ((++Column), ...);
668 };
669 const uint32 RowCount = Context.GetRowCount();
670 for (uint32 Index = 0; Index < RowCount; ++Index)
671 {
672 std::apply(CallForwarder, this->Columns);
673 }
674 }
675 }
676 else
677 {
678 const uint32 RowCount = Context.GetRowCount();
679 for (uint32 Index = 0; Index < RowCount; ++Index)
680 {
681 Caller();
682 }
683 }
684 }
685 };
686
687 template<SourceQueryContext SourceContext, bool ValidateColumns, typename... Args>
689 {
690 using BaseClass = FColumnsFunction<SourceContext, ValidateColumns, Args...>;
691 };
692
693 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Arg0, typename... Args>
695 struct FFunctionInfoHelper<SourceContext, ValidateColumns, Arg0, Args...>
696 {
697 using BaseClass = FContextColumnsFunction<SourceContext, ValidateColumns, Arg0, Args...>;
698 };
699
700 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Arg0, typename... Args>
701 requires IsRowHandleType<Arg0>
702 struct FFunctionInfoHelper<SourceContext, ValidateColumns, Arg0, Args...>
703 {
704 using BaseClass = FRowHandleColumnsFunction<SourceContext, ValidateColumns, Arg0, Args...>;
705 };
706
707 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Arg0, typename Arg1, typename... Args>
709 struct FFunctionInfoHelper<SourceContext, ValidateColumns, Arg0, Arg1, Args...>
710 {
711 using BaseClass = FContextRowHandleColumnsFunction<SourceContext, ValidateColumns, Arg0, Arg1, Args...>;
712 };
713
714 template<SourceQueryContext SourceContext, bool ValidateColumns, typename... Args>
715 struct FFunctionInfo final : public FFunctionInfoHelper<SourceContext, ValidateColumns, Args...>::BaseClass
716 {
717 using Super = typename FFunctionInfoHelper<SourceContext, ValidateColumns, Args...>::BaseClass;
718
719 FFunctionInfo(const FQueryDescription& Description, SourceContext& Context)
720 : Super(Description, Context)
721 {}
722 };
723
724 template<SourceQueryContext SourceContext, bool ValidateColumns, typename... Args>
726 void (*Callback)(Args...))
727 {
728 Function = [Callback](const FQueryDescription& Description, SourceContext& Context)
729 {
730 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, Callback);
731 };
732 }
733
734 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Class, typename... Args>
736 void (Class::*Callback)(Args...))
737 {
738 Function = [Target, Callback](const FQueryDescription& Description, SourceContext& Context)
739 {
740 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, (Target->*Callback));
741 };
742 }
743
744 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Class, typename... Args>
746 void (Class::*Callback)(Args...) const)
747 {
748 Function = [Target, Callback](const FQueryDescription& Description, SourceContext& Context)
749 {
750 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, (Target->*Callback));
751 };
752 }
753
754 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Functor, typename Class, typename... Args>
755 void BindQueryFunction_Expand(QueryCallback& Function, Functor&& CallbackObject,
756 void (Class::*Callback)(Args...) const)
757 {
758 Function = [CallbackObject = std::forward<Functor>(CallbackObject)](const FQueryDescription& Description, SourceContext& Context)
759 {
760 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, CallbackObject);
761 };
762 }
763
764 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Functor, typename Class, typename... Args>
765 void BindQueryFunction_Expand(QueryCallback& Function, Functor&& CallbackObject,
766 void (Class::*Callback)(Args...))
767 {
768 Function = [CallbackObject = std::forward<Functor>(CallbackObject)](const FQueryDescription& Description, SourceContext& Context)
769 {
770 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, CallbackObject);
771 };
772 }
773
774 template<SourceQueryContext SourceContext, bool ValidateColumns, typename Functor>
775 void BindQueryFunction(QueryCallback& Function, Functor&& Callback)
776 {
778 Function,
779 std::forward<Functor>(Callback),
780 &std::remove_cv_t<std::remove_reference_t<Functor>>::operator());
781 }
782
783
784 template<bool ValidateColumns, SourceQueryContext SourceContext, typename... Args>
785 void CallQueryFunction(const FQueryDescription& Description, SourceContext& Context,
786 QueryCallback& Function, void (*Callback)(Args...))
787 {
788 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, Callback);
789 }
790
791 template<bool ValidateColumns, SourceQueryContext SourceContext, typename Class, typename... Args>
792 void CallQueryFunction(const FQueryDescription& Description, SourceContext& Context,
793 Class* Target, void (Class::* Callback)(Args...))
794 {
795 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, (Target->*Callback));
796 }
797
798 template<bool ValidateColumns, SourceQueryContext SourceContext, typename Class, typename... Args>
799 void CallQueryFunction(const FQueryDescription& Description, SourceContext& Context,
800 Class* Target, void (Class::* Callback)(Args...) const)
801 {
802 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, (Target->*Callback));
803 }
804
805 template<bool ValidateColumns, SourceQueryContext SourceContext, typename Functor, typename Class, typename... Args>
806 void CallQueryFunction_Expand(const FQueryDescription& Description, SourceContext& Context,
807 const Functor& CallbackObject, void (Class::* Callback)(Args...) const)
808 {
809 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, CallbackObject);
810 }
811
812 template<bool ValidateColumns, SourceQueryContext SourceContext, typename Functor, typename Class, typename... Args>
813 void CallQueryFunction_Expand(const FQueryDescription& Description, SourceContext& Context,
814 const Functor& CallbackObject, void (Class::* Callback)(Args...))
815 {
816 FFunctionInfo<SourceContext, ValidateColumns, Args...>(Description, Context).Call(Context, CallbackObject);
817 }
818
819 template<bool ValidateColumns, SourceQueryContext SourceContext, typename Functor>
820 void CallQueryFunction(const FQueryDescription& Description, SourceContext& Context,
821 const Functor& Callback)
822 {
823 CallQueryFunction_Expand<ValidateColumns>(Description, Context, Callback, &Functor::operator());
824 }
825
826
827 template<typename Arg>
829 {
830 if constexpr (std::is_const_v<BaseColumnType<Arg>>)
831 {
833 }
834 else
835 {
837 }
838 }
839
840 template<typename ContextType> void RegisterDependencies(FQueryDescription& Query)
841 {
842 using BaseType = typename TRemoveReference<ContextType>::Type;
844 {
845 BaseType::Register(Query);
846 }
847 }
848
849 template<SourceQueryContext SourceContext, typename... Args>
851 {
853 {
854 (AddColumnToSelect<Args>(Target), ...);
855 }
856 };
857
858 template<SourceQueryContext SourceContext>
860 {
862 };
863
864 template<SourceQueryContext SourceContext, typename Arg0>
865 struct RegisterFunctionArgumentsHelper<SourceContext, Arg0>
866 {
867 static void Register(FQueryDescription& Query, Select& Target)
868 {
870 {
872 }
873 else if constexpr (IsValidColumnType<Arg0>())
874 {
876 }
877 // The third option is a row handle, which doesn't need to be registered.
878 }
879 };
880
881 template<SourceQueryContext SourceContext, typename Arg0, typename Arg1, typename... Args>
882 struct RegisterFunctionArgumentsHelper<SourceContext, Arg0, Arg1, Args...>
883 {
884 static void Register(FQueryDescription& Query, Select& Target)
885 {
887 {
889 }
890 else if constexpr (IsValidColumnType<Arg0>())
891 {
893 }
894 // The third option is a row handle, which doesn't need to be registered.
895
896 if constexpr (IsValidColumnType<Arg1>())
897 {
899 }
900 // The second option is a row handle, which doesn't need to be registered.
901
902 (AddColumnToSelect<Args>(Target), ...);
903 }
904 };
905
906 template<SourceQueryContext SourceContext, typename... Args>
911
912 template<SourceQueryContext SourceContext, typename Class, typename... Args>
917
918 template<SourceQueryContext SourceContext, typename Class, typename... Args>
919 void RegisterFunctionArguments(FQueryDescription& Query, Select& Target, void (Class::*)(Args...) const)
920 {
922 }
923
924 template<SourceQueryContext SourceContext, typename Functor>
926 {
927 RegisterFunctionArguments<SourceContext>(Query, Target, &Functor::operator());
928 }
929
930 template<SourceQueryContext SourceContext, typename... Args>
932 {
933 constexpr static bool HasValidColumnTypes = (IsValidColumnType<Args>() && ...);
934 static_assert(HasValidColumnTypes, "One or more of the provided columns is not compatible with query callback.");
935
936 constexpr static bool Value = HasValidColumnTypes;
937 };
938
939 template<SourceQueryContext SourceContext, typename Arg0, typename... Args>
940 struct IsValidSelectFunctionSignatureImpl2<SourceContext, Arg0, Args...>
941 {
942 constexpr static bool Arg0IsContext = IsCompatibleTargetContextType<SourceContext, Arg0>;
943 constexpr static bool Arg0IsRowHandle = IsRowHandleType<Arg0>;
944 constexpr static bool Arg0IsArgument = IsValidColumnType<Arg0>();
945 constexpr static bool Arg0IsValidRowHandle = Arg0IsRowHandle && IsRowTypeCompatibleWithColumns<Arg0, Args...>();
946 constexpr static bool Arg0IsValid = (Arg0IsContext || Arg0IsValidRowHandle || Arg0IsArgument);
947
948 static_assert(!Arg0IsRowHandle || Arg0IsValidRowHandle, "Row handles need to taken by value when the columns are requested by "
949 "reference or by const pointer if the columns are taken by reference.");
950 static_assert(Arg0IsValid, "The first provided argument has to be a reference to a compatible query reference, a row handle"
951 " or a (const) reference/pointer to a column.");
952
953 constexpr static bool HasValidColumnTypes = (IsValidColumnType<Args>() && ...);
954 static_assert(HasValidColumnTypes, "One or more of the provided columns is not compatible with query callback.");
955
956 constexpr static bool Value = Arg0IsValid && HasValidColumnTypes;
957 };
958
959 template<SourceQueryContext SourceContext, typename Arg0, typename Arg1, typename... Args>
960 struct IsValidSelectFunctionSignatureImpl2<SourceContext, Arg0, Arg1, Args...>
961 {
962 constexpr static bool Arg0IsContext = IsCompatibleTargetContextType<SourceContext, Arg0>;
963 constexpr static bool Arg0IsRowHandle = IsRowHandleType<Arg0>;
964 constexpr static bool Arg0IsArgument = IsValidColumnType<Arg0>();
965 constexpr static bool Arg0IsValidRowHandle = Arg0IsRowHandle && IsRowTypeCompatibleWithColumns<Arg0, Args...>();
966 constexpr static bool Arg0IsValid = (Arg0IsContext || Arg0IsValidRowHandle || Arg0IsArgument);
967
968 static_assert(!Arg0IsRowHandle || Arg0IsValidRowHandle, "Row handles need to taken by value when the columns are requested by "
969 "reference or by const pointer if the columns are taken by reference.");
970 static_assert(Arg0IsValid, "The first argument to a query callback has to be a reference to a compatible query reference, a "
971 "row handle or a (const) reference/pointer to a column.");
972
973 constexpr static bool Arg1IsRowHandle = IsRowHandleType<Arg1>;
974 constexpr static bool Arg1IsArgument = IsValidColumnType<Arg1>();
975 constexpr static bool Arg1IsValidRowHandle = Arg1IsRowHandle && IsRowTypeCompatibleWithColumns<Arg1, Args...>();
976 constexpr static bool Arg1IsValid = (Arg1IsValidRowHandle || Arg1IsArgument);
977
978 static_assert(!Arg1IsRowHandle || Arg1IsValidRowHandle, "Row handles need to taken by value when the columns are requested by "
979 "reference or by const pointer if the columns are taken by reference.");
980 static_assert(Arg1IsValid, "The second argument to a query callback has to be a row handle or a (const) reference/pointer "
981 "to a column.");
982
983 constexpr static bool HasValidColumnTypes = (IsValidColumnType<Args>() && ...);
984 static_assert(HasValidColumnTypes, "One or more of the provided columns is not compatible with query callback.");
985
986 constexpr static bool Value = Arg0IsValid && Arg1IsValid && HasValidColumnTypes;
987 };
988
989 template<SourceQueryContext SourceContext>
991 {
992 constexpr static bool Value = false;
993 };
994
995 template<SourceQueryContext SourceContext, typename T>
997 {
998 constexpr static bool Value = false;
999 };
1000
1001 template<SourceQueryContext SourceContext, typename... Args>
1002 struct IsValidSelectFunctionSignatureImpl<SourceContext, void (*)(Args...)>
1003 {
1004 constexpr static bool Value = IsValidSelectFunctionSignatureImpl2<SourceContext, Args...>::Value;
1005 };
1006
1007 template<SourceQueryContext SourceContext, typename Class, typename... Args>
1008 struct IsValidSelectFunctionSignatureImpl<SourceContext, void (Class::*)(Args...)>
1009 {
1010 constexpr static bool Value = IsValidSelectFunctionSignatureImpl2<SourceContext, Args...>::Value;
1011 };
1012
1013 template<SourceQueryContext SourceContext, typename Class, typename... Args>
1014 struct IsValidSelectFunctionSignatureImpl<SourceContext, void (Class::*)(Args...) const>
1015 {
1016 constexpr static bool Value = IsValidSelectFunctionSignatureImpl2<SourceContext, Args...>::Value;
1017 };
1018
1019 template<SourceQueryContext SourceContext, typename T> constexpr bool IsValidSelectFunctionSignature()
1020 {
1021 if constexpr (IsFunctor<T>)
1022 {
1023 return IsValidSelectFunctionSignatureImpl<SourceContext, decltype(&T::operator())>::Value;
1024 }
1025 else
1026 {
1028 }
1029 };
1030
1032 {
1033 Query.Callback.Type = EQueryCallbackType::Processor;
1034 Query.Callback.Phase = Processor.Phase;
1035 Query.Callback.Group = Processor.Group;
1036 Query.Callback.ActivationName = Processor.ActivationName;
1037 Query.Callback.Active = Processor.ActivationName.IsNone();
1038 if (!Processor.BeforeGroup.IsNone())
1039 {
1040 Query.Callback.BeforeGroups.Add(Processor.BeforeGroup);
1041 }
1042 if (!Processor.AfterGroup.IsNone())
1043 {
1044 Query.Callback.AfterGroups.Add(Processor.AfterGroup);
1045 }
1046 Query.Callback.ExecutionMode = Processor.ExecutionMode;
1047
1048 Query.bShouldBatchModifications = Processor.bBatchModifications;
1049 }
1050
1052 {
1053 switch (Observer.Event)
1054 {
1056 Query.Callback.Type = EQueryCallbackType::ObserveAdd;
1057 break;
1060 break;
1061 }
1062 Query.Callback.ActivationName = Observer.ActivationName;
1063 Query.Callback.Active = Observer.ActivationName.IsNone();
1064 Query.Callback.MonitoredType = Observer.Monitor;
1065 Query.Callback.ExecutionMode = Observer.ExecutionMode;
1066 }
1067
1069 {
1070 switch (PhaseAmble.Location)
1071 {
1074 break;
1077 break;
1078 }
1079 Query.Callback.ActivationName = PhaseAmble.ActivationName;
1080 Query.Callback.Active = PhaseAmble.ActivationName.IsNone();
1081 Query.Callback.Phase = PhaseAmble.Phase;
1082 Query.Callback.ExecutionMode = PhaseAmble.ExecutionMode;
1083 }
1084
1085 template<typename CallbackType, typename Function>
1087 const CallbackType& Type, Function Callback)
1088 {
1089 static_assert(TIsDerivedFrom<CallbackType, FQueryCallbackType>::Value, "The callback type provided isn't one of the available "
1090 "classes derived from FQueryCallbackType.");
1092 R"(The function provided to the Query Builder's Select call wasn't invocable or doesn't contain a supported combination of arguments.
1093The following options are supported:
1094- void([const]Column&...)
1095- void(RowHandle, [const]Column&...)
1096- void(<Context>&, [const]Column&...)
1097- void(<Context>&, RowHandle, [const]Column&...)
1098- void(<Context>&, [const]Column*...)
1099- void(<Context>&, const RowHandle*, [const]Column*...)
1100Where <Context> is IQueryContext or FCachedQueryContext<...>
1101e.g. void(FCachedQueryContext<Subsystem1, const Subsystem2>& Context, RowHandle Row, ColumnType0& ColumnA, const ColumnType1& ColumnB) {...}
1102)");
1105 Query.Callback.Name = Name;
1106 }
1107 } // namespace Private
1108
1109 template<typename CallbackType, typename Function>
1111 : Select()
1112 {
1113 static constexpr bool ValidateColumns = false;
1114 Private::PrepareForQueryBinding(*this, Query, Name, Type, Callback);
1115 Private::BindQueryFunction<IQueryContext, ValidateColumns>(Query.Callback.Function, std::forward<Function>(Callback));
1116 }
1117
1118 template<typename CallbackType, typename Class, typename Function>
1120 : Select()
1121 {
1122 static constexpr bool ValidateColumns = false;
1123 Private::PrepareForQueryBinding(*this, Query, Name, Type, Callback);
1124 Private::BindQueryFunction<IQueryContext, ValidateColumns>(Query.Callback.Function, Instance, Callback);
1125 }
1126
1127 template<TDataColumnType... TargetTypes>
1129 {
1130 ReadOnly({ TargetTypes::StaticStruct()... });
1131 return *this;
1132 }
1133
1134 template<TDataColumnType... TargetTypes>
1136 {
1137 ReadOnly({ TargetTypes::StaticStruct()... }, Optional);
1138 return *this;
1139 }
1140
1141 template<TDynamicColumnTemplate Target>
1143 {
1145 {
1146 .TemplateType = Target::StaticStruct(),
1147 .Identifier = Identifier
1148 });
1149 return *this;
1150 }
1151
1152 template<TDataColumnType... TargetTypes>
1154 {
1155 ReadWrite({ TargetTypes::StaticStruct()... });
1156 return *this;
1157 }
1158
1159 template<TDynamicColumnTemplate Target>
1161 {
1163 {
1164 .TemplateType = Target::StaticStruct(),
1165 .Identifier = Identifier
1166 });
1167 return *this;
1168 }
1169
1170 //
1171 // FSimpleQuery
1172 //
1173
1174 template<TColumnType... TargetTypes>
1176 {
1177 All({ TargetTypes::StaticStruct()... });
1178 return *this;
1179 }
1180
1181 template<TColumnType... TargetTypes>
1183 {
1184 Any({ TargetTypes::StaticStruct()... });
1185 return *this;
1186 }
1187
1188 template <TDynamicColumnTemplate DynamicColumnTemplate>
1190 {
1192 {
1193 .TemplateType = DynamicColumnTemplate::StaticStruct(),
1194 .Identifier = Identifier
1195 });
1196 }
1197
1198 template<TColumnType... TargetTypes>
1200 {
1201 None({ TargetTypes::StaticStruct()... });
1202 return *this;
1203 }
1204
1205 template<TValueTagType>
1207 {
1208 return All(FValueTag(Tag));
1209 }
1210
1211 template<TValueTagType>
1213 {
1214 return All(FValueTag(Tag), Value);
1215 }
1216
1217 template <TDynamicColumnTemplate DynamicColumnTemplate>
1219 {
1221 {
1222 .TemplateType = DynamicColumnTemplate::StaticStruct(),
1223 .Identifier = Identifier
1224 });
1225 }
1226
1227 template <TDynamicColumnTemplate DynamicColumnTemplate>
1229 {
1231 {
1232 .TemplateType = DynamicColumnTemplate::StaticStruct(),
1233 .Identifier = Identifier
1234 });
1235 }
1236
1237 template <TEnumType EnumT>
1238 FSimpleQuery& FSimpleQuery::All()
1239 {
1240 return All(static_cast<const UEnum&>(*StaticEnum<EnumT>()));
1241 }
1242
1243 template <TEnumType EnumT>
1245 {
1246 return All(static_cast<const UEnum&>(*StaticEnum<EnumT>()), static_cast<int64>(EnumValue));
1247 }
1248
1249 template<auto Value, TEnumType EnumT = decltype(Value)>
1251 {
1252 return All<EnumT>(Value);
1253 }
1254
1255 //
1256 // External query bindings
1257 //
1258 template<typename Function>
1260 {
1261 static_assert(Private::IsValidSelectFunctionSignature<IDirectQueryContext, Function>(),
1262 R"(The function provided to the Query Builder's CreateDirectQueryCallbackBinding call wasn't invocable or doesn't contain a supported combination of arguments.
1263The following options are supported:
1264- void([const]Column&...)
1265- void(RowHandle, [const]Column&...)
1266- void(<Context>&, [const]Column&...)
1267- void(<Context>&, RowHandle, [const]Column&...)
1268- void(<Context>&, [const]Column*...)
1269- void(<Context>&, const RowHandle*, [const]Column*...)
1270Where <Context> is IDirectQueryContext
1271e.g. void(IDirectQueryContext& Context, RowHandle Row, ColumnType0& ColumnA, const ColumnType1& ColumnB) {...}
1272)");
1273
1274 return [Callback = Forward<Function>(Callback)](
1275 const FQueryDescription& Description,
1277 {
1278 static constexpr bool ValidateColumns = true;
1279 Private::CallQueryFunction<ValidateColumns>(Description, Context, Callback);
1280 };
1281 }
1282
1283 template<typename Function>
1285 {
1286 static_assert(Private::IsValidSelectFunctionSignature<ISubqueryContext, Function>(),
1287 R"(The function provided to the Query Builder's CreateSubqueryCallbackBinding call wasn't invocable or doesn't contain a supported combination of arguments.
1288The following options are supported:
1289- void([const]Column&...)
1290- void(RowHandle, [const]Column&...)
1291- void(<Context>&, [const]Column&...)
1292- void(<Context>&, RowHandle, [const]Column&...)
1293- void(<Context>&, [const]Column*...)
1294- void(<Context>&, const RowHandle*, [const]Column*...)
1295Where <Context> is ISubqueryContext
1296e.g. void(ISubqueryContext& Context, RowHandle Row, ColumnType0& ColumnA, const ColumnType1& ColumnB) {...}
1297)");
1298
1299 return [Callback = Forward<Function>(Callback)](
1300 const FQueryDescription& Description,
1302 {
1303 static constexpr bool ValidateColumns = true;
1304 Private::CallQueryFunction<ValidateColumns>(Description, Context, Callback);
1305 };
1306 }
1307} // namespace UE::Editor::DataStorage::Queries
1308
1309#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_7
1310#include "Templates/IsConst.h"
1311#endif
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr void EnumAddFlags(Enum &Flags, Enum FlagsToAdd)
Definition EnumClassFlags.h:91
Columns EContextCapabilityFlags::SupportsBatch TConstArrayView< RowHandle >
Definition TypedElementQueryCapabilities.inl:40
TConstArrayView< const UScriptStruct * > TConstArrayView< const UScriptStruct * >
Definition TypedElementQueryCapabilities.inl:16
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
FORCEINLINE bool IsNone() const
Definition NameTypes.h:827
Definition ArrayView.h:139
Definition AssetRegistryState.h:50
Definition Class.h:3793
Definition CommonTypes.h:57
Definition TypedElementQueryBuilder.h:120
FDependency & ReadOnly()
Definition TypedElementQueryBuilder.inl:76
FDependency & ReadWrite()
Definition TypedElementQueryBuilder.inl:83
Definition TypedElementQueryBuilder.h:147
FSimpleQuery & All()
Definition TypedElementQueryBuilder.inl:1175
FSimpleQuery & None()
Definition TypedElementQueryBuilder.inl:1199
FSimpleQuery & Any()
Definition TypedElementQueryBuilder.inl:1182
Definition TypedElementQueryBuilder.h:378
Select & ReadWrite()
Definition TypedElementQueryBuilder.inl:1153
TYPEDELEMENTFRAMEWORK_API Select()
Definition TypedElementQueryBuilder.cpp:417
Select & ReadOnly()
Definition TypedElementQueryBuilder.inl:1128
Definition Class.h:2791
UE_FORCEINLINE_HINT FString GetName() const
Definition UObjectBaseUtility.h:439
Definition Object.h:95
Definition Class.h:1720
Definition TypedElementQueryBuilder.inl:291
Definition TypedElementQueryBuilder.inl:384
Definition TypedElementQueryBuilder.inl:369
Definition TypedElementQueryBuilder.inl:297
Definition CommonTypes.h:101
Definition CommonTypes.h:95
Definition CommonTypes.h:39
Definition CommonTypes.h:42
Definition CommonTypes.h:36
Definition OverriddenPropertySet.cpp:45
void CallQueryFunction(const FQueryDescription &Description, SourceContext &Context, QueryCallback &Function, void(*Callback)(Args...))
Definition TypedElementQueryBuilder.inl:785
void BindQueryFunction_Expand(QueryCallback &Function, Functor &&CallbackObject, void(Class::*Callback)(Args...) const)
Definition TypedElementQueryBuilder.inl:755
constexpr EQueryAccessType GetAccessType()
Definition TypedElementQueryBuilder.inl:34
std::remove_cv_t< BaseColumnType< Column > > UndecoratedColumnType
Definition TypedElementQueryBuilder.inl:340
void RegisterFunctionArguments(FQueryDescription &Query, Select &Target, void(*)(Args...))
Definition TypedElementQueryBuilder.inl:907
void AddColumnToSelect(Select &Target)
Definition TypedElementQueryBuilder.inl:828
void CallQueryFunction_Expand(const FQueryDescription &Description, SourceContext &Context, const Functor &CallbackObject, void(Class::*Callback)(Args...) const)
Definition TypedElementQueryBuilder.inl:806
constexpr uint32 GetVarArgIndex()
Definition TypedElementQueryBuilder.inl:21
void RegisterDependencies(FQueryDescription &Query)
Definition TypedElementQueryBuilder.inl:840
void BindQueryFunction(QueryCallback &Function, void(*Callback)(Args...))
Definition TypedElementQueryBuilder.inl:725
constexpr bool IsRowTypeCompatibleWithColumns()
Definition TypedElementQueryBuilder.inl:372
constexpr bool IsValidSelectFunctionSignature()
Definition TypedElementQueryBuilder.inl:1019
constexpr bool AreAllColumnsReferences()
Definition TypedElementQueryBuilder.inl:311
const UScriptStruct * GetColumnType()
Definition TypedElementQueryBuilder.inl:363
constexpr bool IsValidColumnType()
Definition TypedElementQueryBuilder.inl:343
constexpr bool AreAllColumnsPointers()
Definition TypedElementQueryBuilder.inl:324
std::remove_pointer_t< std::remove_reference_t< Column > > BaseColumnType
Definition TypedElementQueryBuilder.inl:337
constexpr EQueryDependencyFlags GetDependencyFlags()
Definition TypedElementQueryBuilder.inl:48
void PrepareForQueryBinding(FQueryDescription &Query, const FProcessor &Processor)
Definition TypedElementQueryBuilder.inl:1031
Definition Conditions.cpp:11
EOptional
Definition TypedElementQueryBuilder.h:114
const UScriptStruct * Type(FTopLevelAssetPath Name)
Definition TypedElementQueryBuilder.cpp:15
SubqueryCallback CreateSubqueryCallbackBinding(Function &&Callback)
Definition TypedElementQueryBuilder.inl:1274
FSimpleQuery & All()
Definition TypedElementQueryBuilder.inl:1250
DirectQueryCallback CreateDirectQueryCallbackBinding(Function &&Callback)
Definition TypedElementQueryBuilder.inl:1259
Definition CommonTypes.cpp:10
EQueryDependencyFlags
Definition Types.h:103
uint64 QueryHandle
Definition Handles.h:18
uint64 RowHandle
Definition Handles.h:15
EQueryAccessType
Definition Types.h:91
U16 Index
Definition radfft.cpp:71
Definition UnrealTypeTraits.h:40
T Type
Definition RemoveReference.h:10
Definition WeakObjectPtrTemplates.h:25
const UScriptStruct * TemplateType
Definition CommonTypes.h:73
Column * GetMutableColumn()
Definition TypedElementQueryStorageInterfaces.h:468
const Column * GetColumn() const
Definition TypedElementQueryStorageInterfaces.h:455
void PushCommand(T CommandContext)
Definition TypedElementQueryStorageInterfaces.h:685
virtual void GetColumnsUnguarded(int32 TypeCount, char **RetrievedAddresses, const TWeakObjectPtr< const UScriptStruct > *ColumnTypes, const EQueryAccessType *AccessTypes)=0
virtual TConstArrayView< RowHandle > GetRowHandles() const =0
virtual void GetColumns(TArrayView< char * > RetrievedAddresses, TConstArrayView< TWeakObjectPtr< const UScriptStruct > > ColumnTypes, TConstArrayView< EQueryAccessType > AccessTypes)=0
bool HasColumn() const
Definition TypedElementQueryStorageInterfaces.h:481
void RemoveColumns(RowHandle Row)
Definition TypedElementQueryStorageInterfaces.h:673
bool HasColumn(const FName &Identifier) const
Definition TypedElementQueryStorageInterfaces.h:549
DynamicColumnTemplate * GetMutableColumn(const FName &Identifier)
Definition TypedElementQueryStorageInterfaces.h:531
virtual void RemoveRows(TConstArrayView< RowHandle > Rows)=0
void AddColumns(RowHandle Row)
Definition TypedElementQueryStorageInterfaces.h:661
const DynamicColumnTemplate * GetColumn(const FName &Identifier) const
Definition TypedElementQueryStorageInterfaces.h:513
Definition TypedElementQueryStorageInterfaces.h:373
Definition TypedElementQueryStorageInterfaces.h:390
virtual FQueryResult RunQuery(QueryHandle Query)=0
virtual const UObject * GetDependency(const UClass *DependencyClass)=0
virtual UObject * GetMutableDependency(const UClass *DependencyClass)=0
virtual FQueryResult RunSubquery(int32 SubqueryIndex)=0
virtual void GetDependencies(TArrayView< UObject * > RetrievedAddresses, TConstArrayView< TWeakObjectPtr< const UClass > > DependencyTypes, TConstArrayView< EQueryAccessType > AccessTypes)=0
Definition TypedElementQueryStorageInterfaces.h:381
Dependency & GetCachedMutableDependency()
Definition TypedElementQueryBuilder.inl:259
FCachedQueryContext(const FQueryDescription &InDescription, IQueryContext &InParentContext)
Definition TypedElementQueryBuilder.inl:239
const Dependency & GetCachedDependency() const
Definition TypedElementQueryBuilder.inl:269
static void Register(FQueryDescription &Query)
Definition TypedElementQueryBuilder.inl:246
Definition TypedElementQueryBuilder.h:255
FObserver & SetMonitoredColumn()
Definition TypedElementQueryBuilder.inl:107
EExecutionMode ExecutionMode
Definition TypedElementQueryBuilder.h:279
static FObserver OnRemove()
Definition TypedElementQueryBuilder.inl:101
EEvent Event
Definition TypedElementQueryBuilder.h:277
FName ActivationName
Definition TypedElementQueryBuilder.h:278
static FObserver OnAdd()
Definition TypedElementQueryBuilder.inl:95
const UScriptStruct * Monitor
Definition TypedElementQueryBuilder.h:276
Definition TypedElementQueryBuilder.h:283
Definition TypedElementQueryBuilder.h:235
Definition TypedElementQueryBuilder.h:305
IQueryContext & ParentContext
Definition TypedElementQueryBuilder.h:343
void GetDependencies(TArrayView< UObject * > RetrievedAddresses, TConstArrayView< TWeakObjectPtr< const UClass > > SubsystemTypes, TConstArrayView< EQueryAccessType > AccessTypes) override
Definition TypedElementQueryBuilder.inl:161
void GetColumnsUnguarded(int32 TypeCount, char **RetrievedAddresses, const TWeakObjectPtr< const UScriptStruct > *ColumnTypes, const EQueryAccessType *AccessTypes) override
Definition TypedElementQueryBuilder.inl:140
void GetColumns(TArrayView< char * > RetrievedAddresses, TConstArrayView< TWeakObjectPtr< const UScriptStruct > > ColumnTypes, TConstArrayView< EQueryAccessType > AccessTypes) override
Definition TypedElementQueryBuilder.inl:134
void RemoveRow(RowHandle Row) override
Definition TypedElementQueryBuilder.inl:177
const UObject * GetDependency(const UClass *DependencyClass) override
Definition TypedElementQueryBuilder.inl:156
FQueryResult RunQuery(QueryHandle Query) override
Definition TypedElementQueryBuilder.inl:207
UObject * GetMutableDependency(const UClass *DependencyClass) override
Definition TypedElementQueryBuilder.inl:151
TConstArrayView< RowHandle > GetRowHandles() const override
Definition TypedElementQueryBuilder.inl:172
FQueryResult RunSubquery(int32 SubqueryIndex) override
Definition TypedElementQueryBuilder.inl:212
void RemoveRows(TConstArrayView< RowHandle > Rows) override
Definition TypedElementQueryBuilder.inl:182
FQueryContextForwarder(const FQueryDescription &InDescription, IQueryContext &InParentContext)
Definition TypedElementQueryBuilder.inl:117
void AddColumns(RowHandle Row, TConstArrayView< const UScriptStruct * > ColumnTypes) override
Definition TypedElementQueryBuilder.inl:187
uint32 GetRowCount() const override
Definition TypedElementQueryBuilder.inl:167
void PushCommand(void(*CommandFunction)(void *), void *CommandData) override
Definition TypedElementQueryBuilder.inl:229
void RemoveColumns(RowHandle Row, TConstArrayView< const UScriptStruct * > ColumnTypes) override
Definition TypedElementQueryBuilder.inl:197
Definition TypedElementQueryBuilder.inl:642
void Call(SourceContext &Context, const CallerType &Caller)
Definition TypedElementQueryBuilder.inl:650
FColumnsFunction(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:645
void Call(SourceContext &Context, const CallerType &Caller)
Definition TypedElementQueryBuilder.inl:559
FContextColumnsFunction(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:553
FContextInfo(const FQueryDescription &Description, SourceType &Context)
Definition TypedElementQueryBuilder.inl:486
SourceType & ContextWrapper
Definition TypedElementQueryBuilder.inl:484
FContextInfo(const FQueryDescription &Description, SourceType &Context)
Definition TypedElementQueryBuilder.inl:476
const SourceType & ContextWrapper
Definition TypedElementQueryBuilder.inl:474
Definition TypedElementQueryBuilder.inl:462
std::remove_reference_t< TargetType > BaseContextType
Definition TypedElementQueryBuilder.inl:463
BaseContextType ContextWrapper
Definition TypedElementQueryBuilder.inl:464
FContextInfo(const FQueryDescription &Description, SourceType &Context)
Definition TypedElementQueryBuilder.inl:466
FContextRowHandleColumnsFunction(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:500
void Call(SourceContext &Context, const CallerType &Caller)
Definition TypedElementQueryBuilder.inl:506
FFunctionColumnInfo(const FQueryDescription &, SourceContext &)
Definition TypedElementQueryBuilder.inl:455
Definition TypedElementQueryBuilder.inl:388
FFunctionColumnInfo(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:431
std::tuple< BaseColumnType< ColumnTypes > *... > Columns
Definition TypedElementQueryBuilder.inl:389
static constexpr bool bArePointerColumns
Definition TypedElementQueryBuilder.inl:390
bool CheckValidity(const FQueryDescription &Description)
Definition TypedElementQueryBuilder.inl:393
Definition TypedElementQueryBuilder.inl:689
Definition TypedElementQueryBuilder.inl:716
FFunctionInfo(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:719
typename FFunctionInfoHelper< SourceContext, ValidateColumns, Args... >::BaseClass Super
Definition TypedElementQueryBuilder.inl:717
void Call(SourceContext &Context, const CallerType &Caller)
Definition TypedElementQueryBuilder.inl:602
FRowHandleColumnsFunction(const FQueryDescription &Description, SourceContext &Context)
Definition TypedElementQueryBuilder.inl:597
static constexpr bool HasValidColumnTypes
Definition TypedElementQueryBuilder.inl:933
static constexpr bool Value
Definition TypedElementQueryBuilder.inl:936
static constexpr bool Value
Definition TypedElementQueryBuilder.inl:998
static void Register(FQueryDescription &Query, Select &Target)
Definition TypedElementQueryBuilder.inl:884
static void Register(FQueryDescription &Query, Select &Target)
Definition TypedElementQueryBuilder.inl:867
static void Register(FQueryDescription &, Select &)
Definition TypedElementQueryBuilder.inl:861
void Register(FQueryDescription &, Select &Target)
Definition TypedElementQueryBuilder.inl:852
Definition TypedElementDataStorageCompatibilityInterface.h:148