Apparatus Version 1.0.0
ECS-like data-driven workflow for Unreal Engine.
Filter.h
1 /*
2  * ░▒▓ APPARATUS ▓▒░
3  *
4  * File: Filter.h
5  * Created: Friday, 23rd October 2020 7:00:48 pm
6  * Author: Vladislav Dmitrievich Turbanov (vladislav@turbanov.ru)
7  * ───────────────────────────────────────────────────────────────────
8  * Last Modified: Friday, 26th March 2021 5:16:52 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 2021 - 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 "BitMask.h"
28 #include "CoreUObject.h"
29 #include "Engine.h"
30 #include "UObject/Class.h"
31 
32 #include "Detail.h"
33 #include "Fingerprint.h"
34 
35 #include "Filter.generated.h"
36 
40 USTRUCT(BlueprintType,
41  Meta = (HasNativeMake = "ApparatusRuntime.ApparatusFunctionLibrary.MakeFilter",
42  HasNativeBreak = "ApparatusRuntime.ApparatusFunctionLibrary.BreakFilter"))
43 struct APPARATUSRUNTIME_API FFilter
44 {
45  GENERATED_BODY()
46 
47  private:
51  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
52  Meta = (AllowPrivateAccess = "true"))
53  FFingerprint Fingerprint;
54 
58  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
59  Meta = (AllowPrivateAccess = "true"))
60  TArray<TSubclassOf<class UDetail>> ExcludedDetails;
61 
65  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Apparatus,
66  Meta = (AllowPrivateAccess = "true"))
67  mutable FBitMask ExcludedDetailsMask;
68 
72  friend uint32 GetTypeHash(const FFilter& Filter);
73 
74  friend class UBelt;
75  friend class UMechanism;
77 
78  public:
79 
83  FORCEINLINE EBootFilter GetBootFilter() const { return Fingerprint.GetBootState(); }
84 
88  FORCEINLINE void SetBootFilter(EBootFilter NewBootFilter)
89  {
90  Fingerprint.SetBootState(NewBootFilter);
91  }
92 
96  FORCEINLINE const FFingerprint& GetFingerprint() const
97  {
98  return Fingerprint;
99  }
100 
104  FORCEINLINE const TArray<TSubclassOf<class UDetail>>& GetDetails() const
105  {
106  return Fingerprint.Details;
107  }
108 
112  FORCEINLINE const TArray<TSubclassOf<class UDetail>>& GetExcludedDetails() const
113  {
114  return ExcludedDetails;
115  }
116 
120  FORCEINLINE int32 GetDetailsCount() const { return Fingerprint.Details.Num(); }
121 
125  FORCEINLINE int32 GetExcludedDetailsCount() const { return ExcludedDetails.Num(); }
126 
130  FORCEINLINE const FBitMask& GetDetailsMask() const { return Fingerprint.DetailsMask; }
131 
135  FORCEINLINE const FBitMask& GetExcludedDetailsMask() const
136  {
137  return ExcludedDetailsMask;
138  }
139 
143  FORCEINLINE TSubclassOf<class UDetail> DetailAt(const int32 Index) const
144  {
145  return Fingerprint.Details[Index];
146  }
147 
151  FORCEINLINE TSubclassOf<class UDetail> ExcludedDetailAt(const int32 Index) const
152  {
153  return ExcludedDetails[Index];
154  }
155 
160  FORCEINLINE bool IsEffective() const
161  {
162  return (Fingerprint.Details.Num() > 0) ||
163  (ExcludedDetails.Num() > 0) ||
164  (Fingerprint.BootState != EBootFilter::None);
165  }
166 
170  FORCEINLINE operator bool() const
171  {
172  return IsEffective();
173  }
174 
179  FORCEINLINE int32 IndexOf(const TSubclassOf<class UDetail> DetailType) const
180  {
181  return Fingerprint.IndexOf(DetailType);
182  }
183 
188  FORCEINLINE bool GetIndicesOf(const TSubclassOf<class UDetail> DetailType,
189  TArray<int32>& OutIndices) const
190  {
191  return Fingerprint.GetIndicesOf(DetailType, OutIndices);
192  }
193 
197  FORCEINLINE FFilter() {}
198 
202  FORCEINLINE FFilter(const FFingerprint& InFingerprint)
203  : Fingerprint(InFingerprint)
204  {
205  }
206 
210  FORCEINLINE FFilter(const class ISubjective* Subjective)
211  : Fingerprint(Subjective)
212  {
213  }
214 
218  FORCEINLINE FFilter(const class UDetail* Detail): Fingerprint(Detail)
219  {}
220 
224  FORCEINLINE FFilter(const TSubclassOf<class UDetail> DetailType): Fingerprint(DetailType)
225  {}
226 
230  FORCEINLINE FFilter(const TArray<TSubclassOf<class UDetail>>& DetailTypes): Fingerprint(DetailTypes)
231  {}
232 
236  FORCEINLINE FFilter(const TSet<TSubclassOf<class UDetail>>& DetailTypes): Fingerprint(DetailTypes)
237  {}
238 
242  FORCEINLINE FFilter(const TArray<UDetail*>& Details): Fingerprint(Details)
243  {}
244 
248  FFilter(const TArray<TSubclassOf<class UDetail>>& Types,
249  const TArray<TSubclassOf<class UDetail>>& ExcludedTypes);
250 
254  FFilter(const TArray<TSubclassOf<class UDetail>>& Types,
255  const TArray<TSubclassOf<class UDetail>>& ExcludedTypes,
256  const EBootFilter InBootFilter);
257 
261  FORCEINLINE FFilter(const FFilter& Filter)
262  : Fingerprint(Filter.Fingerprint),
263  ExcludedDetails(Filter.ExcludedDetails),
264  ExcludedDetailsMask(Filter.ExcludedDetailsMask)
265  {}
266 
270  void Set(const FFilter& Filter);
271 
275  void Set(const TArray<TSubclassOf<class UDetail>>& DetailTypes);
276 
280  void Set(const TSet<TSubclassOf<class UDetail>>& DetailTypes);
281 
285  void Set(const TArray<UDetail*>& Details);
286 
290  void Set(const TSet<UDetail*>& Details);
291 
295  void Set(const ISubjective* Subjective);
296 
300  FORCEINLINE FFilter& operator=(const FFilter& Filter)
301  {
302  Set(Filter);
303  return *this;
304  }
305 
309  FORCEINLINE FFilter&
310  operator=(const TArray<TSubclassOf<class UDetail>>& DetailTypes)
311  {
312  Set(DetailTypes);
313  return *this;
314  }
315 
319  FORCEINLINE FFilter&
320  operator=(const TSet<TSubclassOf<class UDetail>>& DetailTypes)
321  {
322  Set(DetailTypes);
323  return *this;
324  }
325 
329  FORCEINLINE FFilter& operator=(const TArray<class UDetail*>& Details)
330  {
331  Set(Details);
332  return *this;
333  }
334 
338  FORCEINLINE FFilter& operator=(const TSet<class UDetail*>& Details)
339  {
340  Set(Details);
341  return *this;
342  }
343 
347  FORCEINLINE FFilter& operator=(const ISubjective* Subjective)
348  {
349  Set(Subjective);
350  return *this;
351  }
352 
356  FORCEINLINE void Include(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
357  {
358  Fingerprint.Add(DetailTypes);
359  }
360 
364  FORCEINLINE void Include(const TArray<TSubclassOf<class UDetail>>& DetailTypes)
365  {
366  Fingerprint.Add(DetailTypes);
367  }
368 
372  FORCEINLINE void Include(const TSet<TSubclassOf<class UDetail>>& DetailTypes)
373  {
374  Fingerprint.Add(DetailTypes);
375  }
376 
380  FORCEINLINE void Include(const TArray<class UDetail*>& Details)
381  {
382  Fingerprint.Add(Details);
383  }
384 
388  FORCEINLINE void Include(const TSet<class UDetail*>& Details)
389  {
390  Fingerprint.Add(Details);
391  }
392 
396  FORCEINLINE void Include(const FFingerprint& InFingerprint)
397  {
398  Fingerprint.Add(InFingerprint);
399  }
400 
407  FORCEINLINE void Include(TSubclassOf<class UDetail> DetailType)
408  {
409  Fingerprint.Add(DetailType);
410  }
411 
418  FORCEINLINE void Include(const ISubjective* Subjective)
419  {
420  Fingerprint.Add(Subjective);
421  }
422 
426  FORCEINLINE bool
427  Includes(const TSubclassOf<class UDetail> DetailType) const
428  {
429  return Fingerprint.Contains(DetailType);
430  }
431 
435  FORCEINLINE bool
436  Includes(const class UDetail* Detail) const
437  {
438  return Fingerprint.Contains(Detail);
439  }
440 
444  FORCEINLINE bool
445  Excludes(const TSubclassOf<class UDetail> Type) {
446  const FBitMask& Mask = FFingerprint::GetExcludedDetailMask(Type);
447  return ExcludedDetailsMask.Includes(Mask);
448  }
449 
453  template <class T> FORCEINLINE bool Include() { return Include(T::StaticClass()); }
454 
458  FORCEINLINE FFilter&
459  operator+=(std::initializer_list<TSubclassOf<class UDetail>> DetailTypes)
460  {
461  Include(DetailTypes);
462  return *this;
463  }
464 
468  FORCEINLINE FFilter&
469  operator+=(const struct FFingerprint& InFingerprint)
470  {
471  Include(InFingerprint);
472  return *this;
473  }
474 
478  FORCEINLINE FFilter&
479  operator+=(const TArray<TSubclassOf<class UDetail>>& DetailTypes)
480  {
481  Include(DetailTypes);
482  return *this;
483  }
484 
488  FORCEINLINE FFilter&
489  operator+=(const TSet<TSubclassOf<class UDetail>>& DetailTypes)
490  {
491  Include(DetailTypes);
492  return *this;
493  }
494 
498  FORCEINLINE FFilter&
499  operator+=(const TArray<UDetail*>& InDetails)
500  {
501  Include(InDetails);
502  return *this;
503  }
504 
508  FORCEINLINE FFilter&
509  operator+=(const TSet<UDetail*>& InDetails)
510  {
511  Include(InDetails);
512  return *this;
513  }
514 
518  FORCEINLINE FFilter&
519  operator+=(TSubclassOf<class UDetail> DetailType)
520  {
521  Include(DetailType);
522  return *this;
523  }
524 
535  FORCEINLINE bool
536  RemoveInclusion(const TSubclassOf<class UDetail> DetailType)
537  {
538  return Fingerprint.Remove(DetailType);
539  }
540 
546  template <class T> FORCEINLINE bool RemoveInclusion()
547  {
548  return RemoveInclusion(T::StaticClass());
549  }
550 
557  FORCEINLINE bool RemoveInclusion(const UDetail* Detail)
558  {
559  return Fingerprint.Remove(Detail);
560  }
561 
565  FORCEINLINE FFilter& operator-=(TSubclassOf<class UDetail> DetailType)
566  {
567  RemoveInclusion(DetailType);
568  return *this;
569  }
570 
574  FORCEINLINE void Reset()
575  {
576  Fingerprint.Reset();
577  ExcludedDetails.Reset();
578  ExcludedDetailsMask.Reset();
579  }
580 
584  bool Matches(const FFilter& Filter) const;
585 
586  friend bool operator==(const FFilter& A, const FFilter& B);
587 
588  friend bool operator!=(const FFilter& A, const FFilter& B);
589 
593  FString ToString() const;
594 
595  static struct FFilter ZERO;
596 }; // USTRUCT Filter
597 
598 FORCEINLINE bool operator==(const FFilter& A, const FFilter& B)
599 {
600  if (std::addressof(A) == std::addressof(B))
601  return true;
602 
603  if (A.Fingerprint != B.Fingerprint)
604  return false;
606  return false;
607 
608  return true;
609 }
610 
611 FORCEINLINE bool operator!=(const FFilter& A, const FFilter& B)
612 {
613  if (std::addressof(A) == std::addressof(B))
614  return false;
615 
616  if (A.Fingerprint != B.Fingerprint)
617  return true;
619  return true;
620 
621  return false;
622 }
623 
624 FORCEINLINE uint32 GetTypeHash(const FFilter& Filter)
625 {
626  uint32 hash = 1519974369;
627 
628  hash = hash * 1521134295 + GetTypeHash(Filter.Fingerprint);
629  hash = hash * 1521134295 + GetTypeHash(Filter.GetExcludedDetailsMask());
630 
631  return hash;
632 }
633 
634 FORCEINLINE bool FFingerprint::Matches(const FFilter& Filter) const
635 {
636  return Matches(Filter.GetFingerprint()) &&
638 }
639 
640 FORCEINLINE bool FFilter::Matches(const FFilter& Filter) const
641 {
642  return Fingerprint.Matches(Filter) &&
643  !ExcludedDetailsMask.IncludesPartially(Filter.GetDetailsMask());
644 }
645 
646 inline void FFilter::Set(const FFilter& Filter)
647 {
648  Reset();
649 
650  Fingerprint = Filter.Fingerprint;
651  ExcludedDetails = Filter.ExcludedDetails;
652  ExcludedDetailsMask = Filter.ExcludedDetailsMask;
653 }
654 
655 FORCEINLINE void FFilter::Set(const TArray<TSubclassOf<UDetail>>& Types)
656 {
657  Reset();
658 
659  Include(Types);
660 }
661 
662 FORCEINLINE void FFilter::Set(const TSet<TSubclassOf<UDetail>>& Types)
663 {
664  Reset();
665 
666  Include(Types);
667 }
668 
669 FORCEINLINE void FFilter::Set(const TArray<UDetail*>& Details)
670 {
671  Reset();
672 
673  Include(Details);
674 }
675 
676 FORCEINLINE void FFilter::Set(const TSet<UDetail*>& Details)
677 {
678  Reset();
679 
680  Include(Details);
681 }
682 
683 FORCEINLINE void FFilter::Set(const class ISubjective* Subjective)
684 {
685  check(Subjective);
686 
687  Reset();
688 
689  Include(Subjective);
690 }
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