| using System; | 
| using System.Diagnostics; | 
|   | 
| namespace Cysharp.Threading.Tasks.Internal | 
| { | 
|     internal readonly struct ValueStopwatch | 
|     { | 
|         static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency; | 
|   | 
|         readonly long startTimestamp; | 
|   | 
|         public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp()); | 
|   | 
|         ValueStopwatch(long startTimestamp) | 
|         { | 
|             this.startTimestamp = startTimestamp; | 
|         } | 
|   | 
|         public TimeSpan Elapsed => TimeSpan.FromTicks(this.ElapsedTicks); | 
|   | 
|         public bool IsInvalid => startTimestamp == 0; | 
|   | 
|         public long ElapsedTicks | 
|         { | 
|             get | 
|             { | 
|                 if (startTimestamp == 0) | 
|                 { | 
|                     throw new InvalidOperationException("Detected invalid initialization(use 'default'), only to create from StartNew()."); | 
|                 } | 
|   | 
|                 var delta = Stopwatch.GetTimestamp() - startTimestamp; | 
|                 return (long)(delta * TimestampToTicks); | 
|             } | 
|         } | 
|     } | 
| } |