diff --git a/SharpLib.csproj b/SharpLib.csproj
index 8713be8..89c674e 100644
--- a/SharpLib.csproj
+++ b/SharpLib.csproj
@@ -11,9 +11,12 @@
true
true
preview
-
+
+ $(NoWarn);SYSLIB0050
+
+
diff --git a/cfg/Config.cs b/cfg/Config.cs
index 01392b2..621ae1d 100644
--- a/cfg/Config.cs
+++ b/cfg/Config.cs
@@ -53,26 +53,12 @@ namespace lib
#region SaveLoad
- /*
- static public res.Ref res_load( string filename )
- {
- return new res.Ref( filename, load( filename ) );
- }
- */
static public T res_load( string filename ) where T : Config
{
return load( filename );
}
- /*
- static public ResRefConfig res_load( string filename, Type t )
- {
- return new ResRefConfig( filename, load( filename, t ) );
- }
- */
-
-
static public Config load( string filename )
{
return load( filename, null );
diff --git a/res/Resource.cs b/res/Resource.cs
index 9f7ce2f..6e22a32 100644
--- a/res/Resource.cs
+++ b/res/Resource.cs
@@ -1,369 +1,371 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-//using System.Threading.Tasks;
-using System.Diagnostics;
-using System.Reflection;
-using System.Collections.Immutable;
-using System.Threading;
-
-
-namespace res
-{
-
-
- using ImmDefLoad = ImmutableQueue<(string name, Ref)>;
-
- public interface Res_old
- {
-
- }
-
- [Serializable]
- public class Ref : lib.I_Serialize
- {
- public string filename { get { return m_filename; } }
-
- //For construction
- public Ref()
- {
- }
-
- public Ref( string filename )
- {
- m_filename = filename;
- }
-
- virtual public void OnSerialize()
- {
- }
-
- virtual public void OnDeserialize( object enclosing )
- {
- }
-
- virtual public void OnChange()
- {
- }
-
- virtual internal void load()
- {
-
- }
-
- protected string m_filename;
- }
-
- [Serializable]
- public class Ref : Ref where T : class
- {
- public T res => m_res != null ? m_res : (m_res = Mgr.load( filename ));
-
- //For serialization
- public Ref()
- :
- base( "{unknown}" )
- {
- }
-
- public Ref( string filename )
- :
- base( filename )
- {
- }
-
- /*
- public Ref( string filename, T res ) : base( filename )
- {
- m_res = res;
- }
- */
-
- override internal void load()
- {
- m_res = Mgr.load( filename );
- }
-
-
- [NonSerialized]
- private T m_res;
-
- }
-
-
-
-
- public class Resource
- {
- static public Mgr mgr;
-
- }
-
-
- /*
- public class Loader
- {
- static public T load( string filename )
- {
- Debug.Assert( false, "Specialize Loader for your type for file" );
- return default(T);
- }
- }
- */
-
- public delegate T Load( string filename );
-
-
- class LoadHolder
- {
- internal virtual object load()
- {
- return null;
- }
- }
-
-
- class LoadHolder : LoadHolder
- {
- public LoadHolder( Load fnLoad )
- {
- m_fnLoad = fnLoad;
- }
-
-
- public Load m_fnLoad;
-
- internal override object load()
- {
- return load();
- }
- }
-
- //generic classes make a new static per generic type
- class ResCache where T : class
- {
- public static T s_default = default;
- public static ImmutableDictionary> s_cache = ImmutableDictionary>.Empty;
-
-
-
- }
-
-
- public class Mgr
- {
-
-
- static public void startup()
- {
- Resource.mgr = new Mgr();
- }
-
- static public void register( Load loader )
- {
- Debug.Assert( !Resource.mgr.m_loaders.ContainsKey( typeof( T ) ) );
-
- var lh = new LoadHolder( loader );
-
- ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, typeof( T ), lh );
- }
-
- //Register all subclasses of a particular type
- //???? Should we just always do this?
- static public void registerSub( Type baseType )
- {
- log.info( $"Registering loader for {baseType.Name}" );
-
- Type[] typeParams = new Type[1];
- foreach( var mi in baseType.GetMethods() )
- {
- if( mi.Name == "res_load" && mi.IsGenericMethod )
- {
- foreach( var ass in AppDomain.CurrentDomain.GetAssemblies() )
- {
- foreach( var t in ass.GetTypes() )
- {
- if( !baseType.IsAssignableFrom( t ) ) continue;
-
- log.debug( $"Making a lodaer for {t.Name}" );
-
- typeParams[0] = t;
- var mi_ng = mi.MakeGenericMethod( typeParams );
-
- var loadGenType = typeof(Load<>);
-
- var loadType = loadGenType.MakeGenericType( t );
-
- var loader = Delegate.CreateDelegate( loadType, mi_ng );
-
- var lhGenType = typeof(LoadHolder<>);
-
- var lhType = lhGenType.MakeGenericType( t );
-
- var lh = Activator.CreateInstance( lhType, loader ) as LoadHolder;
-
- ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, t, lh );
- }
- }
- return;
- }
- }
- }
-
-
- static public Ref lookup( string filename ) where T : class
- {
- /*
- LoadHolder loader_gen;
- Resource.mgr.m_loaders.TryGetValue( typeof( T ), out loader_gen );
-
- var loaderHolder = loader_gen as LoadHolder;
-
- if( loaderHolder != null )
- {
- var rf_raw = loaderHolder.dlgtLoad( filename );
- Ref rf = rf_raw as Ref;
- return rf;
- }
- */
-
- return new Ref( filename );
- }
-
- //*
- static public Ref lookup( string filename, Type t )
- {
- /*
- LoadHolder loader_gen;
- Resource.mgr.m_loaders.TryGetValue( t, out loader_gen );
-
- var lhGenType = typeof(LoadHolder<>);
-
-
- if( loaderHolder != null )
- {
- var rf_raw = loaderHolder.load( filename );
- return rf_raw;
- }
- */
-
- return new Ref( filename );
- }
- //*/
-
- static public T load( string filename ) where T : class
- {
- if( ResCache.s_cache.TryGetValue( filename, out var wr ) )
- {
- if( wr.TryGetTarget( out var v ) )
- return v;
-
- log.info( $"{filename} was in cache, but its been dropped, reloading." );
- }
-
- log.warn( $"Block Loading {filename}." );
-
- var newV = actualLoad( filename );
-
- return newV;
- }
-
- static public T actualLoad( string filename ) where T : class
- {
- if( s_loading.TryGetValue( filename, out var evt ) )
- {
- evt.WaitOne();
-
- if( ResCache.s_cache.TryGetValue( filename, out var wr ) )
- {
- if( wr.TryGetTarget( out var v ) )
- return v;
-
- log.error( $"{filename} was in cache, but its been dropped, reloading." );
- }
- }
-
- var evtNew = new AutoResetEvent( false );
-
- if( ImmutableInterlocked.TryAdd( ref s_loading, filename, evtNew ) )
- {
- if( Resource.mgr.m_loaders.TryGetValue( typeof( T ), out var loaderGen ) )
- {
- var loader = loaderGen as LoadHolder;
-
- var v = loader.m_fnLoad( filename );
-
- var weak = new WeakReference( v );
-
- var alreadyAdded = !ImmutableInterlocked.TryAdd( ref ResCache.s_cache, filename, weak );
-
- evtNew.Set();
-
- //Done loading
- if( !ImmutableInterlocked.TryRemove( ref s_loading, filename, out var oldEvt ) )
- {
- log.error( $"Error removing loading event for {filename}" );
- }
-
- if( alreadyAdded )
- {
- log.error( $"Key {filename} already existed, though it shouldnt." );
- }
-
- return v;
- }
- else
- {
- log.error( $"Loader could not be found for type {typeof( T )}" );
-
- return ResCache.s_default;
- }
- }
-
- return actualLoad( filename );
- }
-
- static object s_loadingLock = new object();
-
- static ImmutableDictionary< string, AutoResetEvent > s_loading = ImmutableDictionary< string, AutoResetEvent >.Empty;
- static ImmDefLoad s_deferredLoad = ImmDefLoad.Empty;
-
-
- Mgr()
- {
- log.info( $"Creating Res.Mgr" );
-
- var ts = new ThreadStart( deferredLoader );
-
- m_deferredLoader = new Thread( ts );
-
- m_deferredLoader.Start();
- }
-
- void deferredLoader()
- {
- while( true )
- {
- Thread.Sleep( 1 );
-
- if( ImmutableInterlocked.TryDequeue( ref s_deferredLoad, out var v ) )
- {
- v.Item2.load();
- }
- }
- }
-
-
-
- ImmutableDictionary m_loaders = ImmutableDictionary.Empty;
-
- Thread m_deferredLoader;
-
- }
-
-
-
-
-
-}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+//using System.Threading.Tasks;
+using System.Diagnostics;
+using System.Reflection;
+using System.Collections.Immutable;
+using System.Threading;
+
+
+namespace res
+{
+
+
+ using ImmDefLoad = ImmutableQueue<(string name, Ref)>;
+
+ public interface Res_old
+ {
+
+ }
+
+ [Serializable]
+ public class Ref : lib.I_Serialize
+ {
+ public string Filename =>_filename;
+
+ //For construction
+ public Ref()
+ {
+ _filename = "{UNSET_CONS}";
+ }
+
+ public Ref( string filename )
+ {
+ _filename = filename;
+ }
+
+ virtual public void OnSerialize()
+ {
+ }
+
+ virtual public void OnDeserialize( object enclosing )
+ {
+ }
+
+ virtual public void OnChange()
+ {
+ }
+
+ virtual internal void load()
+ {
+
+ }
+
+ protected string _filename = "{UNSET_INLINE}";
+ }
+
+ [Serializable]
+ public class Ref : Ref where T : class
+ {
+ public T res => m_res != null ? m_res : ( m_res = Mgr.load( Filename ) );
+
+ //For serialization
+ public Ref()
+ :
+ base( "{unknown}" )
+ {
+ }
+
+ public Ref( string filename )
+ :
+ base( filename )
+ {
+ }
+
+ /*
+ public Ref( string filename, T res ) : base( filename )
+ {
+ m_res = res;
+ }
+ */
+
+ override internal void load()
+ {
+ m_res = Mgr.load( Filename );
+ }
+
+
+ [NonSerialized]
+ private T m_res;
+
+ }
+
+
+
+
+ public class Resource
+ {
+ static public Mgr mgr;
+
+ }
+
+
+ /*
+ public class Loader
+ {
+ static public T load( string filename )
+ {
+ Debug.Assert( false, "Specialize Loader for your type for file" );
+ return default(T);
+ }
+ }
+ */
+
+ public delegate T Load( string filename );
+
+
+ class LoadHolder
+ {
+ internal virtual object load()
+ {
+ return null;
+ }
+ }
+
+
+ class LoadHolder : LoadHolder
+ {
+ public LoadHolder( Load fnLoad )
+ {
+ m_fnLoad = fnLoad;
+ }
+
+
+ public Load m_fnLoad;
+
+ internal override object load()
+ {
+ return load();
+ }
+ }
+
+ //generic classes make a new static per generic type
+ class ResCache where T : class
+ {
+ public static T s_default = default;
+ public static ImmutableDictionary> s_cache = ImmutableDictionary>.Empty;
+
+
+
+ }
+
+
+ public class Mgr
+ {
+
+
+ static public void startup()
+ {
+ Resource.mgr = new Mgr();
+ }
+
+ static public void register( Load loader )
+ {
+ Debug.Assert( !Resource.mgr.m_loaders.ContainsKey( typeof( T ) ) );
+
+ var lh = new LoadHolder( loader );
+
+ ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, typeof( T ), lh );
+ }
+
+ //Register all subclasses of a particular type
+ //???? Should we just always do this?
+ static public void registerSub( Type baseType )
+ {
+ log.info( $"Registering loader for {baseType.Name}" );
+
+ Type[] typeParams = new Type[1];
+ foreach( var mi in baseType.GetMethods() )
+ {
+ if( mi.Name == "res_load" && mi.IsGenericMethod )
+ {
+ foreach( var ass in AppDomain.CurrentDomain.GetAssemblies() )
+ {
+ foreach( var t in ass.GetTypes() )
+ {
+ if( !baseType.IsAssignableFrom( t ) )
+ continue;
+
+ log.debug( $"Making a lodaer for {t.Name}" );
+
+ typeParams[0] = t;
+ var mi_ng = mi.MakeGenericMethod( typeParams );
+
+ var loadGenType = typeof( Load<> );
+
+ var loadType = loadGenType.MakeGenericType( t );
+
+ var loader = Delegate.CreateDelegate( loadType, mi_ng );
+
+ var lhGenType = typeof( LoadHolder<> );
+
+ var lhType = lhGenType.MakeGenericType( t );
+
+ var lh = Activator.CreateInstance( lhType, loader ) as LoadHolder;
+
+ ImmutableInterlocked.TryAdd( ref Resource.mgr.m_loaders, t, lh );
+ }
+ }
+ return;
+ }
+ }
+ }
+
+
+ static public Ref lookup( string filename ) where T : class
+ {
+ /*
+ LoadHolder loader_gen;
+ Resource.mgr.m_loaders.TryGetValue( typeof( T ), out loader_gen );
+
+ var loaderHolder = loader_gen as LoadHolder;
+
+ if( loaderHolder != null )
+ {
+ var rf_raw = loaderHolder.dlgtLoad( filename );
+ Ref rf = rf_raw as Ref;
+ return rf;
+ }
+ */
+
+ return new Ref( filename );
+ }
+
+ //*
+ static public Ref lookup( string filename, Type t )
+ {
+ /*
+ LoadHolder loader_gen;
+ Resource.mgr.m_loaders.TryGetValue( t, out loader_gen );
+
+ var lhGenType = typeof(LoadHolder<>);
+
+
+ if( loaderHolder != null )
+ {
+ var rf_raw = loaderHolder.load( filename );
+ return rf_raw;
+ }
+ */
+
+ return new Ref( filename );
+ }
+ //*/
+
+ static public T load( string filename ) where T : class
+ {
+ if( ResCache.s_cache.TryGetValue( filename, out var wr ) )
+ {
+ if( wr.TryGetTarget( out var v ) )
+ return v;
+
+ log.info( $"{filename} was in cache, but its been dropped, reloading." );
+ }
+
+ log.warn( $"Block Loading {filename}." );
+
+ var newV = actualLoad( filename );
+
+ return newV;
+ }
+
+ static public T actualLoad( string filename ) where T : class
+ {
+ if( s_loading.TryGetValue( filename, out var evt ) )
+ {
+ evt.WaitOne();
+
+ if( ResCache.s_cache.TryGetValue( filename, out var wr ) )
+ {
+ if( wr.TryGetTarget( out var v ) )
+ return v;
+
+ log.error( $"{filename} was in cache, but its been dropped, reloading." );
+ }
+ }
+
+ var evtNew = new AutoResetEvent( false );
+
+ if( ImmutableInterlocked.TryAdd( ref s_loading, filename, evtNew ) )
+ {
+ if( Resource.mgr.m_loaders.TryGetValue( typeof( T ), out var loaderGen ) )
+ {
+ var loader = loaderGen as LoadHolder;
+
+ var v = loader.m_fnLoad( filename );
+
+ var weak = new WeakReference( v );
+
+ var alreadyAdded = !ImmutableInterlocked.TryAdd( ref ResCache.s_cache, filename, weak );
+
+ evtNew.Set();
+
+ //Done loading
+ if( !ImmutableInterlocked.TryRemove( ref s_loading, filename, out var oldEvt ) )
+ {
+ log.error( $"Error removing loading event for {filename}" );
+ }
+
+ if( alreadyAdded )
+ {
+ log.error( $"Key {filename} already existed, though it shouldnt." );
+ }
+
+ return v;
+ }
+ else
+ {
+ log.error( $"Loader could not be found for type {typeof( T )}" );
+
+ return ResCache.s_default;
+ }
+ }
+
+ return actualLoad( filename );
+ }
+
+ static object s_loadingLock = new object();
+
+ static ImmutableDictionary s_loading = ImmutableDictionary.Empty;
+ static ImmDefLoad s_deferredLoad = ImmDefLoad.Empty;
+
+
+ Mgr()
+ {
+ log.info( $"Creating Res.Mgr" );
+
+ var ts = new ThreadStart( deferredLoader );
+
+ m_deferredLoader = new Thread( ts );
+
+ m_deferredLoader.Start();
+ }
+
+ void deferredLoader()
+ {
+ while( true )
+ {
+ Thread.Sleep( 1 );
+
+ if( ImmutableInterlocked.TryDequeue( ref s_deferredLoad, out var v ) )
+ {
+ v.Item2.load();
+ }
+ }
+ }
+
+
+
+ ImmutableDictionary m_loaders = ImmutableDictionary.Empty;
+
+ Thread m_deferredLoader;
+
+ }
+
+
+
+
+
+}
diff --git a/ser/XmlFormatter2.cs b/ser/XmlFormatter2.cs
index d46f998..2c182cb 100644
--- a/ser/XmlFormatter2.cs
+++ b/ser/XmlFormatter2.cs
@@ -175,7 +175,7 @@ namespace lib
}
#region Deserialize
- private static FormatterConverter s_conv = new FormatterConverter();
+ private static FormatterConverter s_conv = new();
public object Deserialize( Stream stream )
@@ -188,7 +188,7 @@ namespace lib
public object DeserializeKnownType( Stream stream, Type t )
{
- XmlTextReader reader = new XmlTextReader( stream );
+ XmlTextReader reader = new( stream );
object obj = Deserialize( reader, t );
@@ -262,7 +262,7 @@ namespace lib
private object Deserialize( XmlElement elem, MemberInfo mi, Type type, object existing /*, object enclosing = null*/ )
{
- string name = mi?.Name ?? "{NOT_FOUND}";
+ var name = mi?.Name ?? "{NOT_FOUND}";
return Deserialize( elem, mi, type, name, existing );
}
@@ -312,17 +312,17 @@ namespace lib
return existing;
}
- Type[] mm_types = new Type[1];
private object GetDefault( Type t )
{
- mm_types[0] = t;
+ var types = new Type[1];
+ types[0] = t;
- var fn = GetType().GetMethod( "GetDefaultGeneric" ).MakeGenericMethod( mm_types );
+ var fn = GetType().GetMethod( "GetDefaultGeneric" ).MakeGenericMethod( types );
return fn.Invoke( this, null );
}
- public T GetDefaultGeneric()
+ static public T GetDefaultGeneric()
{
return default( T );
}
@@ -436,9 +436,9 @@ namespace lib
{
var node = objNode as XmlElement;
- String name = node.Name;
+ string name = node.Name;
- String childType = node.GetAttribute( "_.t" );
+ string childType = node.GetAttribute( "_.t" );
name = refl.TypeToIdentifier( name );
@@ -455,7 +455,7 @@ namespace lib
//object objUn = FormatterServices.GetSafeUninitializedObject( finalType );
- IDeserializationCallback objUnOnDeser = obj as IDeserializationCallback;
+ var objUnOnDeser = obj as IDeserializationCallback;
mm_consType[0] = typeof( SerializationInfo );
mm_consType[1] = typeof( StreamingContext );
@@ -479,7 +479,7 @@ namespace lib
foreach( var serMember in serInfo )
{
- String name = serMember.Name;
+ string name = serMember.Name;
name = refl.TypeToIdentifier( name );
@@ -512,7 +512,7 @@ namespace lib
foreach( FieldInfo childFi in fields )
{
- String name = childFi.Name;
+ string name = childFi.Name;
var dontAtt = childFi.GetCustomAttributes();
@@ -581,7 +581,7 @@ namespace lib
foreach( var childPi in props )
{
- String name = childPi.Name;
+ string name = childPi.Name;
var dontAtt = childPi.GetCustomAttributes();
if( dontAtt.Any() )
{
@@ -1155,7 +1155,7 @@ namespace lib
foreach( var serMember in serInfo )
{
- String name = serMember.Name;
+ string name = serMember.Name;
name = refl.TypeToIdentifier( name );
@@ -1206,7 +1206,7 @@ namespace lib
foreach( var childFi in fields )
{
- String name = childFi.Name;
+ string name = childFi.Name;
var dontAtt = childFi.GetCustomAttributes();
string propName = "";
@@ -1255,7 +1255,7 @@ namespace lib
foreach( var childPi in props )
{
- String name = childPi.Name;
+ string name = childPi.Name;
var dontAtt = childPi.GetCustomAttributes();
if( dontAtt.Any() )