UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IntOrInfinity.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include <cstdint>
8
9namespace uLang
10{
11// Encodes either an integer or positive/negative infinity.
12enum class EInfinitySign
13{
16};
21
22template <EInfinitySign InfinitySign>
24{
26 : MaybeFiniteInt(InFiniteInt)
27 {
28 }
29
30 static TIntOrInfinity Infinity() { return TIntOrInfinity(); }
31
32 friend bool operator==(int64_t Lhs, const TIntOrInfinity& Rhs)
33 {
34 return Rhs.IsFinite() && Lhs == Rhs.GetFiniteInt();
35 }
36 friend bool operator<(int64_t Lhs, const TIntOrInfinity& Rhs)
37 {
38 return Rhs.IsInfinity()
40 : Lhs < Rhs.GetFiniteInt();
41 }
42 friend bool operator>(int64_t Lhs, const TIntOrInfinity& Rhs)
43 {
44 return Rhs.IsInfinity()
46 : Lhs > Rhs.GetFiniteInt();
47 }
48 friend bool operator<=(int64_t Lhs, const TIntOrInfinity& Rhs) { return Lhs == Rhs || Lhs < Rhs; }
49 friend bool operator>=(int64_t Lhs, const TIntOrInfinity& Rhs) { return Lhs == Rhs || Lhs > Rhs; }
50
51 friend bool operator<(const TIntOrInfinity& Lhs, int64_t Rhs) { return Rhs > Lhs; }
52 friend bool operator>(const TIntOrInfinity& Lhs, int64_t Rhs) { return Rhs < Lhs; }
53 friend bool operator<=(const TIntOrInfinity& Lhs, int64_t Rhs) { return Rhs == Lhs || Rhs > Lhs; }
54 friend bool operator>=(const TIntOrInfinity& Lhs, int64_t Rhs) { return Rhs == Lhs || Rhs < Lhs; }
55
56 bool IsInfinity() const { return !IsFinite(); }
57 bool IsFinite() const { return MaybeFiniteInt.IsSet(); }
58 int64_t GetFiniteInt() const { return MaybeFiniteInt.GetValue(); }
59
60 bool IsSafeToNegate() const
61 {
62 if (MaybeFiniteInt)
63 {
64 return *MaybeFiniteInt != INT64_MIN;
65 }
66 return true;
67 }
68
69private:
70 TOptional<int64_t> MaybeFiniteInt;
71
73 {
74 }
75};
76
79
80template<EInfinitySign LhsSign, EInfinitySign RhsSign>
82{
83 if (Lhs.IsInfinity())
84 {
85 return Rhs.IsInfinity() && LhsSign == RhsSign;
86 }
87 else
88 {
89 return Rhs.IsFinite() && Lhs.GetFiniteInt() == Rhs.GetFiniteInt();
90 }
91}
92
93template<EInfinitySign LhsSign, EInfinitySign RhsSign>
95{
96 if (Lhs.IsInfinity() && Rhs.IsInfinity())
97 {
100 }
101 else if (Lhs.IsInfinity())
102 {
104 }
105 else if (Rhs.IsInfinity())
106 {
108 }
109 else
110 {
111 return Lhs.GetFiniteInt() < Rhs.GetFiniteInt();
112 }
113}
114template<EInfinitySign LhsSign, EInfinitySign RhsSign>
116{
117 return Lhs == Rhs || Lhs < Rhs;
118}
119template<EInfinitySign LhsSign, EInfinitySign RhsSign>
121{
122 return Rhs < Lhs;
123}
124template<EInfinitySign LhsSign, EInfinitySign RhsSign>
126{
127 return Lhs == Rhs || Rhs < Lhs;
128}
129
130template<EInfinitySign OperandSign>
132{
133 if (Operand.IsInfinity())
134 {
136 }
137 else
138 {
139 ULANG_ASSERTF(Operand.GetFiniteInt() != INT64_MIN, "Can't negate INT64_MIN");
140 return TIntOrInfinity<-OperandSign>(-Operand.GetFiniteInt());
141 }
142}
143}
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ULANG_ASSERTF(expr, format,...)
Definition Common.h:290
Definition VVMEngineEnvironment.h:23
bool operator<=(const TIntOrInfinity< LhsSign > &Lhs, const TIntOrInfinity< RhsSign > &Rhs)
Definition IntOrInfinity.h:115
bool operator==(const SSystemParams &Lhs, const SSystemParams &Rhs)
Definition Common.cpp:21
bool operator>=(const TIntOrInfinity< LhsSign > &Lhs, const TIntOrInfinity< RhsSign > &Rhs)
Definition IntOrInfinity.h:125
constexpr EInfinitySign operator-(EInfinitySign Sign)
Definition IntOrInfinity.h:17
bool operator<(const TIntOrInfinity< LhsSign > &Lhs, const TIntOrInfinity< RhsSign > &Rhs)
Definition IntOrInfinity.h:94
EInfinitySign
Definition IntOrInfinity.h:13
bool operator>(const TIntOrInfinity< LhsSign > &Lhs, const TIntOrInfinity< RhsSign > &Rhs)
Definition IntOrInfinity.h:120
Definition IntOrInfinity.h:24
friend bool operator==(int64_t Lhs, const TIntOrInfinity &Rhs)
Definition IntOrInfinity.h:32
friend bool operator<(int64_t Lhs, const TIntOrInfinity &Rhs)
Definition IntOrInfinity.h:36
int64_t GetFiniteInt() const
Definition IntOrInfinity.h:58
bool IsInfinity() const
Definition IntOrInfinity.h:56
bool IsSafeToNegate() const
Definition IntOrInfinity.h:60
friend bool operator>=(const TIntOrInfinity &Lhs, int64_t Rhs)
Definition IntOrInfinity.h:54
friend bool operator<=(const TIntOrInfinity &Lhs, int64_t Rhs)
Definition IntOrInfinity.h:53
friend bool operator>(int64_t Lhs, const TIntOrInfinity &Rhs)
Definition IntOrInfinity.h:42
bool IsFinite() const
Definition IntOrInfinity.h:57
TIntOrInfinity(int64_t InFiniteInt)
Definition IntOrInfinity.h:25
friend bool operator<=(int64_t Lhs, const TIntOrInfinity &Rhs)
Definition IntOrInfinity.h:48
friend bool operator>=(int64_t Lhs, const TIntOrInfinity &Rhs)
Definition IntOrInfinity.h:49
static TIntOrInfinity Infinity()
Definition IntOrInfinity.h:30
friend bool operator<(const TIntOrInfinity &Lhs, int64_t Rhs)
Definition IntOrInfinity.h:51
friend bool operator>(const TIntOrInfinity &Lhs, int64_t Rhs)
Definition IntOrInfinity.h:52
Definition Optional.h:23
ULANG_FORCEINLINE bool IsSet() const
Definition Optional.h:161
const OptionalType & GetValue() const
Definition Optional.h:169