UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ArrayUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Core/Types.h"
5
6#include "Math/Boundary.h"
8
9namespace UE::CADKernel
10{
11namespace ArrayUtils
12{
20{
21 ensureCADKernel(InitialArray.Num() >= 2);
22
23 if (ValuesToInsert.Num() == 0)
24 {
25 return;
26 }
27
28 InitialArray.Reserve(InitialArray.Num() + ValuesToInsert.Num());
29
31
32 int32 Index = 0;
33 for (double Value : ValuesToInsert)
34 {
35 if (Value < InitialArray[0])
36 {
37 continue;
38 }
39
40 if (Value > InitialArray.Last())
41 {
42 break;
43 }
44
45 Index = Finder.Find(Value);
46
48 {
49 continue;
50 }
51
52 if (FMath::IsNearlyEqual(Value, InitialArray[Index + 1], Epsilon))
53 {
54 continue;
55 }
56
57 InitialArray.EmplaceAt(Index + 1, Value);
58 Finder.StartUpper++;
59 }
60}
61
67{
68 if (ValuesToInsert.Num() == 0)
69 {
70 return;
71 }
72
73 if (InitialArray.Num() == 0)
74 {
76 return;
77 }
78
79 InitialArray.Reserve(InitialArray.Num() + ValuesToInsert.Num());
80
82
83 int32 Index = 0;
84 for (double Value : ValuesToInsert)
85 {
86 if (Value < InitialArray[0])
87 {
89 {
91 }
92 else
93 {
94 InitialArray.EmplaceAt(Index++, Value);
95 Finder.StartUpper++;
96 }
97 continue;
98 }
99
100 if (Value > InitialArray.Last())
101 {
102 if (FMath::IsNearlyEqual(Value, InitialArray.Last(), Epsilon))
103 {
104 InitialArray.Last() = Value;
105 }
106 else
107 {
108 InitialArray.Emplace(Value);;
109 }
110 continue;
111 }
112
113 Index = Finder.Find(Value);
114
116 {
117 continue;
118 }
119
120 if (FMath::IsNearlyEqual(Value, InitialArray[Index + 1], Epsilon))
121 {
122 continue;
123 }
124
125 InitialArray.EmplaceAt(Index + 1, Value);
126 Finder.StartUpper++;
127 }
128}
129
130inline void RemoveDuplicates(TArray<double>& ArrayToProcess, double Epsilon)
131{
132 if (ArrayToProcess.Num() < 2)
133 {
134 return;
135 }
136
137 for (int32 Index = ArrayToProcess.Num() - 1; Index > 1; --Index)
138 {
140 {
141 ArrayToProcess.RemoveAt(Index - 1);
142 }
143 }
144
145 if (ArrayToProcess.Num() > 1)
146 {
148 {
149 ArrayToProcess.RemoveAt(1);
150 }
151 }
152}
153
154inline void SubArrayWithoutBoundary(const TArray<double>& InitialArray, const FLinearBoundary& Boundary, double Tolerance, TArray<double>& OutArray)
155{
156 int32 InitialSize = InitialArray.Num();
157 OutArray.Empty(InitialSize + 2);
158
159 if (InitialSize > 1)
160 {
162 int32 MinIndex = Finder.Find(Boundary.GetMin());
163 int32 MaxIndex = Finder.Find(Boundary.GetMax());
164
165 if (InitialArray[MinIndex] > Boundary.GetMax())
166 {
167 return;
168 }
169
170 if (InitialArray[MaxIndex] < Boundary.GetMin())
171 {
172 return;
173 }
174
175 // MinIndex >= 0, if MinIndex == 0, Boundary.GetMin() can be < InitialArray[0]
176 if (InitialArray[MinIndex] < Boundary.GetMin())
177 {
178 MinIndex++;
179 }
180
181 // FDichotomyFinder return the low index, so MaxIndex < InitialArray.Num() - 1
182 if (InitialArray[MaxIndex + 1] < Boundary.GetMax())
183 {
184 MaxIndex++;
185 }
186
187 if (Boundary.GetMin() + 5 * Tolerance > InitialArray[MinIndex])
188 {
189 MinIndex++;
190 }
191
192 if (Boundary.GetMax() - 5 * Tolerance < InitialArray[MaxIndex])
193 {
194 MaxIndex--;
195 }
196
197 const int32 ElementCount = MaxIndex - MinIndex + 1;
198 if (ElementCount > 0)
199 {
200 OutArray.Append(InitialArray.GetData() + MinIndex, ElementCount);
201 }
202 }
203 else if (InitialSize == 1)
204 {
205 double Value = InitialArray[0];
206 if ((Boundary.GetMin() + 5 * Tolerance > Value) || (Boundary.GetMax() - 5 * Tolerance < Value))
207 {
208 return;
209 }
210 OutArray.Add(Value);
211 }
212}
213
219inline void FindCoordinateIndex(const TArray<double>& InCoordinates, double Coordinate, int32& OutIndex)
220{
221 if (OutIndex >= InCoordinates.Num())
222 {
223 OutIndex = InCoordinates.Num() - 1;
224 }
225
226 if (OutIndex < 0)
227 {
228 OutIndex = 0;
229 }
230
231 while (OutIndex > 0 && Coordinate < InCoordinates[OutIndex])
232 {
233 OutIndex--;
234 }
235
236 for (; OutIndex + 2 < InCoordinates.Num() && Coordinate > InCoordinates[OutIndex + 1]; ++OutIndex)
237 {
238 }
239
240 ensureCADKernel(InCoordinates.IsValidIndex(OutIndex));
241};
242
243};
244}
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ensureCADKernel(InExpression)
Definition Types.h:115
Definition Array.h:670
Definition IndexOfCoordinateFinder.h:85
void SubArrayWithoutBoundary(const TArray< double > &InitialArray, const FLinearBoundary &Boundary, double Tolerance, TArray< double > &OutArray)
Definition ArrayUtils.h:154
void RemoveDuplicates(TArray< double > &ArrayToProcess, double Epsilon)
Definition ArrayUtils.h:130
void FindCoordinateIndex(const TArray< double > &InCoordinates, double Coordinate, int32 &OutIndex)
Definition ArrayUtils.h:219
void InsertInside(TArray< double > &InitialArray, const TArray< double > &ValuesToInsert, double Epsilon)
Definition ArrayUtils.h:19
Definition CADEntity.cpp:23
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
Definition Boundary.h:18
constexpr double GetMin() const
Definition Boundary.h:61
constexpr double GetMax() const
Definition Boundary.h:66