 4da44e09cb
			
		
	
	
		4da44e09cb
		
			
		
	
	
	
	
		
			
			* Make all structs readonly when applicable. It should reduce amount of needless defensive copies * Make structs with trivial boilerplate equality code record structs * Remove unnecessary readonly modifiers from TextureCreateInfo * Make BitMap structs readonly too
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Concurrent;
 | |
| using System.Collections.Generic;
 | |
| using System.Diagnostics;
 | |
| 
 | |
| namespace ARMeilleure.Diagnostics
 | |
| {
 | |
|     static class Symbols
 | |
|     {
 | |
|         private readonly struct RangedSymbol
 | |
|         {
 | |
|             public readonly ulong Start;
 | |
|             public readonly ulong End;
 | |
|             public readonly ulong ElementSize;
 | |
|             public readonly string Name;
 | |
| 
 | |
|             public RangedSymbol(ulong start, ulong end, ulong elemSize, string name)
 | |
|             {
 | |
|                 Start = start;
 | |
|                 End = end;
 | |
|                 ElementSize = elemSize;
 | |
|                 Name = name;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static readonly ConcurrentDictionary<ulong, string> _symbols;
 | |
|         private static readonly List<RangedSymbol> _rangedSymbols;
 | |
| 
 | |
|         static Symbols()
 | |
|         {
 | |
|             _symbols = new ConcurrentDictionary<ulong, string>();
 | |
|             _rangedSymbols = new List<RangedSymbol>();
 | |
|         }
 | |
| 
 | |
|         public static string Get(ulong address)
 | |
|         {
 | |
|             string result;
 | |
| 
 | |
|             if (_symbols.TryGetValue(address, out result))
 | |
|             {
 | |
|                 return result;
 | |
|             }
 | |
| 
 | |
|             lock (_rangedSymbols)
 | |
|             {
 | |
|                 foreach (RangedSymbol symbol in _rangedSymbols)
 | |
|                 {
 | |
|                     if (address >= symbol.Start && address <= symbol.End)
 | |
|                     {
 | |
|                         ulong diff = address - symbol.Start;
 | |
|                         ulong rem = diff % symbol.ElementSize;
 | |
| 
 | |
|                         result = symbol.Name + "_" + diff / symbol.ElementSize;
 | |
| 
 | |
|                         if (rem != 0)
 | |
|                         {
 | |
|                             result += "+" + rem;
 | |
|                         }
 | |
| 
 | |
|                         _symbols.TryAdd(address, result);
 | |
| 
 | |
|                         return result;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         [Conditional("M_DEBUG")]
 | |
|         public static void Add(ulong address, string name)
 | |
|         {
 | |
|             _symbols.TryAdd(address, name);
 | |
|         }
 | |
| 
 | |
|         [Conditional("M_DEBUG")]
 | |
|         public static void Add(ulong address, ulong size, ulong elemSize, string name)
 | |
|         {
 | |
|             lock (_rangedSymbols)
 | |
|             {
 | |
|                 _rangedSymbols.Add(new RangedSymbol(address, address + size, elemSize, name));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |