Skip to content

Commit

Permalink
ToConcreteType Update (#751)
Browse files Browse the repository at this point in the history
Convert more places to use ToConcreteType
  • Loading branch information
dwcullop authored Nov 9, 2023
1 parent 269828b commit 6ac7026
Show file tree
Hide file tree
Showing 14 changed files with 29 additions and 38 deletions.
5 changes: 3 additions & 2 deletions src/DynamicData/Aggregation/AggregateEnumerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using DynamicData.Cache;

namespace DynamicData.Aggregation;

Expand Down Expand Up @@ -68,11 +69,11 @@ internal class AggregateEnumerator<TObject, TKey> : IAggregateChangeSet<TObject>
where TObject : notnull
where TKey : notnull
{
private readonly IChangeSet<TObject, TKey> _source;
private readonly ChangeSet<TObject, TKey> _source;

public AggregateEnumerator(IChangeSet<TObject, TKey> source)
{
_source = source;
_source = source.ToConcreteType();
}

public IEnumerator<AggregateItem<TObject>> GetEnumerator()
Expand Down
4 changes: 2 additions & 2 deletions src/DynamicData/Binding/BindingListAdaptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#if SUPPORTS_BINDINGLIST
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;

using DynamicData.Cache;
using DynamicData.Cache.Internal;

namespace DynamicData.Binding
Expand Down Expand Up @@ -108,7 +108,7 @@ public void Adapt(IChangeSet<TObject, TKey> changes)

private static void DoUpdate(IChangeSet<TObject, TKey> changes, BindingList<TObject> list)
{
foreach (var update in changes)
foreach (var update in changes.ToConcreteType())
{
switch (update.Reason)
{
Expand Down
20 changes: 2 additions & 18 deletions src/DynamicData/Binding/ObservableCollectionAdaptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

using System;
using System.Diagnostics.CodeAnalysis;

using DynamicData.Cache;
using DynamicData.Cache.Internal;
using DynamicData.Kernel;

Expand Down Expand Up @@ -128,7 +128,7 @@ public void Adapt(IChangeSet<TObject, TKey> changes, IObservableCollection<TObje

private void DoUpdate(IChangeSet<TObject, TKey> changes, IObservableCollection<TObject> list)
{
void Amend(Change<TObject, TKey> change)
foreach (Change<TObject, TKey> change in changes.ToConcreteType())
{
switch (change.Reason)
{
Expand Down Expand Up @@ -156,21 +156,5 @@ void Amend(Change<TObject, TKey> change)
break;
}
}

if (changes is IList<Change<TObject, TKey>> iList)
{
// allocation free enumeration
foreach (var change in EnumerableIList.Create(iList))
{
Amend(change);
}
}
else
{
foreach (var update in changes)
{
Amend(update);
}
}
}
}
13 changes: 9 additions & 4 deletions src/DynamicData/Cache/CacheChangeSetEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@ internal static class CacheChangeSetEx
/// <summary>
/// IChangeSet is flawed because it automatically means allocations when enumerating.
/// This extension is a crazy hack to cast to the concrete change set which means we no longer allocate
/// as change set now inherits from List which has allocation free enumerations.
/// as change set now inherits from List which has allocation free enumerations.
///
/// IChangeSet will be removed in V7 and instead Change sets will be used directly
/// IChangeSet will be removed in a future version and instead <see cref="ChangeSet{TObject, TKey}"/> will be used directly.
///
/// In the mean time I am banking that no-one has implemented a custom change set - personally I think it is very unlikely.
/// </summary>
/// <param name="changeSet">The source change set.</param>
/// <typeparam name="TObject">ChangeSet Object Type.</typeparam>
/// <typeparam name="TKey">ChangeSet Key Type.</typeparam>
/// <param name="changeSet">ChangeSet to be converted.</param>
/// <returns>Concrete Instance of the ChangeSet.</returns>
/// <exception cref="NotSupportedException">A custom implementation was found.</exception>
public static ChangeSet<TObject, TKey> ToConcreteType<TObject, TKey>(this IChangeSet<TObject, TKey> changeSet)
where TObject : notnull
where TKey : notnull => (ChangeSet<TObject, TKey>)changeSet;
where TKey : notnull =>
changeSet as ChangeSet<TObject, TKey> ?? throw new NotSupportedException("Dynamic Data does not support a custom implementation of IChangeSet");
}
4 changes: 2 additions & 2 deletions src/DynamicData/Cache/Internal/AbstractFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ Optional<Change<TObject, TKey>> Factory(KeyValuePair<TKey, TObject> kv)

public IChangeSet<TObject, TKey> Update(IChangeSet<TObject, TKey> updates)
{
var withFilter = GetChangesWithFilter(updates);
var withFilter = GetChangesWithFilter(updates.ToConcreteType());
return ProcessResult(withFilter);
}

protected abstract IEnumerable<UpdateWithFilter> GetChangesWithFilter(IChangeSet<TObject, TKey> updates);
protected abstract IEnumerable<UpdateWithFilter> GetChangesWithFilter(ChangeSet<TObject, TKey> updates);

protected abstract IEnumerable<Change<TObject, TKey>> Refresh(IEnumerable<KeyValuePair<TKey, TObject>> items, Func<KeyValuePair<TKey, TObject>, Optional<Change<TObject, TKey>>> factory);

Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/Cache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void Clone(IChangeSet<TObject, TKey> changes)
throw new ArgumentNullException(nameof(changes));
}

foreach (var item in changes)
foreach (var item in changes.ToConcreteType())
{
switch (item.Reason)
{
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/Cast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public IObservable<IChangeSet<TDestination, TKey>> Run()
return _source.Select(
changes =>
{
var transformed = changes.Select(change => new Change<TDestination, TKey>(change.Reason, change.Key, _converter(change.Current), change.Previous.Convert(_converter), change.CurrentIndex, change.PreviousIndex));
var transformed = changes.ToConcreteType().Select(change => new Change<TDestination, TKey>(change.Reason, change.Key, _converter(change.Current), change.Previous.Convert(_converter), change.CurrentIndex, change.PreviousIndex));
return new ChangeSet<TDestination, TKey>(transformed);
});
}
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/Combiner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ private void Update(Cache<TObject, TKey> cache, IChangeSet<TObject, TKey> update
private IChangeSet<TObject, TKey> UpdateCombined(IChangeSet<TObject, TKey> updates)
{
// child caches have been updated before we reached this point.
foreach (var update in updates)
foreach (var update in updates.ToConcreteType())
{
TKey key = update.Key;
switch (update.Reason)
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/DisposeMany.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public IObservable<IChangeSet<TObject, TKey>> Run()

private void RegisterForRemoval(IChangeSet<TObject, TKey> changes, Cache<TObject, TKey> cache)
{
changes.ForEach(
changes.ToConcreteType().ForEach(
change =>
{
switch (change.Reason)
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/IndexCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public IChangeSet<TObject, TKey> Calculate(IChangeSet<TObject, TKey> changes)
var result = new List<Change<TObject, TKey>>(changes.Count);
var refreshes = new List<Change<TObject, TKey>>(changes.Refreshes);

foreach (var u in changes)
foreach (var u in changes.ToConcreteType())
{
var current = new KeyValuePair<TKey, TObject>(u.Key, u.Current);

Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/RemoveKeyEnumerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public RemoveKeyEnumerator(IChangeSet<TObject, TKey> source, IExtendedList<TObje
/// </returns>
public IEnumerator<Change<TObject>> GetEnumerator()
{
foreach (var change in _source)
foreach (var change in _source.ToConcreteType())
{
switch (change.Reason)
{
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Cache/Internal/TransformMany.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public DestinationEnumerator(IChangeSet<ManyContainer, TSourceKey> changes)

public IEnumerator<Change<TDestination, TDestinationKey>> GetEnumerator()
{
foreach (var change in _changes)
foreach (var change in _changes.ToConcreteType())
{
switch (change.Reason)
{
Expand Down
5 changes: 3 additions & 2 deletions src/DynamicData/Cache/ObservableCacheEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using System.Reactive.Linq;

using DynamicData.Binding;
using DynamicData.Cache;
using DynamicData.Cache.Internal;
using DynamicData.Kernel;

Expand Down Expand Up @@ -1058,7 +1059,7 @@ public static IObservable<IChangeSet<TObject, TKey>> Clone<TObject, TKey>(this I
return source.Do(
changes =>
{
foreach (var item in changes)
foreach (var item in changes.ToConcreteType())
{
switch (item.Reason)
{
Expand Down Expand Up @@ -6200,7 +6201,7 @@ public static IObservable<ISortedChangeSet<TObject, TKey>> TreatMovesAsRemoveAdd

IEnumerable<Change<TObject, TKey>> ReplaceMoves(IChangeSet<TObject, TKey> items)
{
foreach (var change in items)
foreach (var change in items.ToConcreteType())
{
if (change.Reason == ChangeReason.Moved)
{
Expand Down
2 changes: 1 addition & 1 deletion src/DynamicData/Platforms/net45/PFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public PLinqFilteredUpdater(Func<TObject, bool> filter, ParallelisationOptions p
_parallelisationOptions = parallelisationOptions;
}

protected override IEnumerable<UpdateWithFilter> GetChangesWithFilter(IChangeSet<TObject, TKey> updates)
protected override IEnumerable<UpdateWithFilter> GetChangesWithFilter(ChangeSet<TObject, TKey> updates)
{
if (updates.ShouldParallelise(_parallelisationOptions))
{
Expand Down

0 comments on commit 6ac7026

Please sign in to comment.