rabidus-test/Assets/Plugins/QFSW/Quantum Console/Source/Scripts/Logging/LogStorage.cs

91 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace QFSW.QC
{
public class LogStorage : ILogStorage
{
private readonly List<ILog> _consoleLogs = new List<ILog>(10);
private readonly StringBuilder _logTraceBuilder = new StringBuilder(2048);
public int MaxStoredLogs { get; set; }
public IReadOnlyList<ILog> Logs => _consoleLogs;
public LogStorage(int maxStoredLogs = -1)
{
MaxStoredLogs = maxStoredLogs;
}
public void AddLog(ILog log)
{
_consoleLogs.Add(log);
int logLength = _logTraceBuilder.Length + log.Text.Length;
if (log.NewLine && _logTraceBuilder.Length > 0)
{
logLength += Environment.NewLine.Length;
}
if (MaxStoredLogs > 0)
{
while (_consoleLogs.Count > MaxStoredLogs)
{
int junkLength = _consoleLogs[0].Text.Length;
if (_consoleLogs.Count > 1 &&_consoleLogs[1].NewLine)
{
junkLength += Environment.NewLine.Length;
}
junkLength = Mathf.Min(junkLength, _logTraceBuilder.Length);
logLength -= junkLength;
_logTraceBuilder.Remove(0, junkLength);
_consoleLogs.RemoveAt(0);
}
}
int capacity = _logTraceBuilder.Capacity;
while (capacity < logLength)
{
capacity *= 2;
}
_logTraceBuilder.EnsureCapacity(capacity);
if (log.NewLine && _logTraceBuilder.Length > 0)
{
_logTraceBuilder.Append(Environment.NewLine);
}
_logTraceBuilder.Append(log.Text);
}
public void RemoveLog()
{
if (_consoleLogs.Count > 0)
{
ILog log = _consoleLogs[_consoleLogs.Count - 1];
_consoleLogs.RemoveAt(_consoleLogs.Count - 1);
int removeLength = log.Text.Length;
if (log.NewLine && _consoleLogs.Count > 0)
{
removeLength += Environment.NewLine.Length;
}
_logTraceBuilder.Remove(_logTraceBuilder.Length - removeLength, removeLength);
}
}
public void Clear()
{
_consoleLogs.Clear();
_logTraceBuilder.Length = 0;
}
public string GetLogString()
{
return _logTraceBuilder.ToString();
}
}
}