You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.1 KiB
153 lines
4.1 KiB
using System; |
|
using System.Collections.Concurrent; |
|
using System.Runtime.CompilerServices; |
|
|
|
namespace Cysharp.Threading.Tasks.Internal |
|
{ |
|
internal static class StateTuple |
|
{ |
|
public static StateTuple<T1> Create<T1>(T1 item1) |
|
{ |
|
return StatePool<T1>.Create(item1); |
|
} |
|
|
|
public static StateTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) |
|
{ |
|
return StatePool<T1, T2>.Create(item1, item2); |
|
} |
|
|
|
public static StateTuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) |
|
{ |
|
return StatePool<T1, T2, T3>.Create(item1, item2, item3); |
|
} |
|
} |
|
|
|
internal class StateTuple<T1> : IDisposable |
|
{ |
|
public T1 Item1; |
|
|
|
public void Deconstruct(out T1 item1) |
|
{ |
|
item1 = this.Item1; |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
StatePool<T1>.Return(this); |
|
} |
|
} |
|
|
|
internal static class StatePool<T1> |
|
{ |
|
static readonly ConcurrentQueue<StateTuple<T1>> queue = new ConcurrentQueue<StateTuple<T1>>(); |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static StateTuple<T1> Create(T1 item1) |
|
{ |
|
if (queue.TryDequeue(out var value)) |
|
{ |
|
value.Item1 = item1; |
|
return value; |
|
} |
|
|
|
return new StateTuple<T1> { Item1 = item1 }; |
|
} |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static void Return(StateTuple<T1> tuple) |
|
{ |
|
tuple.Item1 = default; |
|
queue.Enqueue(tuple); |
|
} |
|
} |
|
|
|
internal class StateTuple<T1, T2> : IDisposable |
|
{ |
|
public T1 Item1; |
|
public T2 Item2; |
|
|
|
public void Deconstruct(out T1 item1, out T2 item2) |
|
{ |
|
item1 = this.Item1; |
|
item2 = this.Item2; |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
StatePool<T1, T2>.Return(this); |
|
} |
|
} |
|
|
|
internal static class StatePool<T1, T2> |
|
{ |
|
static readonly ConcurrentQueue<StateTuple<T1, T2>> queue = new ConcurrentQueue<StateTuple<T1, T2>>(); |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static StateTuple<T1, T2> Create(T1 item1, T2 item2) |
|
{ |
|
if (queue.TryDequeue(out var value)) |
|
{ |
|
value.Item1 = item1; |
|
value.Item2 = item2; |
|
return value; |
|
} |
|
|
|
return new StateTuple<T1, T2> { Item1 = item1, Item2 = item2 }; |
|
} |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static void Return(StateTuple<T1, T2> tuple) |
|
{ |
|
tuple.Item1 = default; |
|
tuple.Item2 = default; |
|
queue.Enqueue(tuple); |
|
} |
|
} |
|
|
|
internal class StateTuple<T1, T2, T3> : IDisposable |
|
{ |
|
public T1 Item1; |
|
public T2 Item2; |
|
public T3 Item3; |
|
|
|
public void Deconstruct(out T1 item1, out T2 item2, out T3 item3) |
|
{ |
|
item1 = this.Item1; |
|
item2 = this.Item2; |
|
item3 = this.Item3; |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
StatePool<T1, T2, T3>.Return(this); |
|
} |
|
} |
|
|
|
internal static class StatePool<T1, T2, T3> |
|
{ |
|
static readonly ConcurrentQueue<StateTuple<T1, T2, T3>> queue = new ConcurrentQueue<StateTuple<T1, T2, T3>>(); |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static StateTuple<T1, T2, T3> Create(T1 item1, T2 item2, T3 item3) |
|
{ |
|
if (queue.TryDequeue(out var value)) |
|
{ |
|
value.Item1 = item1; |
|
value.Item2 = item2; |
|
value.Item3 = item3; |
|
return value; |
|
} |
|
|
|
return new StateTuple<T1, T2, T3> { Item1 = item1, Item2 = item2, Item3 = item3 }; |
|
} |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static void Return(StateTuple<T1, T2, T3> tuple) |
|
{ |
|
tuple.Item1 = default; |
|
tuple.Item2 = default; |
|
tuple.Item3 = default; |
|
queue.Enqueue(tuple); |
|
} |
|
} |
|
}
|
|
|