using System;
using System.Diagnostics;

namespace Swan.Diagnostics {
  /// <summary>
  /// Provides access to a high-resolution, time measuring device.
  /// </summary>
  /// <seealso cref="Stopwatch" />
  public class HighResolutionTimer : Stopwatch {
    /// <summary>
    /// Initializes a new instance of the <see cref="HighResolutionTimer"/> class.
    /// </summary>
    /// <exception cref="NotSupportedException">High-resolution timer not available.</exception>
    public HighResolutionTimer() {
      if(!IsHighResolution) {
        throw new NotSupportedException("High-resolution timer not available");
      }
    }

    /// <summary>
    /// Gets the number of microseconds per timer tick.
    /// </summary>
    public static Double MicrosecondsPerTick { get; } = 1000000d / Frequency;

    /// <summary>
    /// Gets the elapsed microseconds.
    /// </summary>
    public Int64 ElapsedMicroseconds => (Int64)(this.ElapsedTicks * MicrosecondsPerTick);
  }
}