mirror of https://github.com/Cysharp/UniTask
5130 lines
201 KiB
C#
5130 lines
201 KiB
C#
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
using System;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.ExceptionServices;
|
|
using System.Threading;
|
|
using UniRx.Async.Internal;
|
|
|
|
namespace UniRx.Async
|
|
{
|
|
public partial struct UniTask
|
|
{
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2)> WhenAny<T1, T2>(UniTask<T1> task1, UniTask<T2> task2)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2)>(new WhenAnyPromise<T1, T2>(task1, task2), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2> : IUniTaskSource<(int, T1 result1, T2 result2)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)> WhenAny<T1, T2, T3>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)>(new WhenAnyPromise<T1, T2, T3>(task1, task2, task3), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)> WhenAny<T1, T2, T3, T4>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)>(new WhenAnyPromise<T1, T2, T3, T4>(task1, task2, task3, task4), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> WhenAny<T1, T2, T3, T4, T5>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)>(new WhenAnyPromise<T1, T2, T3, T4, T5>(task1, task2, task3, task4, task5), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> WhenAny<T1, T2, T3, T4, T5, T6>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6>(task1, task2, task3, task4, task5, task6), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> WhenAny<T1, T2, T3, T4, T5, T6, T7>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>(task1, task2, task3, task4, task5, task6, task7), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>(task1, task2, task3, task4, task5, task6, task7, task8), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task11.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT11(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, UniTask<T11>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT11(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in UniTask<T11>.Awaiter awaiter)
|
|
{
|
|
T11 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task11.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT11(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T11>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT11(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task12.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT12(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, UniTask<T12>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT12(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T11>.Awaiter awaiter)
|
|
{
|
|
T11 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in UniTask<T12>.Awaiter awaiter)
|
|
{
|
|
T12 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task11.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT11(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T11>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT11(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task12.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT12(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T12>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT12(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task13.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT13(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, UniTask<T13>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT13(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T11>.Awaiter awaiter)
|
|
{
|
|
T11 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T12>.Awaiter awaiter)
|
|
{
|
|
T12 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in UniTask<T13>.Awaiter awaiter)
|
|
{
|
|
T13 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task11.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT11(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T11>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT11(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task12.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT12(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T12>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT12(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task13.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT13(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T13>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT13(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task14.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT14(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, UniTask<T14>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT14(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T11>.Awaiter awaiter)
|
|
{
|
|
T11 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T12>.Awaiter awaiter)
|
|
{
|
|
T12 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T13>.Awaiter awaiter)
|
|
{
|
|
T13 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT14(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in UniTask<T14>.Awaiter awaiter)
|
|
{
|
|
T14 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
|
{
|
|
return new UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0);
|
|
}
|
|
|
|
sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> : IUniTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)>
|
|
{
|
|
int completedCount;
|
|
UniTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> core;
|
|
|
|
public WhenAnyPromise(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
|
{
|
|
TaskTracker.TrackActiveTask(this, 3);
|
|
|
|
this.completedCount = 0;
|
|
{
|
|
var awaiter = task1.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT1(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T1>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT1(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task2.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT2(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T2>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT2(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task3.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT3(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T3>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT3(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task4.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT4(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T4>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT4(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task5.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT5(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T5>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT5(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task6.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT6(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T6>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT6(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task7.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT7(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T7>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT7(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task8.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT8(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T8>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT8(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task9.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT9(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T9>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT9(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task10.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT10(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T10>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT10(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task11.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT11(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T11>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT11(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task12.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT12(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T12>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT12(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task13.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT13(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T13>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT13(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task14.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT14(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T14>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT14(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
{
|
|
var awaiter = task15.GetAwaiter();
|
|
|
|
if (awaiter.IsCompleted)
|
|
{
|
|
TryInvokeContinuationT15(this, awaiter);
|
|
}
|
|
else
|
|
{
|
|
awaiter.SourceOnCompleted(state =>
|
|
{
|
|
using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, UniTask<T15>.Awaiter>)state)
|
|
{
|
|
TryInvokeContinuationT15(t.Item1, t.Item2);
|
|
}
|
|
}, StateTuple.Create(this, awaiter));
|
|
}
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T1>.Awaiter awaiter)
|
|
{
|
|
T1 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T2>.Awaiter awaiter)
|
|
{
|
|
T2 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T3>.Awaiter awaiter)
|
|
{
|
|
T3 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T4>.Awaiter awaiter)
|
|
{
|
|
T4 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T5>.Awaiter awaiter)
|
|
{
|
|
T5 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T6>.Awaiter awaiter)
|
|
{
|
|
T6 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T7>.Awaiter awaiter)
|
|
{
|
|
T7 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T8>.Awaiter awaiter)
|
|
{
|
|
T8 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T9>.Awaiter awaiter)
|
|
{
|
|
T9 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T10>.Awaiter awaiter)
|
|
{
|
|
T10 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T11>.Awaiter awaiter)
|
|
{
|
|
T11 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T12>.Awaiter awaiter)
|
|
{
|
|
T12 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T13>.Awaiter awaiter)
|
|
{
|
|
T13 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT14(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T14>.Awaiter awaiter)
|
|
{
|
|
T14 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result, default));
|
|
}
|
|
}
|
|
|
|
static void TryInvokeContinuationT15(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in UniTask<T15>.Awaiter awaiter)
|
|
{
|
|
T15 result;
|
|
try
|
|
{
|
|
result = awaiter.GetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
self.core.TrySetException(ex);
|
|
return;
|
|
}
|
|
|
|
if (Interlocked.Increment(ref self.completedCount) == 1)
|
|
{
|
|
self.core.TrySetResult((14, default, default, default, default, default, default, default, default, default, default, default, default, default, default, result));
|
|
}
|
|
}
|
|
|
|
|
|
public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15) GetResult(short token)
|
|
{
|
|
TaskTracker.RemoveTracking(this);
|
|
GC.SuppressFinalize(this);
|
|
return core.GetResult(token);
|
|
}
|
|
|
|
public UniTaskStatus GetStatus(short token)
|
|
{
|
|
return core.GetStatus(token);
|
|
}
|
|
|
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
{
|
|
core.OnCompleted(continuation, state, token);
|
|
}
|
|
|
|
public UniTaskStatus UnsafeGetStatus()
|
|
{
|
|
return core.UnsafeGetStatus();
|
|
}
|
|
|
|
void IUniTaskSource.GetResult(short token)
|
|
{
|
|
GetResult(token);
|
|
}
|
|
|
|
~WhenAnyPromise()
|
|
{
|
|
core.Reset();
|
|
}
|
|
}
|
|
|
|
}
|
|
} |