| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Runtime.CompilerServices;
- namespace ET
- {
- /// <summary>
- /// Lightweight unity specified task-like object.
- /// </summary>
- [AsyncMethodBuilder(typeof (AsyncETTaskMethodBuilder))]
- public partial struct ETTask: IEquatable<ETTask>
- {
- private readonly IAwaiter awaiter;
- [DebuggerHidden]
- public ETTask(IAwaiter awaiter)
- {
- this.awaiter = awaiter;
- }
- [DebuggerHidden]
- public AwaiterStatus Status => awaiter?.Status ?? AwaiterStatus.Succeeded;
- [DebuggerHidden]
- public bool IsCompleted => awaiter?.IsCompleted ?? true;
- [DebuggerHidden]
- public void GetResult()
- {
- if (awaiter != null)
- {
- awaiter.GetResult();
- }
- }
-
- public void Coroutine()
- {
- }
- [DebuggerHidden]
- public Awaiter GetAwaiter()
- {
- return new Awaiter(this);
- }
- public bool Equals(ETTask other)
- {
- if (this.awaiter == null && other.awaiter == null)
- {
- return true;
- }
- if (this.awaiter != null && other.awaiter != null)
- {
- return this.awaiter == other.awaiter;
- }
- return false;
- }
- public override int GetHashCode()
- {
- if (this.awaiter == null)
- {
- return 0;
- }
- return this.awaiter.GetHashCode();
- }
- public override string ToString()
- {
- return this.awaiter == null? "()"
- : this.awaiter.Status == AwaiterStatus.Succeeded? "()"
- : "(" + this.awaiter.Status + ")";
- }
- public struct Awaiter: IAwaiter
- {
- private readonly ETTask task;
- [DebuggerHidden]
- public Awaiter(ETTask task)
- {
- this.task = task;
- }
- [DebuggerHidden]
- public bool IsCompleted => task.IsCompleted;
- [DebuggerHidden]
- public AwaiterStatus Status => task.Status;
- [DebuggerHidden]
- public void GetResult()
- {
- task.GetResult();
- }
- [DebuggerHidden]
- public void OnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.OnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- [DebuggerHidden]
- public void UnsafeOnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.UnsafeOnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- }
- }
- /// <summary>
- /// Lightweight unity specified task-like object.
- /// </summary>
- [AsyncMethodBuilder(typeof (ETAsyncTaskMethodBuilder<>))]
- public struct ETTask<T>: IEquatable<ETTask<T>>
- {
- private readonly T result;
- private readonly IAwaiter<T> awaiter;
- [DebuggerHidden]
- public ETTask(T result)
- {
- this.result = result;
- this.awaiter = null;
- }
- [DebuggerHidden]
- public ETTask(IAwaiter<T> awaiter)
- {
- this.result = default;
- this.awaiter = awaiter;
- }
- [DebuggerHidden]
- public AwaiterStatus Status => awaiter?.Status ?? AwaiterStatus.Succeeded;
- [DebuggerHidden]
- public bool IsCompleted => awaiter?.IsCompleted ?? true;
- [DebuggerHidden]
- public T Result
- {
- get
- {
- if (awaiter == null)
- {
- return result;
- }
- return this.awaiter.GetResult();
- }
- }
-
- public void Coroutine()
- {
- }
- [DebuggerHidden]
- public Awaiter GetAwaiter()
- {
- return new Awaiter(this);
- }
- public bool Equals(ETTask<T> other)
- {
- if (this.awaiter == null && other.awaiter == null)
- {
- return EqualityComparer<T>.Default.Equals(this.result, other.result);
- }
- if (this.awaiter != null && other.awaiter != null)
- {
- return this.awaiter == other.awaiter;
- }
- return false;
- }
- public override int GetHashCode()
- {
- if (this.awaiter == null)
- {
- if (result == null)
- {
- return 0;
- }
- return result.GetHashCode();
- }
- return this.awaiter.GetHashCode();
- }
- public override string ToString()
- {
- return this.awaiter == null? result.ToString()
- : this.awaiter.Status == AwaiterStatus.Succeeded? this.awaiter.GetResult().ToString()
- : "(" + this.awaiter.Status + ")";
- }
- public static implicit operator ETTask(ETTask<T> task)
- {
- if (task.awaiter != null)
- {
- return new ETTask(task.awaiter);
- }
- return new ETTask();
- }
- public struct Awaiter: IAwaiter<T>
- {
- private readonly ETTask<T> task;
- [DebuggerHidden]
- public Awaiter(ETTask<T> task)
- {
- this.task = task;
- }
- [DebuggerHidden]
- public bool IsCompleted => task.IsCompleted;
- [DebuggerHidden]
- public AwaiterStatus Status => task.Status;
- [DebuggerHidden]
- void IAwaiter.GetResult()
- {
- GetResult();
- }
- [DebuggerHidden]
- public T GetResult()
- {
- return task.Result;
- }
- [DebuggerHidden]
- public void OnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.OnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- [DebuggerHidden]
- public void UnsafeOnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.UnsafeOnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- }
- }
- }
|