mathe/Library/PackageCache/com.unity.shadergraph@14.0.8/Editor/Util/ListUtilities.cs
2024-09-20 20:30:10 +02:00

52 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
namespace UnityEditor.ShaderGraph
{
static class ListUtilities
{
// Ideally, we should build a non-yield return, struct version of Slice
public static IEnumerable<T> Slice<T>(this List<T> list, int start, int end)
{
for (int i = start; i < end; i++)
yield return list[i];
}
public static int RemoveAllFromRange<T>(this List<T> list, Predicate<T> match, int startIndex, int count)
{
// match behavior of RemoveRange
if ((startIndex < 0) || (count < 0))
throw new ArgumentOutOfRangeException();
int endIndex = startIndex + count;
if (endIndex > list.Count)
throw new ArgumentException();
int readIndex = startIndex;
int writeIndex = startIndex;
while (readIndex < endIndex)
{
T element = list[readIndex];
bool remove = match(element);
if (!remove)
{
// skip some work if nothing removed (especially if T is a large struct)
if (writeIndex < readIndex)
list[writeIndex] = element;
writeIndex++;
}
readIndex++;
}
// once we're done, we can remove the entries at the end in one operation
int numberRemoved = readIndex - writeIndex;
if (numberRemoved > 0)
{
list.RemoveRange(writeIndex, numberRemoved);
}
return numberRemoved;
}
}
}