Move IndexSet to OtterGui

This commit is contained in:
Ottermandias 2023-02-23 14:44:37 +01:00
parent e058b6e32b
commit 1e471551d4
2 changed files with 1 additions and 111 deletions

@ -1 +1 @@
Subproject commit f033fc9c103b8a07398481cbff00b0ad3ea749e2 Subproject commit ebaedd64ed28032e4c9bc34c0c1ec3488b2f0937

View file

@ -1,110 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
namespace Penumbra.Util;
public class IndexSet : IEnumerable<int>
{
private readonly BitArray _set;
private int _count;
public int Capacity => _set.Count;
public int Count => _count;
public bool this[Index index]
{
get => _set[index];
set
{
if( value )
{
Add( index );
}
else
{
Remove( index );
}
}
}
public IndexSet( int capacity, bool initiallyFull )
{
_set = new BitArray( capacity, initiallyFull );
_count = initiallyFull ? capacity : 0;
}
public bool Add( Index index )
{
var ret = !_set[index];
if( ret )
{
++_count;
_set[index] = true;
}
return ret;
}
public bool Remove( Index index )
{
var ret = _set[index];
if( ret )
{
--_count;
_set[index] = false;
}
return ret;
}
public int AddRange( int offset, int length )
{
var ret = 0;
for( var idx = 0; idx < length; ++idx )
{
if( Add( offset + idx ) )
{
++ret;
}
}
return ret;
}
public int RemoveRange( int offset, int length )
{
var ret = 0;
for( var idx = 0; idx < length; ++idx )
{
if( Remove( offset + idx ) )
{
++ret;
}
}
return ret;
}
public IEnumerator<int> GetEnumerator()
{
if( _count > 0 )
{
var capacity = _set.Count;
var remaining = _count;
for( var i = 0; i < capacity; ++i )
{
if( _set[i] )
{
yield return i;
if( --remaining == 0 )
{
yield break;
}
}
}
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}