27 #include "CoreUObject.h"
29 #include "UObject/Class.h"
34 #include "Fingerprint.generated.h"
39 FORCEINLINE uint32 GetTypeHash(
const UClass* Type)
41 return Type->GetUniqueID();
47 UENUM(BlueprintType, Meta = (Bitflags))
48 enum class EBootFilter : uint8
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")
68 ENUM_CLASS_FLAGS(EBootFilter)
73 FORCEINLINE uint32 GetTypeHash(
const EBootFilter BootFilter)
75 return (uint32)BootFilter;
81 FORCEINLINE UEnum* GetBootFilterClass()
83 auto EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(
"EBootFilter"),
true);
93 FORCEINLINE EBootFilter BootFilterFromState(
const bool bState)
95 return bState ? EBootFilter::Booted : EBootFilter::Halted;
101 FORCEINLINE FString BootFilterToString(
const EBootFilter BootFilter)
103 const UEnum* EnumPtr = GetBootFilterClass();
106 return FString(
"Invalid");
109 return EnumPtr->GetNameByValue((int64)BootFilter).ToString();
115 USTRUCT(BlueprintType, Meta = (HasNativeMake =
"ApparatusRuntime.ApparatusFunctionLibrary.MakeFingerprint"))
124 static int32 NextDetailId;
129 static TMap<const UClass*, int32> DetailIds;
134 static TMap<const UClass*, FBitMask> DetailsMasksByTypes;
139 static TMap<const UClass*, FBitMask> ExcludedDetailsMasksByTypes;
144 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
145 Meta = (AllowPrivateAccess =
"true"))
146 TArray<TSubclassOf<class UDetail>> Details;
153 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
154 Meta = (AllowPrivateAccess =
"true"))
160 friend uint32 GetTypeHash(
const FFingerprint& Fingerprint);
165 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Apparatus,
166 Meta = (AllowPrivateAccess =
"true"))
167 EBootFilter BootState = EBootFilter::None;
171 friend class AMechanism;
178 static int32 GetDetailId(
const TSubclassOf<class UDetail> DetailType);
198 return GetDetailMask(Detail->
GetClass());
207 return GetExcludedDetailMask(Detail->
GetClass());
214 return GetDetailMask(T::StaticType());
229 if (BootState == InBootState)
return false;
230 BootState = InBootState;
241 return SetBootState(bState ? EBootFilter::Booted : EBootFilter::Halted);
249 return BootState == EBootFilter::Booted;
255 FORCEINLINE
const TArray<TSubclassOf<class UDetail>>&
GetDetails()
const
273 FORCEINLINE TSubclassOf<class UDetail>
DetailAt(
const int32 Index)
const
275 return Details[Index];
281 FORCEINLINE
explicit operator TArray<TSubclassOf<class UDetail>>()
const
283 TArray<TSubclassOf<class UDetail>> Types;
284 for (
auto Detail : Details)
294 FORCEINLINE
explicit operator TSet<UClass*>()
const
297 for (
auto Detail : Details)
307 FORCEINLINE
operator bool()
const
309 return Details.Num() > 0 || BootState != EBootFilter::None;
320 TArray<int32>& OutMapping)
const
322 OutMapping.Reset(Fingerprint.Num());
323 for (int32 i = 0; i < Fingerprint.Num(); ++i)
325 OutMapping.Add(IndexOf(Fingerprint[i]));
337 TArray<TArray<int32>>& OutMapping)
const
339 OutMapping.Reset(Fingerprint.Num());
340 for (int32 i = 0; i < Fingerprint.Num(); ++i)
342 GetIndicesOf(Fingerprint[i], OutMapping.AddDefaulted_GetRef());
353 TArray<int32>& OutMapping)
const
356 for (
auto Detail : Fingerprint.Details)
358 OutMapping.Add(IndexOf(Detail));
363 TArray<int32>& OutMapping)
const
375 TArray<TArray<int32>>& OutMapping)
const
378 for (
auto Detail : Fingerprint.Details)
380 GetIndicesOf(Detail, OutMapping.AddDefaulted_GetRef());
385 TArray<TArray<int32>>& OutMapping)
const
403 FORCEINLINE
bool Contains(
const TSubclassOf<class UDetail> DetailType)
const
405 const FBitMask& Mask = GetDetailMask(DetailType);
406 return GetDetailsMask().Includes(Mask);
424 int32 IndexOf(
const TSubclassOf<class UDetail> DetailType)
const;
431 bool GetIndicesOf(
const TSubclassOf<class UDetail> DetailType,
432 TArray<int32>& OutIndices)
const;
463 template <
typename OtherAllocator>
464 FFingerprint(
const TArray<UDetail*, OtherAllocator>& Details,
465 const EBootFilter InBootState = EBootFilter::None);
472 const EBootFilter InBootState = EBootFilter::None);
487 bool Set(
const TArray<TSubclassOf<class UDetail>>& DetailTypes);
492 bool Set(
const TSet<TSubclassOf<class UDetail>>& DetailTypes);
497 bool Set(
const TArray<UDetail*>& InDetails,
const EBootFilter InBootState = EBootFilter::None);
502 bool Set(
const TSet<UDetail*>& Details);
522 operator=(
const TArray<TSubclassOf<class UDetail>>& DetailTypes)
532 operator=(
const TSet<TSubclassOf<class UDetail>>& DetailTypes)
570 bool Add(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes);
584 bool Add(
const FFingerprint& Fingerprint, EBootFilter InBootState);
591 bool Add(
const TArray<TSubclassOf<class UDetail>>& DetailTypes);
598 bool Add(
const TSet<TSubclassOf<class UDetail>>& DetailTypes);
605 bool Add(
const TArray<class UDetail*>& InDetails,
606 const EBootFilter InBootState = EBootFilter::None);
613 bool Add(
const TSet<class UDetail*>& InDetails);
621 bool Add(TSubclassOf<class UDetail> DetailType);
636 template <
class T> FORCEINLINE
bool Add() {
return Add(T::StaticClass()); }
646 bool ContainsDetail(
const class UDetail* Detail)
const;
652 operator+=(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
671 operator+=(
const TArray<TSubclassOf<class UDetail>>& DetailTypes)
681 operator+=(
const TSet<TSubclassOf<class UDetail>>& DetailTypes)
724 bool Remove(
const TSubclassOf<class UDetail> DetailType);
740 template <
class T> FORCEINLINE
bool Remove()
742 return Remove(T::StaticClass());
751 bool Remove(
const UDetail* Detail);
760 BootState = EBootFilter::None;
766 FString ToString()
const;
779 if (std::addressof(A) == std::addressof(B))
792 if (std::addressof(A) == std::addressof(B))
805 uint32 hash = 1519974369;
817 return Add(Fingerprint);
835 const EBootFilter InBootState)
839 return Add(InDetails, InBootState);
846 return Add(InDetails);
855 return Add(Subjective);
858 template <
typename OtherAllocator>
860 const EBootFilter InBootFilter)
861 : DetailsMask(NextDetailId),
862 BootState(InBootFilter)
864 for (
auto Detail : InDetails)
868 if (!Detail->IsEnabled())
872 if (DetailsMask.Includes(Mask))
874 DetailsMask.OrWith(Mask);
875 Details.Add(Detail->GetClass());
882 TEXT(
"The detail type must be provided for detail checks."));
884 return DetailsMask.Includes(Mask);
890 TEXT(
"The detail must be provided for detail checks."));
894 return DetailsMask.Includes(Mask);
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