Fix formatting

This commit is contained in:
Marc Hernandez 2024-04-28 20:05:36 -07:00
parent c18c106b72
commit f965662031

View File

@ -1,227 +1,270 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
static public class refl static public class refl
{ {
public class PredEnumerator public class PredEnumerator
{ {
public static PredEnumerator<T> Create<T>( IEnumerator<T> en, Predicate<T> pred ) public static PredEnumerator<T> Create<T>( IEnumerator<T> en, Predicate<T> pred )
{ {
return new PredEnumerator<T>( en, pred ); return new PredEnumerator<T>( en, pred );
} }
public static PredEnumerator<T> Create<T>( IEnumerable<T> en, Predicate<T> pred ) public static PredEnumerator<T> Create<T>( IEnumerable<T> en, Predicate<T> pred )
{ {
return new PredEnumerator<T>( en.GetEnumerator(), pred ); return new PredEnumerator<T>( en.GetEnumerator(), pred );
} }
} }
public class PredEnumerator<T>: PredEnumerator, IEnumerator<T> public class PredEnumerator<T> : PredEnumerator, IEnumerator<T>
{ {
public T Current => m_en.Current; public T Current => m_en.Current;
object IEnumerator.Current => m_en.Current; object IEnumerator.Current => m_en.Current;
public PredEnumerator( IEnumerator<T> en, Predicate<T> pred ) public PredEnumerator( IEnumerator<T> en, Predicate<T> pred )
{ {
m_en = en; m_en = en;
m_pred = pred; m_pred = pred;
} }
public bool MoveNext() public bool MoveNext()
{ {
var success = m_en.MoveNext(); var success = m_en.MoveNext();
if( !success ) if( !success )
return false; return false;
while( !m_pred( m_en.Current ) && ( success = m_en.MoveNext() ) ) while( !m_pred( m_en.Current ) && ( success = m_en.MoveNext() ) )
{ {
} }
return success; return success;
} }
public void Reset() public void Reset()
{ {
m_en.Reset(); m_en.Reset();
} }
#region IDisposable Support #region IDisposable Support
private bool disposedValue = false; // To detect redundant calls private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose( bool disposing ) protected virtual void Dispose( bool disposing )
{ {
if( !disposedValue ) if( !disposedValue )
{ {
if( disposing ) if( disposing )
{ {
// TODO: dispose managed state (managed objects). // TODO: dispose managed state (managed objects).
} }
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null. // TODO: set large fields to null.
disposedValue = true; disposedValue = true;
} }
} }
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~MyEnumerator() // ~MyEnumerator()
// { // {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above. // // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false); // Dispose(false);
// } // }
// This code added to correctly implement the disposable pattern. // This code added to correctly implement the disposable pattern.
public void Dispose() public void Dispose()
{ {
// Do not change this code. Put cleanup code in Dispose(bool disposing) above. // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose( true ); Dispose( true );
// TODO: uncomment the following line if the finalizer is overridden above. // TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this); // GC.SuppressFinalize(this);
} }
#endregion #endregion
IEnumerator<T> m_en; IEnumerator<T> m_en;
Predicate<T> m_pred; Predicate<T> m_pred;
} }
public class PredEnumerable<T>: IEnumerable<T> public class PredEnumerable<T> : IEnumerable<T>
{ {
public PredEnumerable( PredEnumerator<T> en ) public PredEnumerable( PredEnumerator<T> en )
{ {
m_en = en; m_en = en;
} }
public IEnumerator<T> GetEnumerator() public IEnumerator<T> GetEnumerator()
{ {
return m_en; return m_en;
} }
IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator()
{ {
return m_en; return m_en;
} }
PredEnumerator<T> m_en; PredEnumerator<T> m_en;
} }
public static void GetAllFields( Type t, List<FieldInfo> list )
{ public static string PrettyName( FieldInfo fi )
var fieldArr = t.GetFields( {
BindingFlags.DeclaredOnly | var name = fi.Name;
BindingFlags.NonPublic | if( name[0] != '<' )
BindingFlags.Public | return name;
BindingFlags.Instance );
var gtIndex = name.IndexOf( '>' );
var en = PredEnumerator.Create<FieldInfo>( fieldArr.AsEnumerable<FieldInfo>(), fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null );
name = name.Substring( 1, gtIndex - 1 );
list.AddRange( new PredEnumerable<FieldInfo>( en ) );
return name;
if( t.BaseType != null && t.BaseType != typeof( object ) ) }
{
GetAllFields( t.BaseType, list );
} public static void GetAllFields( Type t, List<FieldInfo> list )
} {
GetAllFieldsRecursive( t, true, list );
}
public static ImmutableList<FieldInfo> GetAllFields( Type t )
{ public static void GetAllFieldsRecursive( Type t, bool recurse, List<FieldInfo> list )
{ {
if( s_fieldCache.TryGetValue( t, out var first ) ) var fieldArr = t.GetFields(
return first; BindingFlags.DeclaredOnly |
} BindingFlags.NonPublic |
BindingFlags.Public |
lock( t ) BindingFlags.Instance );
{
if( s_fieldCache.TryGetValue( t, out var second ) ) var en = PredEnumerator.Create<FieldInfo>( fieldArr.AsEnumerable<FieldInfo>(), fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null );
return second;
list.AddRange( new PredEnumerable<FieldInfo>( en ) );
var list = new List<FieldInfo>();
if( recurse && t.BaseType != null && t.BaseType != typeof( object ) )
GetAllFields( t, list ); {
GetAllFields( t.BaseType, list );
var immList = list.ToImmutableList(); }
}
Interlocked.Exchange( ref s_fieldCache, s_fieldCache.Add( t, immList ) ); public static void GetAllFieldsUntil( Type t, Type tooFar, List<FieldInfo> list )
{
return immList; var fieldArr = t.GetFields(
} BindingFlags.DeclaredOnly |
} BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance );
public static void GetAllProperties( Type t, List<PropertyInfo> list )
{ var en = PredEnumerator.Create<FieldInfo>( fieldArr.AsEnumerable<FieldInfo>(), fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null );
var propArr = t.GetProperties(
BindingFlags.DeclaredOnly | list.AddRange( new PredEnumerable<FieldInfo>( en ) );
BindingFlags.NonPublic |
BindingFlags.Public | if( t.BaseType != null && t.BaseType != tooFar )
BindingFlags.Instance {
); GetAllFields( t.BaseType, list );
}
var en = PredEnumerator.Create<PropertyInfo>( propArr.AsEnumerable<PropertyInfo>(), }
fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null && !list.Exists( f => f.Name == fa.Name ) );
public static ImmutableList<FieldInfo> GetAllFields<T>()
list.AddRange( new PredEnumerable<PropertyInfo>( en ) ); {
return GetAllFields( typeof( T ) );
if( t.BaseType != null && t.BaseType != typeof( object ) ) }
{
GetAllProperties( t.BaseType, list );
}
} public static ImmutableList<FieldInfo> GetAllFields( Type t )
{
public static ImmutableList<PropertyInfo> GetAllProperties( Type t ) {
{ if( s_fieldCache.TryGetValue( t, out var first ) )
if( s_propCache.TryGetValue( t, out var info ) ) return first;
return info; }
var list = new List<PropertyInfo>(); lock( t )
{
GetAllProperties( t, list ); if( s_fieldCache.TryGetValue( t, out var second ) )
return second;
var immList = list.ToImmutableList();
var list = new List<FieldInfo>();
s_propCache = s_propCache.Add( t, immList );
GetAllFields( t, list );
return immList;
} var immList = list.ToImmutableList();
Interlocked.Exchange( ref s_fieldCache, s_fieldCache.Add( t, immList ) );
static ImmutableDictionary<Type, ImmutableList<FieldInfo>> s_fieldCache = ImmutableDictionary<Type, ImmutableList<FieldInfo>>.Empty;
static ImmutableDictionary<Type, ImmutableList<PropertyInfo>> s_propCache = ImmutableDictionary<Type, ImmutableList<PropertyInfo>>.Empty; return immList;
}
}
//SLOW public static void GetAllProperties( Type t, List<PropertyInfo> list )
static public string TypeToIdentifier( string typename ) {
{ var propArr = t.GetProperties(
return typename.Replace( '<', '_' ).Replace( '>', '_' ).Replace( ',', '_' ).Replace( ' ', '_' ).Replace( '.', '_' ).Replace( '+', '_' ).Replace( '[', '_' ).Replace( ']', '_' ).Replace( '$', '_' ).Replace( ':', '_' ); BindingFlags.DeclaredOnly |
} BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance
);
var en = PredEnumerator.Create<PropertyInfo>( propArr.AsEnumerable<PropertyInfo>(),
} fa => fa.GetCustomAttribute( typeof( NonSerializedAttribute ) ) == null && !list.Exists( f => f.Name == fa.Name ) );
list.AddRange( new PredEnumerable<PropertyInfo>( en ) );
if( t.BaseType != null && t.BaseType != typeof( object ) )
{
GetAllProperties( t.BaseType, list );
}
}
public static ImmutableList<PropertyInfo> GetAllProperties( Type t )
{
if( s_propCache.TryGetValue( t, out var info ) )
return info;
var list = new List<PropertyInfo>();
GetAllProperties( t, list );
var immList = list.ToImmutableList();
s_propCache = s_propCache.Add( t, immList );
return immList;
}
static ImmutableDictionary<Type, ImmutableList<FieldInfo>> s_fieldCache = ImmutableDictionary<Type, ImmutableList<FieldInfo>>.Empty;
static ImmutableDictionary<Type, ImmutableList<PropertyInfo>> s_propCache = ImmutableDictionary<Type, ImmutableList<PropertyInfo>>.Empty;
//SLOW
static public string TypeToIdentifier( string typename )
{
return typename.Replace( '<', '_' ).Replace( '>', '_' ).Replace( ',', '_' ).Replace( ' ', '_' ).Replace( '.', '_' ).Replace( '+', '_' ).Replace( '[', '_' ).Replace( ']', '_' ).Replace( '$', '_' ).Replace( ':', '_' );
}
}