From d1a52c6c7c6a811ecb6893375356791f085ed46d Mon Sep 17 00:00:00 2001 From: wo80 Date: Mon, 14 Feb 2022 13:29:19 +0100 Subject: [PATCH] Simplify log implementation (no need for interface abstractions). --- src/MeshExplorer/FormLog.cs | 2 +- src/Triangle/Log.cs | 122 ++++++++++++++++++----- src/Triangle/Logging/ILog.cs | 34 ------- src/Triangle/Logging/ILogItem.cs | 21 ---- src/Triangle/Logging/LogItem.cs | 53 ---------- src/Triangle/Mesh.cs | 5 +- src/Triangle/Meshing/ConstraintMesher.cs | 5 +- src/Triangle/Meshing/QualityMesher.cs | 5 +- src/Triangle/Topology/DCEL/Face.cs | 1 + 9 files changed, 101 insertions(+), 147 deletions(-) delete mode 100644 src/Triangle/Logging/ILog.cs delete mode 100644 src/Triangle/Logging/ILogItem.cs delete mode 100644 src/Triangle/Logging/LogItem.cs diff --git a/src/MeshExplorer/FormLog.cs b/src/MeshExplorer/FormLog.cs index 6797065..ec6d9a5 100644 --- a/src/MeshExplorer/FormLog.cs +++ b/src/MeshExplorer/FormLog.cs @@ -42,7 +42,7 @@ namespace MeshExplorer private ListViewItem CreateListViewItem(LogItem item) { - ListViewItem lvi = new ListViewItem(new string[] { item.Message, item.Info }); + ListViewItem lvi = new ListViewItem(new string[] { item.Message, item.Details }); if (item.Level == LogLevel.Error) { diff --git a/src/Triangle/Log.cs b/src/Triangle/Log.cs index 16ad278..57c10f2 100644 --- a/src/Triangle/Log.cs +++ b/src/Triangle/Log.cs @@ -6,28 +6,87 @@ namespace TriangleNet { + using System; using System.Collections.Generic; - using TriangleNet.Logging; + + public enum LogLevel { Info, Warning, Error } + + /// + /// Represents an item stored in the log. + /// + public class LogItem + { + private readonly DateTime time; + private readonly LogLevel level; + private readonly string message; + private readonly string details; + + /// + /// Gets the the item was logged. + /// + public DateTime Time => time; + + /// + /// Gets the . + /// + public LogLevel Level => level; + + /// + /// Gets the log message. + /// + public string Message => message; + + /// + /// Gets further details of the log message. + /// + public string Details => details; + + /// + /// Creates a new instance of the class. + /// + /// The log level. + /// The log message. + public LogItem(LogLevel level, string message) + : this(level, message, "") + { } + + /// + /// Creates a new instance of the class. + /// + /// The log level. + /// The log message. + /// The message details. + public LogItem(LogLevel level, string message, string details) + { + time = DateTime.Now; + + this.level = level; + this.message = message; + this.details = details; + } + } /// /// A simple logger, which logs messages to a List. - /// - /// Using singleton pattern as proposed by Jon Skeet. - /// http://csharpindepth.com/Articles/General/Singleton.aspx - /// - public sealed class Log : ILog + public sealed class Log { /// /// Log detailed information. /// public static bool Verbose { get; set; } - private List log = new List(); + /// + /// Gets all log messages. + /// + public IList Data => data; - private LogLevel level = LogLevel.Info; + private readonly List data = new List(); #region Singleton pattern + // Singleton pattern as proposed by Jon Skeet: + // https://csharpindepth.com/Articles/Singleton + private static readonly Log instance = new Log(); // Explicit static constructor to tell C# compiler @@ -36,7 +95,7 @@ namespace TriangleNet private Log() { } - public static ILog Instance + public static Log Instance { get { @@ -46,39 +105,50 @@ namespace TriangleNet #endregion + /// + /// Adds a to the log. + /// + /// public void Add(LogItem item) { - log.Add(item); + data.Add(item); } + /// + /// Clear all messages from the log. + /// public void Clear() { - log.Clear(); + data.Clear(); } + /// + /// Log info message. + /// + /// The message. public void Info(string message) { - log.Add(new LogItem(LogLevel.Info, message)); + data.Add(new LogItem(LogLevel.Info, message)); } - public void Warning(string message, string location) + /// + /// Log warning message. + /// + /// The message. + /// Message details, for example the code location where the error occured (class, method). + public void Warning(string message, string details) { - log.Add(new LogItem(LogLevel.Warning, message, location)); + data.Add(new LogItem(LogLevel.Warning, message, details)); } - public void Error(string message, string location) + /// + /// Log error message. + /// + /// The message. + /// Message details, for example the code location where the error occured (class, method). + public void Error(string message, string details) { - log.Add(new LogItem(LogLevel.Error, message, location)); - } - - public IList Data - { - get { return log; } - } - - public LogLevel Level - { - get { return level; } + data.Add(new LogItem(LogLevel.Error, message, details)); } } } diff --git a/src/Triangle/Logging/ILog.cs b/src/Triangle/Logging/ILog.cs deleted file mode 100644 index 0128514..0000000 --- a/src/Triangle/Logging/ILog.cs +++ /dev/null @@ -1,34 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/ -// -// ----------------------------------------------------------------------- - -namespace TriangleNet.Logging -{ - using System.Collections.Generic; - - public enum LogLevel - { - Info = 0, - Warning = 1, - Error = 2 - } - - /// - /// A basic log interface. - /// - public interface ILog where T : ILogItem - { - void Add(T item); - void Clear(); - - void Info(string message); - void Error(string message, string info); - void Warning(string message, string info); - - IList Data { get; } - - LogLevel Level { get; } - } -} diff --git a/src/Triangle/Logging/ILogItem.cs b/src/Triangle/Logging/ILogItem.cs deleted file mode 100644 index 777e7d8..0000000 --- a/src/Triangle/Logging/ILogItem.cs +++ /dev/null @@ -1,21 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/ -// -// ----------------------------------------------------------------------- - -namespace TriangleNet.Logging -{ - using System; - - /// - /// A basic log item interface. - /// - public interface ILogItem - { - DateTime Time { get; } - LogLevel Level { get; } - string Message { get; } - string Info { get; } - } -} diff --git a/src/Triangle/Logging/LogItem.cs b/src/Triangle/Logging/LogItem.cs deleted file mode 100644 index 8eb55ab..0000000 --- a/src/Triangle/Logging/LogItem.cs +++ /dev/null @@ -1,53 +0,0 @@ -// ----------------------------------------------------------------------- -// -// Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/ -// -// ----------------------------------------------------------------------- - -namespace TriangleNet.Logging -{ - using System; - - /// - /// Represents an item stored in the log. - /// - public class LogItem : ILogItem - { - DateTime time; - LogLevel level; - string message; - string info; - - public DateTime Time - { - get { return time; } - } - - public LogLevel Level - { - get { return level; } - } - - public string Message - { - get { return message; } - } - - public string Info - { - get { return info; } - } - - public LogItem(LogLevel level, string message) - : this(level, message, "") - { } - - public LogItem(LogLevel level, string message, string info) - { - this.time = DateTime.Now; - this.level = level; - this.message = message; - this.info = info; - } - } -} diff --git a/src/Triangle/Mesh.cs b/src/Triangle/Mesh.cs index dd27cc9..94b2706 100644 --- a/src/Triangle/Mesh.cs +++ b/src/Triangle/Mesh.cs @@ -10,7 +10,6 @@ namespace TriangleNet using System; using System.Collections.Generic; using TriangleNet.Geometry; - using TriangleNet.Logging; using TriangleNet.Meshing; using TriangleNet.Meshing.Data; using TriangleNet.Meshing.Iterators; @@ -26,7 +25,7 @@ namespace TriangleNet IPredicates predicates; - ILog logger; + Log logger = Log.Instance; QualityMesher qualityMesher; @@ -236,8 +235,6 @@ namespace TriangleNet { Initialize(); - logger = Log.Instance; - behavior = new Behavior(); vertices = new Dictionary(); diff --git a/src/Triangle/Meshing/ConstraintMesher.cs b/src/Triangle/Meshing/ConstraintMesher.cs index a5b5824..1d6e512 100644 --- a/src/Triangle/Meshing/ConstraintMesher.cs +++ b/src/Triangle/Meshing/ConstraintMesher.cs @@ -10,7 +10,6 @@ namespace TriangleNet.Meshing using System; using System.Collections.Generic; using TriangleNet.Geometry; - using TriangleNet.Logging; using TriangleNet.Meshing.Iterators; using TriangleNet.Topology; @@ -24,7 +23,7 @@ namespace TriangleNet.Meshing List viri; - ILog logger; + Log logger = Log.Instance; public ConstraintMesher(Mesh mesh, Configuration config) { @@ -35,8 +34,6 @@ namespace TriangleNet.Meshing this.locator = mesh.locator; this.viri = new List(); - - logger = Log.Instance; } diff --git a/src/Triangle/Meshing/QualityMesher.cs b/src/Triangle/Meshing/QualityMesher.cs index e8e1194..b1bae3f 100644 --- a/src/Triangle/Meshing/QualityMesher.cs +++ b/src/Triangle/Meshing/QualityMesher.cs @@ -10,7 +10,6 @@ namespace TriangleNet.Meshing using System; using System.Collections.Generic; using TriangleNet.Geometry; - using TriangleNet.Logging; using TriangleNet.Meshing.Data; using TriangleNet.Topology; @@ -28,7 +27,7 @@ namespace TriangleNet.Meshing NewLocation newLocation; - ILog logger; + Log logger = Log.Instance; // Stores the vertices of the triangle that contains newvertex // in SplitTriangle method. @@ -36,8 +35,6 @@ namespace TriangleNet.Meshing public QualityMesher(Mesh mesh, Configuration config) { - logger = Log.Instance; - badsubsegs = new Queue(); queue = new BadTriQueue(); diff --git a/src/Triangle/Topology/DCEL/Face.cs b/src/Triangle/Topology/DCEL/Face.cs index 0a1f6cc..f62e752 100644 --- a/src/Triangle/Topology/DCEL/Face.cs +++ b/src/Triangle/Topology/DCEL/Face.cs @@ -29,6 +29,7 @@ namespace TriangleNet.Topology.DCEL internal int id; internal int mark; + // If the face is a Voronio cell, this is the point that generates the cell. internal Point generator; internal HalfEdge edge;