Apparatus Version 1.0.0
ECS-like data-driven workflow for Unreal Engine.
Fingerprint.h
1 /*
2  * ░▒▓ APPARATUS ▓▒░
3  *
4  * File: Fingerprint.h
5  * Created: Friday, 23rd October 2020 7:00:48 pm
6  * Author: Vladislav Dmitrievich Turbanov (vladislav@turbanov.ru)
7  * ───────────────────────────────────────────────────────────────────
8  * Last Modified: Tuesday, 6th April 2021 1:42:33 pm
9  * Modified By: Vladislav Dmitrievich Turbanov (vladislav@turbanov.ru)
10  * ───────────────────────────────────────────────────────────────────
11  *
12  * The Apparatus source code is for your internal usage only.
13  * Redistribution of this file is strictly prohibited.
14  *
15  * Community forums: https://talk.turbanov.ru
16  *
17  * Copyright 2020 - 2021, SP Vladislav Dmitrievich Turbanov
18  * Made in Russia, Moscow City, Chekhov City
19  */
20 
21 #pragma once
22 
23 #include <map>
24 #include <ostream>
25 #include <typeinfo>
26 
27 #include "CoreUObject.h"
28 #include "Engine.h"
29 #include "UObject/Class.h"
30 
31 #include "BitMask.h"
32 #include "Detail.h"
33 
34 #include "Fingerprint.generated.h"
35 
39 FORCEINLINE uint32 GetTypeHash(const UClass* Type)
40 {
41  return Type->GetUniqueID();
42 }
43 
47 UENUM(BlueprintType, Meta = (Bitflags))
48 enum class EBootFilter : uint8
49 {
53  None = 0x0 UMETA(Hidden),
57  Booted = 1 << 0 UMETA(DisplayName = "Booted"),
61  Halted = 1 << 1 UMETA(DisplayName = "Halted"),
65  All = Booted | Halted UMETA(DisplayName = "Booted + Halted")
66 };
67 
68 ENUM_CLASS_FLAGS(EBootFilter)
69 
70 
73 FORCEINLINE uint32 GetTypeHash(const EBootFilter BootFilter)
74 {
75  return (uint32)BootFilter;
76 }
77 
81 FORCEINLINE UEnum* GetBootFilterClass()
82 {
83  auto EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("EBootFilter"), true);
84  verify(EnumPtr);
85  return EnumPtr;
86 }
87 
93 FORCEINLINE EBootFilter BootFilterFromState(const bool bState)
94 {
95  return bState ? EBootFilter::Booted : EBootFilter::Halted;
96 }
97 
101 FORCEINLINE FString BootFilterToString(const EBootFilter BootFilter)
102 {
103  const UEnum* EnumPtr = GetBootFilterClass();
104  if (!EnumPtr)
105  {
106  return FString("Invalid");
107  }
108 
109  return EnumPtr->GetNameByValue((int64)BootFilter).ToString();
110 }
111 
115 USTRUCT(BlueprintType, Meta = (HasNativeMake = "ApparatusRuntime.ApparatusFunctionLibrary.MakeFingerprint"))
116 struct APPARATUSRUNTIME_API FFingerprint
117 {
118  GENERATED_BODY()
119 
120  private:
124  static int32 NextDetailId;
125 
129  static TMap<const UClass*, int32> DetailIds;
130 
134  static TMap<const UClass*, FBitMask> DetailsMasksByTypes;
135 
139  static TMap<const UClass*, FBitMask> ExcludedDetailsMasksByTypes;
140 
144  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
145  Meta = (AllowPrivateAccess = "true"))
146  TArray<TSubclassOf<class UDetail>> Details;
147 
153  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
154  Meta = (AllowPrivateAccess = "true"))
155  mutable FBitMask DetailsMask;
156 
160  friend uint32 GetTypeHash(const FFingerprint& Fingerprint);
161 
165  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Apparatus,
166  Meta = (AllowPrivateAccess = "true"))
167  EBootFilter BootState = EBootFilter::None;
168 
169  friend struct FFilter;
170  friend class UBelt;
171  friend class AMechanism;
173 
174  public:
178  static int32 GetDetailId(const TSubclassOf<class UDetail> DetailType);
179 
183  static const FBitMask&
184  GetDetailMask(const TSubclassOf<class UDetail> DetailType);
185 
189  static const FBitMask&
190  GetExcludedDetailMask(const TSubclassOf<class UDetail> DetailType);
191 
195  FORCEINLINE static const FBitMask&
196  GetDetailMask(const class UDetail* Detail)
197  {
198  return GetDetailMask(Detail->GetClass());
199  }
200 
204  FORCEINLINE static const FBitMask&
205  GetExcludedDetailMask(const class UDetail* Detail)
206  {
207  return GetExcludedDetailMask(Detail->GetClass());
208  }
212  template <class T> FORCEINLINE static const FBitMask& GetDetailMask()
213  {
214  return GetDetailMask(T::StaticType());
215  }
216 
220  FORCEINLINE EBootFilter GetBootState() const { return BootState; }
221 
227  FORCEINLINE bool SetBootState(EBootFilter InBootState)
228  {
229  if (BootState == InBootState) return false;
230  BootState = InBootState;
231  return true;
232  }
233 
239  FORCEINLINE bool SetBooted(bool bState = true)
240  {
241  return SetBootState(bState ? EBootFilter::Booted : EBootFilter::Halted);
242  }
243 
247  FORCEINLINE bool IsBooted() const
248  {
249  return BootState == EBootFilter::Booted;
250  }
251 
255  FORCEINLINE const TArray<TSubclassOf<class UDetail>>& GetDetails() const
256  {
257  return Details;
258  }
259 
263  FORCEINLINE int32 GetDetailsCount() const { return Details.Num(); }
264 
268  FORCEINLINE const FBitMask& GetDetailsMask() const { return DetailsMask; }
269 
273  FORCEINLINE TSubclassOf<class UDetail> DetailAt(const int32 Index) const
274  {
275  return Details[Index];
276  }
277 
281  FORCEINLINE explicit operator TArray<TSubclassOf<class UDetail>>() const
282  {
283  TArray<TSubclassOf<class UDetail>> Types;
284  for (auto Detail : Details)
285  {
286  Types.Add(Detail);
287  }
288  return Types;
289  }
290 
294  FORCEINLINE explicit operator TSet<UClass*>() const
295  {
296  TSet<UClass*> Types;
297  for (auto Detail : Details)
298  {
299  Types.Add(Detail);
300  }
301  return Types;
302  }
303 
307  FORCEINLINE operator bool() const
308  {
309  return Details.Num() > 0 || BootState != EBootFilter::None;
310  }
311 
318  FORCEINLINE void
319  GetMappingFrom(const TArray<TSubclassOf<class UDetail>>& Fingerprint,
320  TArray<int32>& OutMapping) const
321  {
322  OutMapping.Reset(Fingerprint.Num());
323  for (int32 i = 0; i < Fingerprint.Num(); ++i)
324  {
325  OutMapping.Add(IndexOf(Fingerprint[i]));
326  }
327  }
328 
335  FORCEINLINE void
336  GetMappingFrom(const TArray<TSubclassOf<class UDetail>>& Fingerprint,
337  TArray<TArray<int32>>& OutMapping) const
338  {
339  OutMapping.Reset(Fingerprint.Num());
340  for (int32 i = 0; i < Fingerprint.Num(); ++i)
341  {
342  GetIndicesOf(Fingerprint[i], OutMapping.AddDefaulted_GetRef());
343  }
344  }
345 
352  FORCEINLINE void GetMappingFrom(const FFingerprint& Fingerprint,
353  TArray<int32>& OutMapping) const
354  {
355  OutMapping.Reset(Fingerprint.GetDetailsCount());
356  for (auto Detail : Fingerprint.Details)
357  {
358  OutMapping.Add(IndexOf(Detail));
359  }
360  }
361 
362  FORCEINLINE void GetMappingTo(const FFingerprint& Fingerprint,
363  TArray<int32>& OutMapping) const
364  {
365  Fingerprint.GetMappingFrom(*this, OutMapping);
366  }
367 
374  FORCEINLINE void GetMappingFrom(const FFingerprint& Fingerprint,
375  TArray<TArray<int32>>& OutMapping) const
376  {
377  OutMapping.Reset(Fingerprint.GetDetailsCount());
378  for (auto Detail : Fingerprint.Details)
379  {
380  GetIndicesOf(Detail, OutMapping.AddDefaulted_GetRef());
381  }
382  }
383 
384  FORCEINLINE void GetMappingTo(const FFingerprint& Fingerprint,
385  TArray<TArray<int32>>& OutMapping) const
386  {
387  Fingerprint.GetMappingFrom(*this, OutMapping);
388  }
389 
395  FORCEINLINE bool Contains(const FFingerprint& Fingerprint) const
396  {
397  return GetDetailsMask().Includes(Fingerprint.GetDetailsMask());
398  }
399 
403  FORCEINLINE bool Contains(const TSubclassOf<class UDetail> DetailType) const
404  {
405  const FBitMask& Mask = GetDetailMask(DetailType);
406  return GetDetailsMask().Includes(Mask);
407  }
408 
412  bool Matches(const struct FFilter& Filter) const;
413 
417  bool Matches(const struct FFingerprint& Fingerprint) const;
418 
424  int32 IndexOf(const TSubclassOf<class UDetail> DetailType) const;
425 
431  bool GetIndicesOf(const TSubclassOf<class UDetail> DetailType,
432  TArray<int32>& OutIndices) const;
433 
437  FORCEINLINE FFingerprint() {}
438 
442  FFingerprint(const class ISubjective* Subjective);
443 
447  FFingerprint(const class UDetail* Detail);
448 
452  FFingerprint(const TSubclassOf<class UDetail> DetailType);
453 
457  FFingerprint(const TSet<TSubclassOf<class UDetail>>& DetailTypes);
458 
463  template <typename OtherAllocator>
464  FFingerprint(const TArray<UDetail*, OtherAllocator>& Details,
465  const EBootFilter InBootState = EBootFilter::None);
466 
471  FFingerprint(const TArray<TSubclassOf<class UDetail>>& InDetailTypes,
472  const EBootFilter InBootState = EBootFilter::None);
473 
477  FFingerprint(const FFingerprint& Fingerprint);
478 
482  bool Set(const FFingerprint& Fingerprint);
483 
487  bool Set(const TArray<TSubclassOf<class UDetail>>& DetailTypes);
488 
492  bool Set(const TSet<TSubclassOf<class UDetail>>& DetailTypes);
493 
497  bool Set(const TArray<UDetail*>& InDetails, const EBootFilter InBootState = EBootFilter::None);
498 
502  bool Set(const TSet<UDetail*>& Details);
503 
507  bool Set(const ISubjective* Subjective);
508 
512  FORCEINLINE FFingerprint& operator=(const FFingerprint& Fingerprint)
513  {
514  Set(Fingerprint);
515  return *this;
516  }
517 
521  FORCEINLINE FFingerprint&
522  operator=(const TArray<TSubclassOf<class UDetail>>& DetailTypes)
523  {
524  Set(DetailTypes);
525  return *this;
526  }
527 
531  FORCEINLINE FFingerprint&
532  operator=(const TSet<TSubclassOf<class UDetail>>& DetailTypes)
533  {
534  Set(DetailTypes);
535  return *this;
536  }
537 
541  FORCEINLINE FFingerprint& operator=(const TArray<class UDetail*>& InDetails)
542  {
543  Set(InDetails);
544  return *this;
545  }
546 
550  FORCEINLINE FFingerprint& operator=(const TSet<class UDetail*>& InDetails)
551  {
552  Set(InDetails);
553  return *this;
554  }
555 
559  FORCEINLINE FFingerprint& operator=(const ISubjective* Subjective)
560  {
561  Set(Subjective);
562  return *this;
563  }
564 
570  bool Add(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes);
571 
577  bool Add(const FFingerprint& Fingerprint);
578 
584  bool Add(const FFingerprint& Fingerprint, EBootFilter InBootState);
585 
591  bool Add(const TArray<TSubclassOf<class UDetail>>& DetailTypes);
592 
598  bool Add(const TSet<TSubclassOf<class UDetail>>& DetailTypes);
599 
605  bool Add(const TArray<class UDetail*>& InDetails,
606  const EBootFilter InBootState = EBootFilter::None);
607 
613  bool Add(const TSet<class UDetail*>& InDetails);
614 
621  bool Add(TSubclassOf<class UDetail> DetailType);
622 
629  bool Add(const ISubjective* Subjective);
630 
636  template <class T> FORCEINLINE bool Add() { return Add(T::StaticClass()); }
637 
641  bool ContainsDetail(const TSubclassOf<class UDetail> DetailType) const;
642 
646  bool ContainsDetail(const class UDetail* Detail) const;
647 
651  FORCEINLINE FFingerprint&
652  operator+=(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
653  {
654  Add(DetailTypes);
655  return *this;
656  }
657 
661  FORCEINLINE FFingerprint& operator+=(const FFingerprint& Fingerprint)
662  {
663  Add(Fingerprint);
664  return *this;
665  }
666 
670  FORCEINLINE FFingerprint&
671  operator+=(const TArray<TSubclassOf<class UDetail>>& DetailTypes)
672  {
673  Add(DetailTypes);
674  return *this;
675  }
676 
680  FORCEINLINE FFingerprint&
681  operator+=(const TSet<TSubclassOf<class UDetail>>& DetailTypes)
682  {
683  Add(DetailTypes);
684  return *this;
685  }
686 
690  FORCEINLINE FFingerprint& operator+=(const TArray<UDetail*>& InDetails)
691  {
692  Add(InDetails);
693  return *this;
694  }
695 
699  FORCEINLINE FFingerprint& operator+=(const TSet<UDetail*>& InDetails)
700  {
701  Add(InDetails);
702  return *this;
703  }
704 
708  FORCEINLINE FFingerprint& operator+=(TSubclassOf<class UDetail> DetailType)
709  {
710  Add(DetailType);
711  return *this;
712  }
713 
724  bool Remove(const TSubclassOf<class UDetail> DetailType);
725 
729  FORCEINLINE FFingerprint& operator-=(TSubclassOf<class UDetail> DetailType)
730  {
731  Remove(DetailType);
732  return *this;
733  }
734 
740  template <class T> FORCEINLINE bool Remove()
741  {
742  return Remove(T::StaticClass());
743  }
744 
751  bool Remove(const UDetail* Detail);
752 
756  FORCEINLINE void Reset()
757  {
758  Details.Reset();
759  DetailsMask.Reset();
760  BootState = EBootFilter::None;
761  }
762 
766  FString ToString() const;
767 
768  const static struct FFingerprint ZERO;
769 }; // USTRUCT Fingerprint
770 
771 FORCEINLINE bool FFingerprint::Matches(const FFingerprint& Fingerprint) const
772 {
773  return GetDetailsMask().Includes(Fingerprint.GetDetailsMask()) &&
774  ((GetBootState() & Fingerprint.GetBootState()) != EBootFilter::None);
775 }
776 
777 FORCEINLINE bool operator==(const FFingerprint& A, const FFingerprint& B)
778 {
779  if (std::addressof(A) == std::addressof(B))
780  return true;
781 
782  if (A.GetDetailsMask() != B.GetDetailsMask())
783  return false;
784  if (A.GetBootState() != B.GetBootState())
785  return false;
786 
787  return true;
788 }
789 
790 FORCEINLINE bool operator!=(const FFingerprint& A, const FFingerprint& B)
791 {
792  if (std::addressof(A) == std::addressof(B))
793  return false;
794 
795  if (A.GetDetailsMask() != B.GetDetailsMask())
796  return true;
797  if (A.GetBootState() != B.GetBootState())
798  return true;
799 
800  return false;
801 }
802 
803 FORCEINLINE uint32 GetTypeHash(const FFingerprint& Fingerprint)
804 {
805  uint32 hash = 1519974369;
806 
807  hash = hash * 1521134295 + GetTypeHash(Fingerprint.GetDetailsMask());
808  hash = hash * 1521134295 + GetTypeHash(Fingerprint.GetBootState());
809 
810  return hash;
811 }
812 
813 FORCEINLINE bool FFingerprint::Set(const FFingerprint& Fingerprint)
814 {
815  Reset();
816 
817  return Add(Fingerprint);
818 }
819 
820 FORCEINLINE bool FFingerprint::Set(const TArray<TSubclassOf<UDetail>>& Types)
821 {
822  Reset();
823 
824  return Add(Types);
825 }
826 
827 FORCEINLINE bool FFingerprint::Set(const TSet<TSubclassOf<UDetail>>& Types)
828 {
829  Reset();
830 
831  return Add(Types);
832 }
833 
834 FORCEINLINE bool FFingerprint::Set(const TArray<UDetail*>& InDetails,
835  const EBootFilter InBootState)
836 {
837  Reset();
838 
839  return Add(InDetails, InBootState);
840 }
841 
842 FORCEINLINE bool FFingerprint::Set(const TSet<UDetail*>& InDetails)
843 {
844  Reset();
845 
846  return Add(InDetails);
847 }
848 
849 FORCEINLINE bool FFingerprint::Set(const ISubjective* Subjective)
850 {
851  check(Subjective);
852 
853  Reset();
854 
855  return Add(Subjective);
856 }
857 
858 template <typename OtherAllocator>
859 inline FFingerprint::FFingerprint(const TArray<UDetail*, OtherAllocator>& InDetails,
860  const EBootFilter InBootFilter)
861  : DetailsMask(NextDetailId),
862  BootState(InBootFilter)
863 {
864  for (auto Detail : InDetails)
865  {
866  if (!Detail)
867  continue;
868  if (!Detail->IsEnabled())
869  continue;
870 
871  const FBitMask& Mask = GetDetailMask(Detail);
872  if (DetailsMask.Includes(Mask))
873  continue;
874  DetailsMask.OrWith(Mask);
875  Details.Add(Detail->GetClass());
876  }
877 }
878 
879 FORCEINLINE bool FFingerprint::ContainsDetail(const TSubclassOf<UDetail> DetailType) const
880 {
881  checkf(DetailType,
882  TEXT("The detail type must be provided for detail checks."));
883  const FBitMask& Mask = GetDetailMask(DetailType);
884  return DetailsMask.Includes(Mask);
885 }
886 
887 FORCEINLINE bool FFingerprint::ContainsDetail(const class UDetail* Detail) const
888 {
889  checkf(Detail,
890  TEXT("The detail must be provided for detail checks."));
891  if (!Detail->IsEnabled())
892  return false;
893  const FBitMask& Mask = GetDetailMask(Detail->GetClass());
894  return DetailsMask.Includes(Mask);
895 }
An interface for all sorts of subjects.
Definition: Subjective.h:42
The main Apparatus function library.
Definition: ApparatusFunctionLibrary.h:45
The conveyor belt consisting of subjects.
Definition: Belt.h:60
The base subject detail (component) class.
Definition: Detail.h:35
bool IsEnabled() const
Check if the detail currently active.
Definition: Detail.h:56
TSubclassOf< UDetail > GetClass() const
Get the detail class.
Definition: Detail.h:76
A memory-efficient bit mask.
Definition: BitMask.h:38
void Reset(const int32 NewSize=0)
Same as empty, but doesn't change memory allocations, unless the new size is larger than the current ...
Definition: BitMask.h:386
bool Includes(const FBitMask &BitMask) const
Does the mask has all of the bits set in the supplied mask.
Definition: BitMask.h:241
The details filter specification.
Definition: Filter.h:44
The details fingerprint.
Definition: Fingerprint.h:117
FFingerprint(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Construct a fingerprint from a set of types.
bool Add()
Add a generic detail type.
Definition: Fingerprint.h:636
FFingerprint & operator+=(const TArray< UDetail * > &InDetails)
Add active details from an array.
Definition: Fingerprint.h:690
bool Remove(const TSubclassOf< class UDetail > DetailType)
Remove a detail type from the fingerprint specification.
static const FBitMask & GetDetailMask()
Get the mask of a detail.
Definition: Fingerprint.h:212
bool Set(const FFingerprint &Fingerprint)
Set a fingerprint equal to another fingerprint.
Definition: Fingerprint.h:813
bool Remove()
Remove a type from a fingerprint.
Definition: Fingerprint.h:740
bool IsBooted() const
Check if the fingerprint corresponds to a booted entity.
Definition: Fingerprint.h:247
FFingerprint & operator+=(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Add a set of detail types.
Definition: Fingerprint.h:681
bool Set(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Set a fingerprint to a set of types.
static const FBitMask & GetDetailMask(const TSubclassOf< class UDetail > DetailType)
Get the cached mask of a detail type.
bool Add(TSubclassOf< class UDetail > DetailType)
Add a detail type.
bool Matches(const struct FFilter &Filter) const
Check if the fingerprint matches a filter.
bool Matches(const struct FFingerprint &Fingerprint) const
Check if the fingerprint matches another fingerprint acting as a filter.
friend uint32 GetTypeHash(const FFingerprint &Fingerprint)
Get the hash of a fingerprint.
Definition: Fingerprint.h:803
FFingerprint & operator+=(TSubclassOf< class UDetail > DetailType)
Add a single detail type.
Definition: Fingerprint.h:708
FFingerprint(const TSubclassOf< class UDetail > DetailType)
Construct a new fingerprint from a single detail type.
FFingerprint(const TArray< TSubclassOf< class UDetail >> &InDetailTypes, const EBootFilter InBootState=EBootFilter::None)
Construct a fingerprint from an array of types and a boot filter.
FFingerprint(const class UDetail *Detail)
Construct a new fingerprint from a single detail.
FFingerprint & operator+=(std::initializer_list< TSubclassOf< class UDetail >> DetailTypes)
Add variadic detail types.
Definition: Fingerprint.h:652
bool Add(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Add an arrary of detail types.
void Reset()
Clear the fingerprint without any deallocations.
Definition: Fingerprint.h:756
FFingerprint & operator=(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Set a fingerprint equal to an array of types.
Definition: Fingerprint.h:522
bool Add(std::initializer_list< TSubclassOf< class UDetail >> DetailTypes)
Add detail types to a fingerprint.
FFingerprint & operator-=(TSubclassOf< class UDetail > DetailType)
Remove a detail type from a fingerprint.
Definition: Fingerprint.h:729
bool Set(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Set a fingerprint to an array of types.
bool SetBootState(EBootFilter InBootState)
Set the new active boot state.
Definition: Fingerprint.h:227
FFingerprint & operator=(const FFingerprint &Fingerprint)
Set a fingerprint equal to another fingerprint.
Definition: Fingerprint.h:512
const FBitMask & GetDetailsMask() const
Get the details mask of the fingerprint.
Definition: Fingerprint.h:268
void GetMappingFrom(const FFingerprint &Fingerprint, TArray< TArray< int32 >> &OutMapping) const
Get an indexing multi-mapping from another fingerprint.
Definition: Fingerprint.h:374
bool Add(const TSet< class UDetail * > &InDetails)
Add a set of details.
static const FBitMask & GetExcludedDetailMask(const class UDetail *Detail)
Get the excluded mask of a details's type.
Definition: Fingerprint.h:205
FFingerprint()
Create an empty fingerprint.
Definition: Fingerprint.h:437
EBootFilter GetBootState() const
Get the active boot state.
Definition: Fingerprint.h:220
FFingerprint & operator=(const TArray< class UDetail * > &InDetails)
Set a fingerprint equal to an array of details.
Definition: Fingerprint.h:541
const TArray< TSubclassOf< class UDetail > > & GetDetails() const
Get the details of the fingerprint.
Definition: Fingerprint.h:255
FFingerprint(const class ISubjective *Subjective)
Construct a new fingerprint from a subjective.
bool Add(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Add a set of detail types.
void GetMappingTo(const FFingerprint &Fingerprint, TArray< int32 > &OutMapping) const
Definition: Fingerprint.h:362
void GetMappingFrom(const FFingerprint &Fingerprint, TArray< int32 > &OutMapping) const
Get an indexing mapping from another fingerprint.
Definition: Fingerprint.h:352
void GetMappingFrom(const TArray< TSubclassOf< class UDetail >> &Fingerprint, TArray< int32 > &OutMapping) const
Get an indexing mapping from another fingerprint defined by an array of details.
Definition: Fingerprint.h:319
TSubclassOf< class UDetail > DetailAt(const int32 Index) const
Get a detail by its index.
Definition: Fingerprint.h:273
void GetMappingTo(const FFingerprint &Fingerprint, TArray< TArray< int32 >> &OutMapping) const
Definition: Fingerprint.h:384
FFingerprint & operator=(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Set a fingerprint equal to a set of types.
Definition: Fingerprint.h:532
FFingerprint & operator=(const ISubjective *Subjective)
Set a fingerprint equal to an actor.
Definition: Fingerprint.h:559
bool ContainsDetail(const TSubclassOf< class UDetail > DetailType) const
Check whether a fingerprint contains a detail specification.
FFingerprint & operator+=(const TSet< UDetail * > &InDetails)
Add active details from a set.
Definition: Fingerprint.h:699
bool Add(const TArray< class UDetail * > &InDetails, const EBootFilter InBootState=EBootFilter::None)
Add an array of details and a boot state specification.
static const FBitMask & GetExcludedDetailMask(const TSubclassOf< class UDetail > DetailType)
Get the excluded mask of a detail type.
FFingerprint & operator+=(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Add an array of detail types.
Definition: Fingerprint.h:671
bool Contains(const FFingerprint &Fingerprint) const
Does the fingerprint fully includes another fingerprint?
Definition: Fingerprint.h:395
static const struct FFingerprint ZERO
Definition: Fingerprint.h:768
bool Contains(const TSubclassOf< class UDetail > DetailType) const
Check if the fingerprint includes a detail type.
Definition: Fingerprint.h:403
int32 GetDetailsCount() const
The number of details in the fingerprint.
Definition: Fingerprint.h:263
static const FBitMask & GetDetailMask(const class UDetail *Detail)
Get the cached mask of a detail's type.
Definition: Fingerprint.h:196
bool SetBooted(bool bState=true)
Set the new active boot state.
Definition: Fingerprint.h:239
FFingerprint & operator+=(const FFingerprint &Fingerprint)
Add a fingerprint specification.
Definition: Fingerprint.h:661
void GetMappingFrom(const TArray< TSubclassOf< class UDetail >> &Fingerprint, TArray< TArray< int32 >> &OutMapping) const
Get an indexing multi-mapping from another fingerprint defined by an array of details.
Definition: Fingerprint.h:336
FFingerprint & operator=(const TSet< class UDetail * > &InDetails)
Set a fingerprint equal to a set of details.
Definition: Fingerprint.h:550