28 #include "CoreUObject.h"
30 #include "UObject/Class.h"
33 #include "Fingerprint.h"
35 #include "Filter.generated.h"
40 USTRUCT(BlueprintType,
41 Meta = (HasNativeMake =
"ApparatusRuntime.ApparatusFunctionLibrary.MakeFilter",
42 HasNativeBreak =
"ApparatusRuntime.ApparatusFunctionLibrary.BreakFilter"))
51 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
52 Meta = (AllowPrivateAccess =
"true"))
58 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
59 Meta = (AllowPrivateAccess =
"true"))
60 TArray<TSubclassOf<class UDetail>> ExcludedDetails;
65 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
66 Meta = (AllowPrivateAccess =
"true"))
67 mutable FBitMask ExcludedDetailsMask;
72 friend uint32 GetTypeHash(
const FFilter& Filter);
104 FORCEINLINE
const TArray<TSubclassOf<class UDetail>>&
GetDetails()
const
106 return Fingerprint.Details;
114 return ExcludedDetails;
137 return ExcludedDetailsMask;
143 FORCEINLINE TSubclassOf<class UDetail>
DetailAt(
const int32 Index)
const
145 return Fingerprint.Details[Index];
153 return ExcludedDetails[Index];
162 return (Fingerprint.Details.Num() > 0) ||
163 (ExcludedDetails.Num() > 0) ||
164 (Fingerprint.BootState != EBootFilter::None);
170 FORCEINLINE
operator bool()
const
172 return IsEffective();
179 FORCEINLINE int32
IndexOf(
const TSubclassOf<class UDetail> DetailType)
const
181 return Fingerprint.
IndexOf(DetailType);
188 FORCEINLINE
bool GetIndicesOf(
const TSubclassOf<class UDetail> DetailType,
189 TArray<int32>& OutIndices)
const
191 return Fingerprint.
GetIndicesOf(DetailType, OutIndices);
203 : Fingerprint(InFingerprint)
211 : Fingerprint(Subjective)
224 FORCEINLINE
FFilter(
const TSubclassOf<class UDetail> DetailType): Fingerprint(DetailType)
230 FORCEINLINE
FFilter(
const TArray<TSubclassOf<class UDetail>>& DetailTypes): Fingerprint(DetailTypes)
236 FORCEINLINE
FFilter(
const TSet<TSubclassOf<class UDetail>>& DetailTypes): Fingerprint(DetailTypes)
242 FORCEINLINE
FFilter(
const TArray<UDetail*>& Details): Fingerprint(Details)
248 FFilter(
const TArray<TSubclassOf<class UDetail>>& Types,
249 const TArray<TSubclassOf<class UDetail>>& ExcludedTypes);
254 FFilter(
const TArray<TSubclassOf<class UDetail>>& Types,
255 const TArray<TSubclassOf<class UDetail>>& ExcludedTypes,
256 const EBootFilter InBootFilter);
262 : Fingerprint(Filter.Fingerprint),
263 ExcludedDetails(Filter.ExcludedDetails),
264 ExcludedDetailsMask(Filter.ExcludedDetailsMask)
270 void Set(
const FFilter& Filter);
275 void Set(
const TArray<TSubclassOf<class UDetail>>& DetailTypes);
280 void Set(
const TSet<TSubclassOf<class UDetail>>& DetailTypes);
285 void Set(
const TArray<UDetail*>& Details);
290 void Set(
const TSet<UDetail*>& Details);
310 operator=(
const TArray<TSubclassOf<class UDetail>>& DetailTypes)
320 operator=(
const TSet<TSubclassOf<class UDetail>>& DetailTypes)
356 FORCEINLINE
void Include(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
358 Fingerprint.
Add(DetailTypes);
364 FORCEINLINE
void Include(
const TArray<TSubclassOf<class UDetail>>& DetailTypes)
366 Fingerprint.
Add(DetailTypes);
372 FORCEINLINE
void Include(
const TSet<TSubclassOf<class UDetail>>& DetailTypes)
374 Fingerprint.
Add(DetailTypes);
380 FORCEINLINE
void Include(
const TArray<class UDetail*>& Details)
382 Fingerprint.
Add(Details);
388 FORCEINLINE
void Include(
const TSet<class UDetail*>& Details)
390 Fingerprint.
Add(Details);
398 Fingerprint.
Add(InFingerprint);
407 FORCEINLINE
void Include(TSubclassOf<class UDetail> DetailType)
409 Fingerprint.
Add(DetailType);
420 Fingerprint.
Add(Subjective);
427 Includes(
const TSubclassOf<class UDetail> DetailType)
const
429 return Fingerprint.
Contains(DetailType);
438 return Fingerprint.
Contains(Detail);
447 return ExcludedDetailsMask.
Includes(Mask);
453 template <
class T> FORCEINLINE
bool Include() {
return Include(T::StaticClass()); }
459 operator+=(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
461 Include(DetailTypes);
471 Include(InFingerprint);
479 operator+=(
const TArray<TSubclassOf<class UDetail>>& DetailTypes)
481 Include(DetailTypes);
489 operator+=(
const TSet<TSubclassOf<class UDetail>>& DetailTypes)
491 Include(DetailTypes);
538 return Fingerprint.
Remove(DetailType);
548 return RemoveInclusion(T::StaticClass());
559 return Fingerprint.
Remove(Detail);
567 RemoveInclusion(DetailType);
577 ExcludedDetails.Reset();
578 ExcludedDetailsMask.
Reset();
584 bool Matches(
const FFilter& Filter)
const;
593 FString ToString()
const;
600 if (std::addressof(A) == std::addressof(B))
603 if (A.Fingerprint != B.Fingerprint)
613 if (std::addressof(A) == std::addressof(B))
616 if (A.Fingerprint != B.Fingerprint)
626 uint32 hash = 1519974369;
628 hash = hash * 1521134295 +
GetTypeHash(Filter.Fingerprint);
642 return Fingerprint.Matches(Filter) &&
650 Fingerprint = Filter.Fingerprint;
651 ExcludedDetails = Filter.ExcludedDetails;
652 ExcludedDetailsMask = Filter.ExcludedDetailsMask;
655 FORCEINLINE
void FFilter::Set(
const TArray<TSubclassOf<UDetail>>& Types)
662 FORCEINLINE
void FFilter::Set(
const TSet<TSubclassOf<UDetail>>& Types)
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
The main Mechanism function library.
Definition: Mechanism.h:63
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 IncludesPartially(const FBitMask &BitMask) const
Check if the mask has any of the bits set in the supplied mask.
Definition: BitMask.h:260
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
FFilter(const TArray< TSubclassOf< class UDetail >> &Types, const TArray< TSubclassOf< class UDetail >> &ExcludedTypes, const EBootFilter InBootFilter)
Construct a filter from an array of types and excluded types.
FFilter & operator=(const TSet< class UDetail * > &Details)
Set the filter equal to a set of details.
Definition: Filter.h:338
friend uint32 GetTypeHash(const FFilter &Filter)
Get the hash of a filter.
Definition: Filter.h:624
FFilter & operator+=(std::initializer_list< TSubclassOf< class UDetail >> DetailTypes)
Include variadic detail types.
Definition: Filter.h:459
void Include(TSubclassOf< class UDetail > DetailType)
Add a detail type.
Definition: Filter.h:407
const FBitMask & GetExcludedDetailsMask() const
Get the excluded details mask of the filter.
Definition: Filter.h:135
const FFingerprint & GetFingerprint() const
Get the inclusive fingerprint of the filter.
Definition: Filter.h:96
const TArray< TSubclassOf< class UDetail > > & GetExcludedDetails() const
Get the excluded details of the filter.
Definition: Filter.h:112
FFilter(const class ISubjective *Subjective)
Initializes the filter from the active details of a subjective.
Definition: Filter.h:210
void SetBootFilter(EBootFilter NewBootFilter)
Set the new active boot filter.
Definition: Filter.h:88
bool Includes(const TSubclassOf< class UDetail > DetailType) const
Check whether a filter contains a detail specification.
Definition: Filter.h:427
FFilter(const TSubclassOf< class UDetail > DetailType)
Construct a new filter from a single detail type.
Definition: Filter.h:224
FFilter & operator+=(const TSet< UDetail * > &InDetails)
Add active details from a set.
Definition: Filter.h:509
FFilter & operator+=(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Add an array of detail types.
Definition: Filter.h:479
void Set(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Set a filter to an array of types.
void Set(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Set a filter to a set of types.
FFilter & operator=(const ISubjective *Subjective)
Set the filter equal to the list of active details of a subjective.
Definition: Filter.h:347
const TArray< TSubclassOf< class UDetail > > & GetDetails() const
Get the included details of the filter.
Definition: Filter.h:104
TSubclassOf< class UDetail > DetailAt(const int32 Index) const
Get an included detail by its index.
Definition: Filter.h:143
FFilter(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Construct a filter from a set of types.
Definition: Filter.h:236
TSubclassOf< class UDetail > ExcludedDetailAt(const int32 Index) const
Get an excluded detail by its index.
Definition: Filter.h:151
friend bool operator!=(const FFilter &A, const FFilter &B)
Definition: Filter.h:611
FFilter & operator+=(TSubclassOf< class UDetail > DetailType)
Add a single detail type.
Definition: Filter.h:519
const FBitMask & GetDetailsMask() const
Get the included details mask of the filter.
Definition: Filter.h:130
void Reset()
Clear the fingerprint without any deallocations.
Definition: Filter.h:574
bool IsEffective() const
Check if the filter is viable and actually be passed.
Definition: Filter.h:160
FFilter & operator=(const FFilter &Filter)
Set a filter equal to another filter.
Definition: Filter.h:300
bool Matches(const FFilter &Filter) const
Check if the filter matches an another filter.
Definition: Filter.h:640
FFilter(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Construct a filter from an array of types.
Definition: Filter.h:230
bool RemoveInclusion(const TSubclassOf< class UDetail > DetailType)
Remove a detail type from the fingerprint specification.
Definition: Filter.h:536
FFilter(const FFilter &Filter)
Initializes the filter as a copy of another one.
Definition: Filter.h:261
bool RemoveInclusion(const UDetail *Detail)
Remove an included detail from the filter, but only if the detail is currently active.
Definition: Filter.h:557
EBootFilter GetBootFilter() const
Get the active boot filter.
Definition: Filter.h:83
void Set(const FFilter &Filter)
Set a filter equal to another filter.
Definition: Filter.h:646
void Include(const TSet< class UDetail * > &Details)
Add a set of details as inclusions.
Definition: Filter.h:388
FFilter(const TArray< TSubclassOf< class UDetail >> &Types, const TArray< TSubclassOf< class UDetail >> &ExcludedTypes)
Construct a filter from an array of included and excluded types.
void Include(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Add a set of detail types as inclusions.
Definition: Filter.h:372
FFilter()
Initializes the empty filter.
Definition: Filter.h:197
int32 GetExcludedDetailsCount() const
The number of excluded details in the filter.
Definition: Filter.h:125
FFilter(const TArray< UDetail * > &Details)
Construct a filter from an array of details.
Definition: Filter.h:242
FFilter & operator+=(const TArray< UDetail * > &InDetails)
Add active details from an array.
Definition: Filter.h:499
int32 GetDetailsCount() const
The number of included details in the filter.
Definition: Filter.h:120
FFilter & operator=(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Set the filter equal to a set of types.
Definition: Filter.h:320
FFilter & operator=(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Set the filter equal to an array of detail types.
Definition: Filter.h:310
FFilter & operator-=(TSubclassOf< class UDetail > DetailType)
Remove an included detail from the filter.
Definition: Filter.h:565
FFilter & operator+=(const struct FFingerprint &InFingerprint)
Include a fingerprint within the filter.
Definition: Filter.h:469
void Set(const ISubjective *Subjective)
Set a filter to a list of details of the actor.
static struct FFilter ZERO
Definition: Filter.h:595
void Include(const TArray< class UDetail * > &Details)
Add an array of details as inclusions.
Definition: Filter.h:380
void Include(std::initializer_list< TSubclassOf< class UDetail >> DetailTypes)
Add a variadic list of types as inclusions.
Definition: Filter.h:356
void Include(const FFingerprint &InFingerprint)
Include a fingerprint within the filter.
Definition: Filter.h:396
FFilter(const FFingerprint &InFingerprint)
Initialize a filter based on a fingerprint.
Definition: Filter.h:202
FFilter & operator=(const TArray< class UDetail * > &Details)
Set the filter equal to an array of active details.
Definition: Filter.h:329
void Include(const ISubjective *Subjective)
Add all of the current active details of a subject as inclusions.
Definition: Filter.h:418
bool Excludes(const TSubclassOf< class UDetail > Type)
Check if the filter excludes a specific detail type.
Definition: Filter.h:445
void Include(const TArray< TSubclassOf< class UDetail >> &DetailTypes)
Add an arrary of detail types as inclusions.
Definition: Filter.h:364
friend bool operator==(const FFilter &A, const FFilter &B)
Definition: Filter.h:598
int32 IndexOf(const TSubclassOf< class UDetail > DetailType) const
Get the index of a specific detail type.
Definition: Filter.h:179
bool RemoveInclusion()
Remove an included detail from the filter.
Definition: Filter.h:546
FFilter(const class UDetail *Detail)
Initializes the filter from a single detail (if it is active).
Definition: Filter.h:218
bool Includes(const class UDetail *Detail) const
Checks whether a filter contains a detail, if it's currently active.
Definition: Filter.h:436
bool Include()
Include a generic detail type.
Definition: Filter.h:453
bool GetIndicesOf(const TSubclassOf< class UDetail > DetailType, TArray< int32 > &OutIndices) const
Get the indices of a specific detail type.
Definition: Filter.h:188
FFilter & operator+=(const TSet< TSubclassOf< class UDetail >> &DetailTypes)
Add a set of detail types.
Definition: Filter.h:489
The details fingerprint.
Definition: Fingerprint.h:117
bool Remove(const TSubclassOf< class UDetail > DetailType)
Remove a detail type from the fingerprint specification.
bool Matches(const struct FFilter &Filter) const
Check if the fingerprint matches a filter.
void Reset()
Clear the fingerprint without any deallocations.
Definition: Fingerprint.h:756
bool Add(std::initializer_list< TSubclassOf< class UDetail >> DetailTypes)
Add detail types to a fingerprint.
bool SetBootState(EBootFilter InBootState)
Set the new active boot state.
Definition: Fingerprint.h:227
const FBitMask & GetDetailsMask() const
Get the details mask of the fingerprint.
Definition: Fingerprint.h:268
EBootFilter GetBootState() const
Get the active boot state.
Definition: Fingerprint.h:220
int32 IndexOf(const TSubclassOf< class UDetail > DetailType) const
Get the index of a specific detail type.
Definition: Fingerprint.cpp:229
bool GetIndicesOf(const TSubclassOf< class UDetail > DetailType, TArray< int32 > &OutIndices) const
Get the indices of a specific detail type.
Definition: Fingerprint.cpp:264
static const FBitMask & GetExcludedDetailMask(const TSubclassOf< class UDetail > DetailType)
Get the excluded mask of a detail type.
bool Contains(const FFingerprint &Fingerprint) const
Does the fingerprint fully includes another fingerprint?
Definition: Fingerprint.h:395