UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TwoWayMap.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Map.h"
6
8template<typename ClassT, typename FirstType, typename SecondType>
10{
12
14 {
16 return FirstToSecond;
17 }
18
20 {
22 return SecondToFirst;
23 }
24 static void InitIfNeeded()
25 {
26 if (FirstToSecond.Num() == 0 || SecondToFirst.Num() == 0)
27 {
28 FirstToSecond.Reserve(ClassT::PairDefinitions.Num());
29 SecondToFirst.Reserve(ClassT::PairDefinitions.Num());
30
31 for (const TPair<FirstType, SecondType>& Pair : ClassT::PairDefinitions)
32 {
33 FirstToSecond.Emplace(Pair.Key, Pair.Value);
34 SecondToFirst.Emplace(Pair.Value, Pair.Key);
35 }
36
37 ClassT::PairDefinitions.Reset();
38 }
39 }
40
41protected:
44};
45
46template<typename DomainType, typename RangeType>
48{
49protected:
51 {
53 const RangeType Y;
54 };
55
56public:
57 TBijectionMaps() = delete;
58
59 constexpr TBijectionMaps(const std::initializer_list<FPairValue>& InitList)
60 {
61 // TODO: Run compile time check to make sure all keys and values are unique
62 for (const FPairValue& Pair : InitList)
63 {
64 if (ensureAlwaysMsgf(!Image.Contains(Pair.X), TEXT("This cannot be a bijection if there is a duplicate domain entry")))
65 {
66 Image.Emplace(Pair.X, Pair.Y);
67 }
68 if (ensureAlwaysMsgf(!PreImage.Contains(Pair.Y), TEXT("This cannot be a bijection if there is a duplicate range entry")))
69 {
70 PreImage.Emplace(Pair.Y, Pair.X);
71 }
72 }
73 }
74
75 constexpr const DomainType* Find(const RangeType& InValue) const
76 {
77 return PreImage.Find(InValue);
78 }
79
80 constexpr const DomainType& FindChecked(const RangeType& InValue) const
81 {
82 return PreImage[InValue];
83 }
84
85 constexpr const RangeType* Find(const DomainType& InValue) const
86 {
87 return Image.Find(InValue);
88 }
89
90 constexpr const RangeType& FindChecked(const DomainType& InValue) const
91 {
92 return Image[InValue];
93 }
94
95private:
98};
#define ensureAlwaysMsgf(InExpression, InFormat,...)
Definition AssertionMacros.h:467
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition TwoWayMap.h:51
const RangeType Y
Definition TwoWayMap.h:53
const DomainType X
Definition TwoWayMap.h:52
Definition TwoWayMap.h:48
constexpr const DomainType * Find(const RangeType &InValue) const
Definition TwoWayMap.h:75
TBijectionMaps()=delete
constexpr const RangeType & FindChecked(const DomainType &InValue) const
Definition TwoWayMap.h:90
constexpr const DomainType & FindChecked(const RangeType &InValue) const
Definition TwoWayMap.h:80
constexpr TBijectionMaps(const std::initializer_list< FPairValue > &InitList)
Definition TwoWayMap.h:59
constexpr const RangeType * Find(const DomainType &InValue) const
Definition TwoWayMap.h:85
Definition Tuple.h:652
Definition TwoWayMap.h:10
static const TMap< SecondType, FirstType > & GetSecondToFirst()
Definition TwoWayMap.h:19
static const TMap< FirstType, SecondType > & GetFirstToSecond()
Definition TwoWayMap.h:13
static void InitIfNeeded()
Definition TwoWayMap.h:24
static TMap< FirstType, SecondType > FirstToSecond
Definition TwoWayMap.h:42
TArray< TPair< FirstType, SecondType > > InitListType
Definition TwoWayMap.h:11
static TMap< SecondType, FirstType > SecondToFirst
Definition TwoWayMap.h:43