using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace miew.Debugging { using String = System.String; public static class Nop { [MethodImpl(MethodImplOptions.NoInlining)] public static void X(params Object[] objs) { } [MethodImpl(MethodImplOptions.NoInlining)] public static void X() { } public static void CodeCoverage(bool condition = true) { if (condition) { if (Debugger.IsAttached) Debugger.Break(); else if (!IsGuiApplication) { Console.Out.WriteLineColorSync("$red code coverage"); Console.WriteLine(new StackTrace().GetFrames().Skip(1).First().ToString()); } else { MessageBox("code coverage"); } } } public static void CodeCoverage(String msg) { if (Debugger.IsAttached) Debugger.Break(); else if (!IsGuiApplication) { Console.Out.WriteLineColorSync("$red code coverage: " + msg); Console.WriteLine(new StackTrace().GetFrames().Skip(1).First().ToString()); } else { MessageBox("code coverage: " + msg); } } public static void MessageBox(String text) { var pf_mod = AppDomain.CurrentDomain .GetAssemblies() .First(a => a.ManifestModule.Name.ToLower().StartsWith("presentationframework.")); if (pf_mod == null) throw new Exception(text); pf_mod.GetType("System.Windows.MessageBox") .GetMethod("Show", new System.Type[] { typeof(String) }) .Invoke(null, new Object[] { text }); } public static bool single_threaded = false; static int i_gui = -1; static public bool IsGuiApplication { get { if (i_gui == -1) i_gui = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.ManifestModule.Name.ToLower().StartsWith("windowsbase.")) ? 1 : 0; return i_gui == 1; } } static public readonly bool False = false; }; public class DebugTextWriter : StreamWriter { public DebugTextWriter() : base(new DebugOutStream(), Encoding.Unicode, 1024) { this.AutoFlush = true; } class DebugOutStream : Stream { public override void Write(byte[] buffer, int offset, int count) { Debug.Write(Encoding.Unicode.GetString(buffer, offset, count)); } public override bool CanRead { get { return false; } } public override bool CanSeek { get { return false; } } public override bool CanWrite { get { return true; } } public override void Flush() { Debug.Flush(); } public override long Length { get { throw new InvalidOperationException(); } } public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); } public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); } public override void SetLength(long value) { throw new InvalidOperationException(); } public override long Position { get { throw new InvalidOperationException(); } set { throw new InvalidOperationException(); } } }; }; public class TimingReport : IDisposable { Stopwatch sw; TextWriter tw; public TimingReport(TextWriter tw, String name) { this.tw = tw; tw.Write("========== "); if (tw == Console.Out) Console.ForegroundColor = ConsoleColor.Yellow; tw.Write(name); if (tw == Console.Out) Console.ResetColor(); tw.WriteLine(" " + new String('=', System.Math.Max(80 - name.Length, 5))); sw = Stopwatch.StartNew(); } public void Dispose() { String time; double ms = sw.ElapsedMilliseconds; if (ms < 10000) time = ms.ToString("0") + " ms"; else { ms /= 1000.0; if (ms < 120) time = ms.ToString("0.00") + " s"; else time = sw.Elapsed.ToString("hh\\:mm\\:ss"); } String m = "ok: " + time; tw.Write("============================================================ "); if (tw == Console.Out) Console.ForegroundColor = ConsoleColor.Green; tw.Write(m); if (tw == Console.Out) Console.ResetColor(); tw.WriteLine(" " + new String('=', 30 - m.Length)); } }; public static class Extensions { public static void WriteLineColorSync(this TextWriter tw, String fmt, params Object[] args) { tw.WriteColorSync(fmt + Environment.NewLine, args); } public static void WriteColorSync(this TextWriter tw, String fmt, params Object[] args) { String z = String.Format(fmt, args); if (tw != Console.Out) { StringBuilder sb = new StringBuilder(); IEnumerator<String> ies = z.Split(new Char[] { '$' }).AsEnumerable<String>().GetEnumerator(); if (!ies.MoveNext()) return; sb.Append(ies.Current); while (ies.MoveNext()) { String part = ies.Current; int ixsp = part.IndexOf(' '); if (ixsp == -1) throw new Exception(); part = part.Substring(ixsp + 1); sb.Append(part); } tw.WriteLine(sb.ToString()); return; } z = z.Replace("↻", "E"); lock (Console.Out) { IEnumerator<String> ies = z.Split(new Char[] { '$' }).AsEnumerable<String>().GetEnumerator(); if (!ies.MoveNext()) return; Console.Write(ies.Current); while (ies.MoveNext()) { String part = ies.Current; int ixsp = part.IndexOf(' '); if (ixsp == -1) ixsp = part.Length - 1; String s_color = part.Substring(0, ixsp).ToLower(); part = part.Substring(ixsp + 1); if (s_color == "") { Console.ResetColor(); part = " " + part; } else if (s_color == "reset") Console.ResetColor(); else { ConsoleColor cc; if (Enum.TryParse<ConsoleColor>(s_color, true, out cc)) Console.ForegroundColor = cc; } Console.Write(part); } Console.ResetColor(); } } public static void WriteLineColor(this TextWriter console, String fmt, params Object[] args) { WriteLineColor(console, CancellationToken.None, fmt, args); } public static void WriteLineColor(this TextWriter tw, CancellationToken ct, String fmt, params Object[] args) { String z = String.Format(fmt, args); if (tw != Console.Out) { StringBuilder sb = new StringBuilder(); IEnumerator<String> ies = z.Split(new Char[] { '$' }).AsEnumerable<String>().GetEnumerator(); if (!ies.MoveNext()) return; sb.Append(ies.Current); while (ies.MoveNext()) { String part = ies.Current; int ixsp = part.IndexOf(' '); if (ixsp == -1) throw new Exception(); part = part.Substring(ixsp + 1); sb.Append(part); } tw.WriteLine(sb.ToString()); return; } Action a = () => { z = z.Replace("↻", "E"); lock (tw) { IEnumerator<String> ies = z.Split(new Char[] { '$' }).AsEnumerable<String>().GetEnumerator(); if (!ies.MoveNext()) return; Console.Write(ies.Current); while (ies.MoveNext()) { String part = ies.Current; int ixsp = part.IndexOf(' '); if (ixsp == -1) throw new Exception(); String s_color = part.Substring(0, ixsp).ToLower(); part = part.Substring(ixsp + 1); if (s_color == "") { Console.ResetColor(); part = " " + part; } else if (s_color == "reset") Console.ResetColor(); else { ConsoleColor cc; if (Enum.TryParse<ConsoleColor>(s_color, true, out cc)) Console.ForegroundColor = cc; } Console.Write(part); } Console.ResetColor(); Console.WriteLine(); } }; Task wlc = Task.Factory.StartNew(a, ct); } }; }