54 lines
990 B
C#
54 lines
990 B
C#
![]() |
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace Rokojori
|
||
|
{
|
||
|
public class QueueList<T>:List<T>
|
||
|
{
|
||
|
List<T> _queuedInsertions = new List<T>();
|
||
|
List<T> _queuedRemovals = new List<T>();
|
||
|
|
||
|
public void QueueInsert( T t )
|
||
|
{
|
||
|
_queuedInsertions.Add( t );
|
||
|
}
|
||
|
|
||
|
public void QueueRemoval( T t )
|
||
|
{
|
||
|
_queuedRemovals.Add( t );
|
||
|
}
|
||
|
|
||
|
public void IterateAndResolve( System.Action<T> callback )
|
||
|
{
|
||
|
ResolveRemovalsQueue();
|
||
|
ResolveInsertionQueue();
|
||
|
|
||
|
this.ForEach( t => callback( t ) );
|
||
|
|
||
|
ResolveRemovalsQueue();
|
||
|
}
|
||
|
|
||
|
protected void ResolveInsertionQueue()
|
||
|
{
|
||
|
if ( _queuedInsertions.Count == 0 )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
AddRange( _queuedInsertions );
|
||
|
_queuedInsertions.Clear();
|
||
|
}
|
||
|
|
||
|
protected void ResolveRemovalsQueue()
|
||
|
{
|
||
|
if ( _queuedRemovals.Count == 0 )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Lists.RemoveRange( this, _queuedRemovals );
|
||
|
_queuedRemovals.Clear();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|