This commit is contained in:
neuecc 2021-09-01 09:46:15 +09:00
parent b5431b9f9d
commit f3b47c85e9
2 changed files with 97 additions and 13 deletions

View File

@ -71,8 +71,8 @@ namespace ObservableCollections
{ {
if (capacity == buffer.Count) if (capacity == buffer.Count)
{ {
buffer.RemoveLast(); var remItem = buffer.RemoveLast();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, capacity - 1)); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(remItem, capacity - 1));
} }
buffer.AddFirst(item); buffer.AddFirst(item);
@ -86,8 +86,8 @@ namespace ObservableCollections
{ {
if (capacity == buffer.Count) if (capacity == buffer.Count)
{ {
buffer.RemoveLast(); var remItem = buffer.RemoveLast();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, capacity - 1)); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(remItem, capacity - 1));
} }
buffer.AddLast(item); buffer.AddLast(item);
@ -95,20 +95,62 @@ namespace ObservableCollections
} }
} }
public T RemoveFirst()
{
lock (SyncRoot)
{
var item = buffer.RemoveFirst();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, 0));
return item;
}
}
public T RemoveLast()
{
lock (SyncRoot)
{
var index = buffer.Count - 1;
var item = buffer.RemoveLast();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, index));
return item;
}
}
// AddFirstRange is not exists. // AddFirstRange is not exists.
public void AddLastRange(IEnumerable<T> items) public void AddLastRange(IEnumerable<T> items)
{ {
lock (SyncRoot) lock (SyncRoot)
{ {
var index = buffer.Count;
using (var xs = new CloneCollection<T>(items)) using (var xs = new CloneCollection<T>(items))
{ {
foreach (var item in xs.Span) if (capacity >= buffer.Count + xs.Span.Length - 1)
{
// calc remove count
var remCount = Math.Min(capacity, buffer.Count + xs.Span.Length - 1 - capacity);
using (var ys = new ResizableArray<T>(remCount))
{
for (int i = 0; i < remCount; i++)
{
ys.Add(buffer.RemoveFirst());
}
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(ys.Span, 0));
}
}
var index = buffer.Count;
var span = xs.Span;
if (span.Length > capacity)
{
span = span.Slice(span.Length - capacity);
}
foreach (var item in span)
{ {
buffer.AddLast(item); buffer.AddLast(item);
} }
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Add(xs.Span, index)); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Add(span, index));
} }
} }
} }
@ -130,12 +172,33 @@ namespace ObservableCollections
{ {
lock (SyncRoot) lock (SyncRoot)
{ {
if (capacity >= buffer.Count + xs.Span.Length - 1)
{
// calc remove count
var remCount = Math.Min(capacity, buffer.Count + xs.Span.Length - 1 - capacity);
using (var ys = new ResizableArray<T>(remCount))
{
for (int i = 0; i < remCount; i++)
{
ys.Add(buffer.RemoveFirst());
}
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(ys.Span, 0));
}
}
var index = buffer.Count; var index = buffer.Count;
foreach (var item in items) var span = xs.Span;
if (span.Length > capacity)
{
span = span.Slice(span.Length - capacity);
}
foreach (var item in span)
{ {
buffer.AddLast(item); buffer.AddLast(item);
} }
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Add(items, index)); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Add(span, index));
} }
} }

View File

@ -72,6 +72,27 @@ namespace ObservableCollections
} }
} }
public T RemoveFirst()
{
lock (SyncRoot)
{
var item = buffer.RemoveFirst();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, 0));
return item;
}
}
public T RemoveLast()
{
lock (SyncRoot)
{
var index = buffer.Count - 1;
var item = buffer.RemoveLast();
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.Remove(item, index));
return item;
}
}
// AddFirstRange is not exists. // AddFirstRange is not exists.
public void AddLastRange(IEnumerable<T> items) public void AddLastRange(IEnumerable<T> items)