ArrayHelpers.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // note:: This script is using code snippets in InputSystem.
  2. // https://github.com/Unity-Technologies/InputSystem/blob/develop/Packages/com.unity.inputsystem/InputSystem/Utilities/ArrayHelpers.cs
  3. // todo(kazuki):: This script should be moved into the WebRTC package.
  4. // #if UNITY_WEBRTC_ENABLE_INPUT_SYSTEM
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using UnityEngine;
  9. // namespace Unity.WebRTC.InputSystem
  10. namespace Unity.RenderStreaming
  11. {
  12. internal static class ArrayHelpers
  13. {
  14. public static int LengthSafe<TValue>(this TValue[] array)
  15. {
  16. if (array == null)
  17. return 0;
  18. return array.Length;
  19. }
  20. public static int Append<TValue>(ref TValue[] array, TValue value)
  21. {
  22. if (array == null)
  23. {
  24. array = new TValue[1];
  25. array[0] = value;
  26. return 0;
  27. }
  28. var length = array.Length;
  29. Array.Resize(ref array, length + 1);
  30. array[length] = value;
  31. return length;
  32. }
  33. public static int Append<TValue>(ref TValue[] array, IEnumerable<TValue> values)
  34. {
  35. if (array == null)
  36. {
  37. array = values.ToArray();
  38. return 0;
  39. }
  40. var oldLength = array.Length;
  41. var valueCount = values.Count();
  42. Array.Resize(ref array, oldLength + valueCount);
  43. var index = oldLength;
  44. foreach (var value in values)
  45. array[index++] = value;
  46. return oldLength;
  47. }
  48. public static int IndexOf<TValue>(TValue[] array, TValue value, int startIndex = 0, int count = -1)
  49. {
  50. if (array == null)
  51. return -1;
  52. if (count < 0)
  53. count = array.Length - startIndex;
  54. var comparer = EqualityComparer<TValue>.Default;
  55. for (var i = startIndex; i < startIndex + count; ++i)
  56. if (comparer.Equals(array[i], value))
  57. return i;
  58. return -1;
  59. }
  60. public static bool Erase<TValue>(ref TValue[] array, TValue value)
  61. {
  62. var index = IndexOf(array, value);
  63. if (index != -1)
  64. {
  65. EraseAt(ref array, index);
  66. return true;
  67. }
  68. return false;
  69. }
  70. public static void EraseAt<TValue>(ref TValue[] array, int index)
  71. {
  72. Debug.Assert(array != null);
  73. Debug.Assert(index >= 0 && index < array.Length);
  74. var length = array.Length;
  75. if (index == 0 && length == 1)
  76. {
  77. array = null;
  78. return;
  79. }
  80. if (index < length - 1)
  81. Array.Copy(array, index + 1, array, index, length - index - 1);
  82. Array.Resize(ref array, length - 1);
  83. }
  84. public static void PutAtIfNotSet<TValue>(ref TValue[] array, int index, Func<TValue> valueFn)
  85. {
  86. if (array.LengthSafe() < index + 1)
  87. Array.Resize(ref array, index + 1);
  88. if (EqualityComparer<TValue>.Default.Equals(array[index], default(TValue)))
  89. array[index] = valueFn();
  90. }
  91. }
  92. }
  93. // #endif