2 changed files with 102 additions and 25 deletions
@ -0,0 +1,94 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Avalonia.Utilities |
|||
{ |
|||
/// <summary>
|
|||
/// A list like struct optimized for holding zero or one items.
|
|||
/// </summary>
|
|||
/// <typeparam name="T">The type of items held in the list.</typeparam>
|
|||
/// <remarks>
|
|||
/// Once more than value has been added to this storage it will switch to using <see cref="List"/> internally.
|
|||
/// </remarks>
|
|||
public ref struct ValueSingleOrList<T> |
|||
{ |
|||
private bool _isSingleSet; |
|||
|
|||
/// <summary>
|
|||
/// Single contained value. Only valid if <see cref="IsSingle"/> is set.
|
|||
/// </summary>
|
|||
public T Single { get; private set; } |
|||
|
|||
/// <summary>
|
|||
/// List of values.
|
|||
/// </summary>
|
|||
public List<T> List { get; private set; } |
|||
|
|||
/// <summary>
|
|||
/// If this struct is backed by a list.
|
|||
/// </summary>
|
|||
public bool HasList => List != null; |
|||
|
|||
/// <summary>
|
|||
/// If this struct contains only single value and storage was not promoted to a list.
|
|||
/// </summary>
|
|||
public bool IsSingle => List == null && _isSingleSet; |
|||
|
|||
/// <summary>
|
|||
/// Adds a value.
|
|||
/// </summary>
|
|||
/// <param name="value">Value to add.</param>
|
|||
public void Add(T value) |
|||
{ |
|||
if (List != null) |
|||
{ |
|||
List.Add(value); |
|||
} |
|||
else |
|||
{ |
|||
if (!_isSingleSet) |
|||
{ |
|||
Single = value; |
|||
|
|||
_isSingleSet = true; |
|||
} |
|||
else |
|||
{ |
|||
List = new List<T>(); |
|||
|
|||
List.Add(Single); |
|||
List.Add(value); |
|||
|
|||
Single = default; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Removes a value.
|
|||
/// </summary>
|
|||
/// <param name="value">Value to remove.</param>
|
|||
public bool Remove(T value) |
|||
{ |
|||
if (List != null) |
|||
{ |
|||
return List.Remove(value); |
|||
} |
|||
|
|||
if (!_isSingleSet) |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
if (EqualityComparer<T>.Default.Equals(Single, value)) |
|||
{ |
|||
Single = default; |
|||
|
|||
_isSingleSet = false; |
|||
|
|||
return true; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue