2019-05-19 23:14:47 +08:00
|
|
|
|
#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6))
|
|
|
|
|
|
|
|
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
|
|
|
|
2020-04-18 04:07:59 +08:00
|
|
|
|
using System;
|
2019-05-19 23:14:47 +08:00
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Runtime.CompilerServices;
|
2020-04-18 04:07:59 +08:00
|
|
|
|
using UniRx.Async.Internal;
|
2019-05-19 23:14:47 +08:00
|
|
|
|
|
|
|
|
|
namespace UniRx.Async.CompilerServices
|
|
|
|
|
{
|
2020-04-18 04:07:59 +08:00
|
|
|
|
internal interface IMoveNextRunner
|
|
|
|
|
{
|
|
|
|
|
Action CallMoveNext { get; }
|
|
|
|
|
void Return();
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-20 07:35:06 +08:00
|
|
|
|
internal sealed class MoveNextRunner<TStateMachine> : IMoveNextRunner, IPromisePoolItem
|
2020-04-18 04:07:59 +08:00
|
|
|
|
where TStateMachine : IAsyncStateMachine
|
|
|
|
|
{
|
2020-04-19 02:24:53 +08:00
|
|
|
|
static PromisePool<MoveNextRunner<TStateMachine>> pool = new PromisePool<MoveNextRunner<TStateMachine>>();
|
2020-04-18 04:07:59 +08:00
|
|
|
|
|
|
|
|
|
TStateMachine stateMachine;
|
|
|
|
|
internal readonly Action callMoveNext;
|
|
|
|
|
|
|
|
|
|
public Action CallMoveNext => callMoveNext;
|
|
|
|
|
|
2020-04-19 02:24:53 +08:00
|
|
|
|
MoveNextRunner()
|
2020-04-18 04:07:59 +08:00
|
|
|
|
{
|
|
|
|
|
callMoveNext = MoveNext;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-19 02:24:53 +08:00
|
|
|
|
public static MoveNextRunner<TStateMachine> Create(ref TStateMachine stateMachine)
|
2020-04-18 04:07:59 +08:00
|
|
|
|
{
|
2020-04-19 02:24:53 +08:00
|
|
|
|
var result = pool.TryRent() ?? new MoveNextRunner<TStateMachine>();
|
2020-04-18 04:07:59 +08:00
|
|
|
|
result.stateMachine = stateMachine;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DebuggerHidden]
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
|
void MoveNext()
|
|
|
|
|
{
|
|
|
|
|
stateMachine.MoveNext();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Return()
|
|
|
|
|
{
|
|
|
|
|
pool.TryReturn(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IPromisePoolItem.Reset()
|
|
|
|
|
{
|
|
|
|
|
stateMachine = default;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-19 23:14:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|