| 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); | 
|         } | 
|     } | 
| } |