Arma Reforger Explorer  1.1.0.42
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
SCR_ArrayHelper.c
Go to the documentation of this file.
2 {
3  //------------------------------------------------------------------------------------------------
30  static int GetWeightedIndex(notnull array<float> weights, float value01)
31  {
32  if (weights.IsEmpty())
33  return -1;
34 
35  if (value01 < 0 || value01 > 1)
36  value01 = Math.Mod(value01, 1);
37 
38  float probabilitySum;
39  for (int i, count = weights.Count(); i < count; i++)
40  {
41  probabilitySum += weights[i];
42  }
43 
44  float add = 0;
45  probabilitySum *= value01;
46 
47  for (int i, count = weights.Count(); i < count; i++)
48  {
49  add += weights[i];
50  if (add > probabilitySum)
51  return i;
52  }
53 
54  return 0;
55  }
56 }
57 
61 class SCR_ArrayHelperT<Class T>
62 {
63  //------------------------------------------------------------------------------------------------
68  static void CopyReferencesFromTo(notnull array<ref T> source, notnull array<ref T> destination)
69  {
70  destination.Clear();
71  foreach (T sourceRef : source)
72  {
73  destination.Insert(sourceRef);
74  }
75  }
76 
77  //------------------------------------------------------------------------------------------------
80  // NATIVE version
81  static array<T> GetCopy(array<T> source)
82  {
83  if (!source)
84  return null;
85 
86  array<T> result = {};
87  result.Copy(source);
88  return result;
89  }
90 
91  //------------------------------------------------------------------------------------------------
94  // REFERENCE version
95  static array<ref T> GetCopy(array<ref T> source)
96  {
97  if (!source)
98  return null;
99 
100  array<ref T> result = {};
101  foreach (T sourceRef : source)
102  {
103  result.Insert(sourceRef);
104  }
105  return result;
106  }
107 
108  //------------------------------------------------------------------------------------------------
113  // NATIVE version
114  static void Intersect(notnull array<T> array1, notnull array<T> array2, notnull out array<T> result/*, bool unique = true */)
115  {
116  result.Clear();
117  int count1 = array1.Count();
118  int count2 = array2.Count();
119  if (count1 > count2)
120  {
121  for (int i = array2.Count() - 1; i >= 0; i--)
122  {
123  if (array1.Contains(array2[i]))
124  result.Insert(array2[i]);
125  }
126  }
127  else
128  {
129  for (int i = array1.Count() - 1; i >= 0; i--)
130  {
131  if (array2.Contains(array1[i]))
132  result.Insert(array1[i]);
133  }
134  }
135  }
136 
137  //------------------------------------------------------------------------------------------------
142  // REFERENCE version
143  static void Intersect(notnull array<ref T> array1, notnull array<ref T> array2, notnull out array<ref T> result/*, bool unique = true */)
144  {
145  result.Clear();
146  int count1 = array1.Count();
147  int count2 = array2.Count();
148  if (count1 > count2)
149  {
150  for (int i = array2.Count() - 1; i >= 0; i--)
151  {
152  if (array1.Contains(array2[i]))
153  result.Insert(array2[i]);
154  }
155  }
156  else
157  {
158  for (int i = array1.Count() - 1; i >= 0; i--)
159  {
160  if (array2.Contains(array1[i]))
161  result.Insert(array1[i]);
162  }
163  }
164  }
165 
166  //------------------------------------------------------------------------------------------------
169  // NATIVE version
170  static void RemoveDuplicates(notnull inout array<T> items)
171  {
172  for (int i = items.Count() - 1; i >= 0; --i)
173  {
174  if (items.Find(items[i]) != i)
175  items.RemoveOrdered(i);
176  }
177  }
178 
179  //------------------------------------------------------------------------------------------------
182  // REFERENCE version
183  static void RemoveDuplicates(notnull inout array<ref T> items)
184  {
185  for (int i = items.Count() - 1; i >= 0; --i)
186  {
187  if (items.Find(items[i]) != i)
188  items.RemoveOrdered(i);
189  }
190  }
191 
192  //------------------------------------------------------------------------------------------------
201  // NATIVE version
202  static void Reverse(notnull inout array<T> items)
203  {
204  int itemsCount = items.Count();
205  if (itemsCount < 2)
206  return;
207 
208  int flooredMiddle = itemsCount * 0.5;
209  itemsCount--;
210 
211  // 4 indices
212  // flooredMiddle = 2
213  // 0 <-> 3
214  // 1 <-> 2
215  // { 0 1 2 3 }
216  // { 3 2 1 0 }
217 
218  // 5 indices
219  // flooredMiddle = 2
220  // 0 <-> 4
221  // 1 <-> 3
222  // 2 is central
223  // { 0 1 2 3 4 }
224  // { 4 3 2 1 0 }
225 
226  for (int i; i < flooredMiddle; i++)
227  {
228  items.SwapItems(i, itemsCount - i);
229  }
230  }
231 
232  //------------------------------------------------------------------------------------------------
241  // REFERENCE version
242  static void Reverse(notnull inout array<ref T> items)
243  {
244  int itemsCount = items.Count();
245  if (itemsCount < 2)
246  return;
247 
248  int flooredMiddle = itemsCount * 0.5;
249  itemsCount--;
250 
251  // 4 indices
252  // flooredMiddle = 2
253  // 0 <-> 3
254  // 1 <-> 2
255  // { 0 1 2 3 }
256  // { 3 2 1 0 }
257 
258  // 5 indices
259  // flooredMiddle = 2
260  // 0 <-> 4
261  // 1 <-> 3
262  // 2 is central
263  // { 0 1 2 3 4 }
264  // { 4 3 2 1 0 }
265 
266  for (int i; i < flooredMiddle; i++)
267  {
268  items.SwapItems(i, itemsCount - i);
269  }
270  }
271 
272  //------------------------------------------------------------------------------------------------
281  // NATIVE version
282  static void Shuffle(notnull inout array<T> items, int shuffles = 1)
283  {
284  if (items.Count() < 2)
285  return;
286 
287  // two checks are faster than Math.ClampInt
288  if (shuffles < 1)
289  shuffles = 1;
290 
291  if (shuffles > 10)
292  shuffles = 10;
293 
294  while (shuffles > 0)
295  {
296  for (int i = 0, count = items.Count(); i < count; i++)
297  {
298  int index1 = Math.RandomInt(0, count);
299  int index2 = Math.RandomInt(0, count);
300  if (index1 != index2)
301  items.SwapItems(index1, index2);
302  }
303 
304  shuffles--;
305  }
306  }
307 
308  //------------------------------------------------------------------------------------------------
317  // REFERENCE version
318  static void Shuffle(notnull inout array<ref T> items, int shuffles = 1)
319  {
320  if (items.Count() < 2)
321  return;
322 
323  // two checks are faster than Math.ClampInt
324  if (shuffles < 1)
325  shuffles = 1;
326 
327  if (shuffles > 10)
328  shuffles = 10;
329 
330  while (shuffles > 0)
331  {
332  for (int i = 0, count = items.Count(); i < count; i++)
333  {
334  int index1 = Math.RandomInt(0, count);
335  int index2 = Math.RandomInt(0, count);
336  if (index1 != index2)
337  items.SwapItems(index1, index2);
338  }
339 
340  shuffles--;
341  }
342  }
343 
344 // //------------------------------------------------------------------------------------------------
345 // //!
346 // //! \param[in] toConvert
347 // //! \param[in] result
348 // // NATIVE version
349 // static void ArrayToSet(notnull array<T> toConvert, notnull set<T> result)
350 // {
351 // result.Clear();
352 // foreach (T item : toConvert)
353 // {
354 // result.Insert(item);
355 // }
356 // }
357 //
358 // //------------------------------------------------------------------------------------------------
359 // //!
360 // //! \param[in] toConvert
361 // //! \param[in] result
362 // // REFERENCE version
363 // static void ArrayToSet(notnull array<ref T> toConvert, notnull set<ref T> result)
364 // {
365 // result.Clear();
366 // foreach (T item : toConvert)
367 // {
368 // result.Insert(item);
369 // }
370 // }
371 //
372 // //------------------------------------------------------------------------------------------------
373 // //! \param[in] toConvert
374 // //! \param[in] result
375 // // NATIVE version
376 // static void SetToArray(notnull set<T> toConvert, notnull array<T> result)
377 // {
378 // result.Clear();
379 // foreach (T item : toConvert)
380 // {
381 // result.Insert(item);
382 // }
383 // }
384 //
385 // //------------------------------------------------------------------------------------------------
386 // //! \param[in] toConvert
387 // //! \param[in] result
388 // // REFERENCE version
389 // static void SetToArray(notnull set<ref T> toConvert, notnull array<ref T> result)
390 // {
391 // result.Clear();
392 // foreach (T item : toConvert)
393 // {
394 // result.Insert(item);
395 // }
396 // }
397 }
SCR_ArrayHelper
Definition: SCR_ArrayHelper.c:1
Reverse
@ Reverse
Definition: ELightType.c:14
CopyReferencesFromTo
class SCR_ArrayHelper CopyReferencesFromTo(notnull array< ref T > source, notnull array< ref T > destination)
Definition: SCR_ArrayHelper.c:68