HLSF full functionally available. Working on Matrix.
Signed-off-by: Youmu Liu <105042599+Nitload-NSI@users.noreply.github.com>
This commit is contained in:
@@ -1,39 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="BlueprintNodeAttribute.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
[AttributeUsage( AttributeTargets.Method, AllowMultiple = false )]
|
|
||||||
public class BlueprintNodeExecutionAttribute : Attribute { }
|
|
||||||
}
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="PartialDictionary.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Collections
|
|
||||||
{
|
|
||||||
public partial class PartialDictionary<TKey, TValue> : IDictionary<TKey, TValue>
|
|
||||||
{
|
|
||||||
|
|
||||||
private readonly Dictionary<TKey, TValue> _source;
|
|
||||||
private readonly HashSet<TKey> _keys;
|
|
||||||
private readonly PartialDictionaryValues _values;
|
|
||||||
|
|
||||||
public PartialDictionary(
|
|
||||||
Dictionary<TKey, TValue> source,
|
|
||||||
TKey[] index )
|
|
||||||
{
|
|
||||||
_source = source;
|
|
||||||
_keys = new HashSet<TKey>( index );
|
|
||||||
foreach( TKey item in _keys ) {
|
|
||||||
if( !_source.ContainsKey( item ) ) {
|
|
||||||
_source.Add( item, default! );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_values = new PartialDictionaryValues( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
public PartialDictionary(
|
|
||||||
Dictionary<TKey, TValue> source,
|
|
||||||
HashSet<TKey> keys )
|
|
||||||
{
|
|
||||||
_source = source;
|
|
||||||
_keys = keys;
|
|
||||||
foreach( TKey item in _keys ) {
|
|
||||||
if( !_source.ContainsKey( item ) ) {
|
|
||||||
_source.Add( item, default! );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_values = new PartialDictionaryValues( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
public TValue this[ TKey key ]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if( _keys.Contains( key ) ) {
|
|
||||||
return _source[ key ];
|
|
||||||
}
|
|
||||||
throw new KeyNotFoundException();
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if( _keys.Contains( key ) ) {
|
|
||||||
_source[ key ] = value;
|
|
||||||
}
|
|
||||||
throw new KeyNotFoundException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICollection<TKey> Keys => _keys;
|
|
||||||
|
|
||||||
public ICollection<TValue> Values => _values;
|
|
||||||
|
|
||||||
public int Count => _keys.Count;
|
|
||||||
|
|
||||||
public bool Contains( KeyValuePair<TKey, TValue> item )
|
|
||||||
{
|
|
||||||
return _keys.Contains( item.Key ) && _source.Contains( item );
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ContainsKey( TKey key )
|
|
||||||
{
|
|
||||||
return _keys.Contains( key );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo( KeyValuePair<TKey, TValue>[] array, int arrayIndex )
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
|
||||||
{
|
|
||||||
foreach( TKey item in _keys ) {
|
|
||||||
yield return new KeyValuePair<TKey, TValue>(item, _source[item]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryGetValue( TKey key, out TValue value )
|
|
||||||
{
|
|
||||||
if( _keys.Contains( key ) ) {
|
|
||||||
value = _source[ key ];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
value = default!;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICollection<KeyValuePair<TKey, TValue>>.Add(
|
|
||||||
KeyValuePair<TKey, TValue> item )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICollection<KeyValuePair<TKey, TValue>>.Clear()
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => true;
|
|
||||||
|
|
||||||
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(
|
|
||||||
KeyValuePair<TKey, TValue> item )
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
void IDictionary<TKey, TValue>.Add( TKey key, TValue value )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IDictionary<TKey, TValue>.Remove( TKey key )
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
|
||||||
{
|
|
||||||
return GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="PartialDictionaryValues.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Collections
|
|
||||||
{
|
|
||||||
public partial class PartialDictionary<TKey, TValue>
|
|
||||||
{
|
|
||||||
|
|
||||||
internal sealed class PartialDictionaryValues : ICollection<TValue>
|
|
||||||
{
|
|
||||||
|
|
||||||
private readonly PartialDictionary<TKey, TValue> _values;
|
|
||||||
|
|
||||||
public PartialDictionaryValues(
|
|
||||||
PartialDictionary<TKey, TValue> value )
|
|
||||||
{
|
|
||||||
_values = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsReadOnly => true;
|
|
||||||
|
|
||||||
public int Count => _values.Count;
|
|
||||||
|
|
||||||
void ICollection<TValue>.Add( TValue item )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICollection<TValue>.Clear()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Contains( TValue item )
|
|
||||||
{
|
|
||||||
foreach (var kvp in _values)
|
|
||||||
{
|
|
||||||
if (kvp.Value != null && kvp.Value.Equals(item))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo( TValue[] array, int arrayIndex )
|
|
||||||
{
|
|
||||||
foreach (var kvp in _values)
|
|
||||||
{
|
|
||||||
array[arrayIndex] = kvp.Value;
|
|
||||||
arrayIndex++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerator<TValue> GetEnumerator()
|
|
||||||
{
|
|
||||||
foreach (var key in _values._keys)
|
|
||||||
{
|
|
||||||
yield return _values._source[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ICollection<TValue>.Remove( TValue item )
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
|
||||||
{
|
|
||||||
return GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace StgSgharp.Generator.Expression
|
|
||||||
{
|
|
||||||
[Generator]
|
|
||||||
public class ExpCodeGenerator : ISourceGenerator
|
|
||||||
{
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Initialize(GeneratorInitializationContext context)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="ExpReader.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.MemoryMappedFiles;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSgharp.Generator.Expression
|
|
||||||
{
|
|
||||||
internal class ExpFileReader:IDisposable
|
|
||||||
{
|
|
||||||
private FileStream _expFileStream;
|
|
||||||
private MemoryMappedFile _expMemoryMappedFile;
|
|
||||||
private bool disposedValue;
|
|
||||||
|
|
||||||
public ExpFileReader( string path )
|
|
||||||
{
|
|
||||||
if( !File.Exists( path ) ) {
|
|
||||||
throw new FileNotFoundException();
|
|
||||||
}
|
|
||||||
_expFileStream = new FileStream(
|
|
||||||
path, FileMode.Open, FileAccess.Read );
|
|
||||||
_expMemoryMappedFile = MemoryMappedFile.CreateFromFile(
|
|
||||||
_expFileStream, null, 0, MemoryMappedFileAccess.Read,
|
|
||||||
HandleInheritability.None, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (!disposedValue)
|
|
||||||
{
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
_expFileStream.Dispose();
|
|
||||||
_expMemoryMappedFile.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
disposedValue = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~ExpFileReader()
|
|
||||||
// {
|
|
||||||
// Dispose(disposing: false);
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(disposing: true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MemoryMappedViewStream CreateMemoryStram()
|
|
||||||
{
|
|
||||||
return _expMemoryMappedFile.CreateViewStream();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="ExpReader.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.MemoryMappedFiles;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Expression
|
|
||||||
{
|
|
||||||
internal class ExpFileReader : IDisposable
|
|
||||||
{
|
|
||||||
|
|
||||||
private bool disposedValue;
|
|
||||||
private FileStream _expFileStream;
|
|
||||||
private MemoryMappedFile _expMemoryMappedFile;
|
|
||||||
|
|
||||||
public ExpFileReader( string path )
|
|
||||||
{
|
|
||||||
if( !File.Exists( path ) ) {
|
|
||||||
throw new FileNotFoundException();
|
|
||||||
}
|
|
||||||
_expFileStream = new FileStream(
|
|
||||||
path, FileMode.Open, FileAccess.Read );
|
|
||||||
_expMemoryMappedFile = MemoryMappedFile.CreateFromFile(
|
|
||||||
_expFileStream, null, 0, MemoryMappedFileAccess.Read,
|
|
||||||
HandleInheritability.None, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
public MemoryMappedViewStream CreateMemoryStram()
|
|
||||||
{
|
|
||||||
return _expMemoryMappedFile.CreateViewStream();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~ExpFileReader()
|
|
||||||
// {
|
|
||||||
// Dispose(disposing: false);
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose( disposing: true );
|
|
||||||
GC.SuppressFinalize( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Dispose( bool disposing )
|
|
||||||
{
|
|
||||||
if( !disposedValue ) {
|
|
||||||
if( disposing ) {
|
|
||||||
_expFileStream.Dispose();
|
|
||||||
_expMemoryMappedFile.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
disposedValue = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
//[assembly: InternalsVisibleTo("StgSharp.Generator")]
|
|
||||||
namespace StgSharp.Generator.FakeType
|
|
||||||
{
|
|
||||||
internal class PartialDictionary<TKey,TValue>
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="BpNodeGenerator.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using Microsoft.CodeAnalysis;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
using Microsoft.CodeAnalysis.Text;
|
|
||||||
|
|
||||||
using StgSharp.Blueprint;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Generator
|
|
||||||
{
|
|
||||||
internal class BpNodeSyntaxReceiver : ISyntaxReceiver
|
|
||||||
{
|
|
||||||
private static readonly string _indexTypeName = typeof( PartialDictionary<string, object> ).Name;
|
|
||||||
private static BpNodeSyntaxReceiver receiver = new BpNodeSyntaxReceiver();
|
|
||||||
|
|
||||||
public List<MethodDeclarationSyntax> ValidMethod { get; private set; } = new List<MethodDeclarationSyntax>();
|
|
||||||
public List<MethodDeclarationSyntax> InvalidMethod { get; private set; } = new List<MethodDeclarationSyntax>();
|
|
||||||
|
|
||||||
public BpNodeSyntaxReceiver()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public BpNodeSyntaxReceiver(SyntaxNode node)
|
|
||||||
{
|
|
||||||
OnVisitSyntaxNode(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnVisitSyntaxNode( SyntaxNode syntaxNode )
|
|
||||||
{
|
|
||||||
if( syntaxNode is MethodDeclarationSyntax mds && mds.AttributeLists
|
|
||||||
.SelectMany( list => list.Attributes )
|
|
||||||
.Any( syntax => syntax.Name.ToString() ==
|
|
||||||
typeof( BlueprintNodeExecutionAttribute ).Name ) ) {
|
|
||||||
SeparatedSyntaxList<ParameterSyntax> paramList = mds.ParameterList.Parameters;
|
|
||||||
if( mds.Modifiers.Any( SyntaxKind.StaticKeyword ) && paramList.Count ==
|
|
||||||
2 && paramList[ 0 ].Type!.ToString() == _indexTypeName && paramList[
|
|
||||||
1 ].Type!.ToString() ==
|
|
||||||
_indexTypeName ) {
|
|
||||||
ValidMethod.Add(mds);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
InvalidMethod.Add(mds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void BuildNode(SourceProductionContext context, MethodDeclarationSyntax mds)
|
|
||||||
{
|
|
||||||
if (mds.AttributeLists
|
|
||||||
.SelectMany(list => list.Attributes)
|
|
||||||
.Any(syntax => syntax.Name.ToString() ==
|
|
||||||
typeof(BlueprintNodeExecutionAttribute).Name))
|
|
||||||
{
|
|
||||||
SeparatedSyntaxList<ParameterSyntax> paramList = mds.ParameterList.Parameters;
|
|
||||||
if (mds.Modifiers.Any(SyntaxKind.StaticKeyword) && paramList.Count ==
|
|
||||||
2 && paramList[0].Type!.ToString() == _indexTypeName && paramList[
|
|
||||||
1].Type!.ToString() ==
|
|
||||||
_indexTypeName)
|
|
||||||
{
|
|
||||||
var methodName = mds.Identifier.Text;
|
|
||||||
var sourceText = SourceText.From( """
|
|
||||||
|
|
||||||
""",encoding:Encoding.UTF8);
|
|
||||||
context.AddSource("GeneratedBlueprintNode.cs", sourceText);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var diagnostic = Diagnostic.Create(
|
|
||||||
new DiagnosticDescriptor(
|
|
||||||
id:"SSE0001",
|
|
||||||
title: "Invalid Blueprint Node Method",
|
|
||||||
messageFormat: "Blueprint Node Method must be static and have two parameters of type PartialDictionary<string, object>",
|
|
||||||
category: "Blueprint Node",
|
|
||||||
DiagnosticSeverity.Error,
|
|
||||||
isEnabledByDefault: true),
|
|
||||||
mds.GetLocation(),mds.Identifier.Text);
|
|
||||||
|
|
||||||
context.ReportDiagnostic(diagnostic);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="ExpCodeGenerator.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using Microsoft.CodeAnalysis;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace StgSharp.Generator
|
|
||||||
{
|
|
||||||
[Generator]
|
|
||||||
public partial class MainGenerator : IIncrementalGenerator
|
|
||||||
{
|
|
||||||
public void Initialize(IncrementalGeneratorInitializationContext context)
|
|
||||||
{
|
|
||||||
var declaration =
|
|
||||||
context.SyntaxProvider.CreateSyntaxProvider(
|
|
||||||
predicate: static (s,_) => s is MethodDeclarationSyntax,
|
|
||||||
transform: static (cds,_) => (MethodDeclarationSyntax)cds.Node
|
|
||||||
).Where(static m=>m!=null);
|
|
||||||
|
|
||||||
context.RegisterSourceOutput(declaration, BpNodeSyntaxReceiver.BuildNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<LangVersion>preview</LangVersion>
|
|
||||||
<EnforceExtendedAnalyzerRules>True</EnforceExtendedAnalyzerRules>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<LangVersion>preview</LangVersion>
|
|
||||||
<EnforceExtendedAnalyzerRules>True</EnforceExtendedAnalyzerRules>
|
|
||||||
<Platforms>AnyCPU;x64</Platforms>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" PrivateAssets="all" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeTarget": {
|
|
||||||
"name": ".NETCoreApp,Version=v8.0",
|
|
||||||
"signature": ""
|
|
||||||
},
|
|
||||||
"compilationOptions": {},
|
|
||||||
"targets": {
|
|
||||||
".NETCoreApp,Version=v8.0": {
|
|
||||||
"StgSharp.Generator/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.CSharp": "4.12.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"StgSharp.Generator.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.CodeAnalysis.Analyzers/3.3.4": {},
|
|
||||||
"Microsoft.CodeAnalysis.Common/4.12.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
|
||||||
"System.Collections.Immutable": "8.0.0",
|
|
||||||
"System.Reflection.Metadata": "8.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.CodeAnalysis.dll": {
|
|
||||||
"assemblyVersion": "4.12.0.0",
|
|
||||||
"fileVersion": "4.1200.24.57207"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
"lib/net8.0/cs/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "cs"
|
|
||||||
},
|
|
||||||
"lib/net8.0/de/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "de"
|
|
||||||
},
|
|
||||||
"lib/net8.0/es/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "es"
|
|
||||||
},
|
|
||||||
"lib/net8.0/fr/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "fr"
|
|
||||||
},
|
|
||||||
"lib/net8.0/it/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "it"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ja/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "ja"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ko/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "ko"
|
|
||||||
},
|
|
||||||
"lib/net8.0/pl/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "pl"
|
|
||||||
},
|
|
||||||
"lib/net8.0/pt-BR/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "pt-BR"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ru/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "ru"
|
|
||||||
},
|
|
||||||
"lib/net8.0/tr/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "tr"
|
|
||||||
},
|
|
||||||
"lib/net8.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "zh-Hans"
|
|
||||||
},
|
|
||||||
"lib/net8.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll": {
|
|
||||||
"locale": "zh-Hant"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.CodeAnalysis.CSharp/4.12.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
|
||||||
"Microsoft.CodeAnalysis.Common": "4.12.0",
|
|
||||||
"System.Collections.Immutable": "8.0.0",
|
|
||||||
"System.Reflection.Metadata": "8.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.CodeAnalysis.CSharp.dll": {
|
|
||||||
"assemblyVersion": "4.12.0.0",
|
|
||||||
"fileVersion": "4.1200.24.57207"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
"lib/net8.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "cs"
|
|
||||||
},
|
|
||||||
"lib/net8.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "de"
|
|
||||||
},
|
|
||||||
"lib/net8.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "es"
|
|
||||||
},
|
|
||||||
"lib/net8.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "fr"
|
|
||||||
},
|
|
||||||
"lib/net8.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "it"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "ja"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "ko"
|
|
||||||
},
|
|
||||||
"lib/net8.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "pl"
|
|
||||||
},
|
|
||||||
"lib/net8.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "pt-BR"
|
|
||||||
},
|
|
||||||
"lib/net8.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "ru"
|
|
||||||
},
|
|
||||||
"lib/net8.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "tr"
|
|
||||||
},
|
|
||||||
"lib/net8.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "zh-Hans"
|
|
||||||
},
|
|
||||||
"lib/net8.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
|
||||||
"locale": "zh-Hant"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/8.0.0": {},
|
|
||||||
"System.Reflection.Metadata/8.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.Collections.Immutable": "8.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"StgSharp.Generator/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
},
|
|
||||||
"Microsoft.CodeAnalysis.Analyzers/3.3.4": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==",
|
|
||||||
"path": "microsoft.codeanalysis.analyzers/3.3.4",
|
|
||||||
"hashPath": "microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.CodeAnalysis.Common/4.12.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-c1kNYihL2gdcuU1dqm8R8YeA4YkB43TpU3pa2r66Uooh6AAhRtENzj9A4Kj0a+H8JDDyuTjNZql9XlVUzV+UjA==",
|
|
||||||
"path": "microsoft.codeanalysis.common/4.12.0",
|
|
||||||
"hashPath": "microsoft.codeanalysis.common.4.12.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.CodeAnalysis.CSharp/4.12.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-30vVQ1MizeC22iEdEvI2w0eTIYG43/L20yBzuQH01xKzJgHAoWehzI2F8u07o4mXh4DGMOjQF7aEm0zzvsG3Mg==",
|
|
||||||
"path": "microsoft.codeanalysis.csharp/4.12.0",
|
|
||||||
"hashPath": "microsoft.codeanalysis.csharp.4.12.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Collections.Immutable/8.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==",
|
|
||||||
"path": "system.collections.immutable/8.0.0",
|
|
||||||
"hashPath": "system.collections.immutable.8.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Reflection.Metadata/8.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
|
|
||||||
"path": "system.reflection.metadata/8.0.0",
|
|
||||||
"hashPath": "system.reflection.metadata.8.0.0.nupkg.sha512"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,5 +0,0 @@
|
|||||||
global using StgSharp.Generator.FakeType;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ccef0de6f686f94da655b0e7d854d0acaf907d04")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// 由 MSBuild WriteCodeFragment 类生成。
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
ca176cd5c61d2dc85f29a7103c4d4591277128a58e3ae9a0f9404b3db20450b2
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net8.0
|
|
||||||
build_property.TargetFramework = net8.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = StgSharp.Generator
|
|
||||||
build_property.ProjectDir = D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
-4
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// 此代码由工具生成。
|
|
||||||
// 运行时版本:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
|
||||||
// 重新生成代码,这些更改将会丢失。
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e687473132786f419a48170313782d6779890c3d")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// 由 MSBuild WriteCodeFragment 类生成。
|
|
||||||
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
507d0d80fe4bf532ef6f4152e1c0274456709eeaf88b7cd0eff97aa75d6b6d89
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = netstandard2.0
|
|
||||||
build_property.TargetPlatformMinVersion = 7.0
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = StgSharp.Generator
|
|
||||||
build_property.ProjectDir = D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
-4
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// 此代码由工具生成。
|
|
||||||
// 运行时版本:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
|
||||||
// 重新生成代码,这些更改将会丢失。
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e687473132786f419a48170313782d6779890c3d")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// 由 MSBuild WriteCodeFragment 类生成。
|
|
||||||
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
59be71384a64c08c0d97414b957b3c19dad4e0c90fb7132416c556cc8ca21e76
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = netstandard2.0
|
|
||||||
build_property.TargetPlatformMinVersion = 7.0
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = StgSharp.Generator
|
|
||||||
build_property.ProjectDir = D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
@@ -1,81 +0,0 @@
|
|||||||
{
|
|
||||||
"format": 1,
|
|
||||||
"restore": {
|
|
||||||
"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\StgSharp.Generator.csproj": {}
|
|
||||||
},
|
|
||||||
"projects": {
|
|
||||||
"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\StgSharp.Generator.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\StgSharp.Generator.csproj",
|
|
||||||
"projectName": "StgSharp.Generator",
|
|
||||||
"projectPath": "D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\StgSharp.Generator.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\Youmu\\.nuget\\packages\\",
|
|
||||||
"outputPath": "D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\Youmu\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net8.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
|
||||||
"D:\\Programmer\\NugetLocal": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"projectReferences": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"restoreAuditProperties": {
|
|
||||||
"enableAudit": "true",
|
|
||||||
"auditLevel": "low",
|
|
||||||
"auditMode": "direct"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.CSharp": {
|
|
||||||
"suppressParent": "All",
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[4.12.0, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.400/PortableRuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Youmu\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.0</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\Youmu\.nuget\packages\" />
|
|
||||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.codeanalysis.analyzers\3.3.4\buildTransitive\Microsoft.CodeAnalysis.Analyzers.props" Condition="Exists('$(NuGetPackageRoot)microsoft.codeanalysis.analyzers\3.3.4\buildTransitive\Microsoft.CodeAnalysis.Analyzers.props')" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<PkgMicrosoft_CodeAnalysis_Analyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' ">C:\Users\Youmu\.nuget\packages\microsoft.codeanalysis.analyzers\3.3.4</PkgMicrosoft_CodeAnalysis_Analyzers>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.codeanalysis.analyzers\3.3.4\buildTransitive\Microsoft.CodeAnalysis.Analyzers.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.codeanalysis.analyzers\3.3.4\buildTransitive\Microsoft.CodeAnalysis.Analyzers.targets')" />
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 2,
|
|
||||||
"dgSpecHash": "M4+jwtEt0Jc=",
|
|
||||||
"success": true,
|
|
||||||
"projectFilePath": "D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\StgSgharp.Generator\\StgSharp.Generator.csproj",
|
|
||||||
"expectedPackageFiles": [
|
|
||||||
"C:\\Users\\Youmu\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.3.4\\microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512",
|
|
||||||
"C:\\Users\\Youmu\\.nuget\\packages\\microsoft.codeanalysis.common\\4.12.0\\microsoft.codeanalysis.common.4.12.0.nupkg.sha512",
|
|
||||||
"C:\\Users\\Youmu\\.nuget\\packages\\microsoft.codeanalysis.csharp\\4.12.0\\microsoft.codeanalysis.csharp.4.12.0.nupkg.sha512",
|
|
||||||
"C:\\Users\\Youmu\\.nuget\\packages\\system.collections.immutable\\8.0.0\\system.collections.immutable.8.0.0.nupkg.sha512",
|
|
||||||
"C:\\Users\\Youmu\\.nuget\\packages\\system.reflection.metadata\\8.0.0\\system.reflection.metadata.8.0.0.nupkg.sha512"
|
|
||||||
],
|
|
||||||
"logs": []
|
|
||||||
}
|
|
||||||
-4
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// 此代码由工具生成。
|
|
||||||
// 运行时版本:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
|
||||||
// 重新生成代码,这些更改将会丢失。
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ccef0de6f686f94da655b0e7d854d0acaf907d04")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// 由 MSBuild WriteCodeFragment 类生成。
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
ca176cd5c61d2dc85f29a7103c4d4591277128a58e3ae9a0f9404b3db20450b2
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net8.0
|
|
||||||
build_property.TargetFramework = net8.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = StgSharp.Generator
|
|
||||||
build_property.ProjectDir = D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
-1
@@ -1 +0,0 @@
|
|||||||
afa1b1a9352ed44b12e962cfd8520ff4e6ef5d54d99232294685245ea111c904
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\bin\x64\Debug\net8.0\StgSharp.Generator.deps.json
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\bin\x64\Debug\net8.0\StgSharp.Generator.dll
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\bin\x64\Debug\net8.0\StgSharp.Generator.pdb
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.csproj.AssemblyReference.cache
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.AssemblyInfoInputs.cache
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.AssemblyInfo.cs
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.csproj.CoreCompileInputs.cache
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.sourcelink.json
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.dll
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\refint\StgSharp.Generator.dll
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\StgSharp.Generator.pdb
|
|
||||||
D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\obj\x64\Debug\net8.0\ref\StgSharp.Generator.dll
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/ae94c265ae77870ea6498b624b6f71b78fb94e51/*"}}
|
|
||||||
Binary file not shown.
Binary file not shown.
-4
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
|
|
||||||
Binary file not shown.
-4
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// 此代码由工具生成。
|
|
||||||
// 运行时版本:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
|
||||||
// 重新生成代码,这些更改将会丢失。
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e687473132786f419a48170313782d6779890c3d")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Generator")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// 由 MSBuild WriteCodeFragment 类生成。
|
|
||||||
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
59be71384a64c08c0d97414b957b3c19dad4e0c90fb7132416c556cc8ca21e76
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = netstandard2.0
|
|
||||||
build_property.TargetPlatformMinVersion = 7.0
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules = True
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = StgSharp.Generator
|
|
||||||
build_property.ProjectDir = D:\NitloadIndustry\研究项目\1-Flagship\TH2020\ProjectFile\内核源代码\StgSgharp.Generator\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
@@ -1,33 +1,33 @@
|
|||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// file="GlobalSetting.cs"
|
// file="GlobalSetting.cs"
|
||||||
// Project: World
|
// Project: StgSharp
|
||||||
// AuthorGroup: Nitload Space
|
// AuthorGroup: Nitload Space
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
// Copyright (c) Nitload Space. All rights reserved.
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person
|
// Permission is hereby granted, free of charge, to any person
|
||||||
// obtaining a copy of this software and associated documentation
|
// obtaining a copy of this software and associated documentation
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
// files (the “Software”), to deal in the Software without restriction,
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
// including without limitation the rights to use, copy, modify, merge,
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
// publish, distribute, sublicense, and/or sell copies of the Software,
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
// and to permit persons to whom the Software is furnished to do so,
|
||||||
// subject to the following conditions:
|
// subject to the following conditions:
|
||||||
//
|
//
|
||||||
// The above copyright notice and
|
// The above copyright notice and
|
||||||
// this permission notice shall be included in all copies
|
// this permission notice shall be included in all copies
|
||||||
// or substantial portions of the Software.
|
// or substantial portions of the Software.
|
||||||
//
|
//
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
// THE SOFTWARE IS PROVIDED “AS IS”,
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -44,7 +44,7 @@ namespace StgSharp
|
|||||||
|
|
||||||
internal const int ssdSegmentLength = 16;
|
internal const int ssdSegmentLength = 16;
|
||||||
|
|
||||||
private static byte[] _currentHash;
|
private static byte[] _currentHash = [];
|
||||||
|
|
||||||
private static bool _inited;
|
private static bool _inited;
|
||||||
private static int _mainThreadID = -1;
|
private static int _mainThreadID = -1;
|
||||||
@@ -53,12 +53,14 @@ namespace StgSharp
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if( _currentHash == null ) {
|
if (_currentHash == null)
|
||||||
|
{
|
||||||
string route = Assembly.GetExecutingAssembly().Location;
|
string route = Assembly.GetExecutingAssembly().Location;
|
||||||
string time = DateTime.UtcNow.ToString();
|
string time = DateTime.UtcNow.ToString();
|
||||||
using( SHA256 sh = SHA256.Create() ) {
|
using (SHA256 sh = SHA256.Create())
|
||||||
byte[] bytes = Encoding.UTF8.GetBytes( route );
|
{
|
||||||
_currentHash = sh.ComputeHash( bytes );
|
byte[] bytes = Encoding.UTF8.GetBytes(route);
|
||||||
|
_currentHash = sh.ComputeHash(bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _currentHash;
|
return _currentHash;
|
||||||
@@ -67,24 +69,26 @@ namespace StgSharp
|
|||||||
|
|
||||||
public static int MainThreadID
|
public static int MainThreadID
|
||||||
{
|
{
|
||||||
get => ( _mainThreadID == -1 ) ?
|
get => (_mainThreadID == -1) ?
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
"StgSharp environment is not inited. " + "Main thread id is not available" ) : _mainThreadID;
|
"StgSharp environment is not inited. Main thread id is not available") :
|
||||||
|
_mainThreadID;
|
||||||
|
internal set => _mainThreadID = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// CustomizeInit an instance of OpenGL program, This method should be called before any
|
/// CustomizeInit an instance of OpenGL program, This method should be called before any
|
||||||
/// other World api.
|
/// other World api.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void InitGL( int majorVersion, int minorVersion )
|
public static void InitGL(int majorVersion, int minorVersion)
|
||||||
{
|
{
|
||||||
if( API == default ) {
|
if (API == default) {
|
||||||
API = GraphicAPI.GL;
|
API = GraphicAPI.GL;
|
||||||
}
|
}
|
||||||
if( API != GraphicAPI.GL ) {
|
if (API != GraphicAPI.GL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
InternalIO.InternalInitGL( majorVersion, minorVersion );
|
InternalIO.InternalInitGL(majorVersion, minorVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GlobalSetting
|
public static class GlobalSetting
|
||||||
@@ -97,7 +101,7 @@ namespace StgSharp
|
|||||||
get => vsyncActivated;
|
get => vsyncActivated;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
InternalIO.glfwSwapInterval( value ? 1 : 0 );
|
InternalIO.glfwSwapInterval(value ? 1 : 0);
|
||||||
vsyncActivated = value;
|
vsyncActivated = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// file="Monitors.cs"
|
// file="Monitors.cs"
|
||||||
// Project: StgSharp
|
// Project: StgSharp
|
||||||
// AuthorGroup: Nitload Space
|
// AuthorGroup: Nitload Space
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
// Copyright (c) Nitload Space. All rights reserved.
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person
|
// Permission is hereby granted, free of charge, to any person
|
||||||
// obtaining a copy of this software and associated documentation
|
// obtaining a copy of this software and associated documentation
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
// files (the “Software”), to deal in the Software without restriction,
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
// including without limitation the rights to use, copy, modify, merge,
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
// publish, distribute, sublicense, and/or sell copies of the Software,
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
// and to permit persons to whom the Software is furnished to do so,
|
||||||
// subject to the following conditions:
|
// subject to the following conditions:
|
||||||
//
|
//
|
||||||
// The above copyright notice and
|
// The above copyright notice and
|
||||||
// this permission notice shall be included in all copies
|
// this permission notice shall be included in all copies
|
||||||
// or substantial portions of the Software.
|
// or substantial portions of the Software.
|
||||||
//
|
//
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
// THE SOFTWARE IS PROVIDED “AS IS”,
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
using StgSharp.Graphics;
|
using StgSharp.Graphics;
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@@ -42,28 +42,25 @@ namespace StgSharp
|
|||||||
public static partial class World
|
public static partial class World
|
||||||
{
|
{
|
||||||
|
|
||||||
private static unsafe IntPtr[] monitorsArray;
|
private static unsafe IntPtr[] monitorsArray = [];
|
||||||
|
|
||||||
public static unsafe IntPtr[] MonitorsHandleArray
|
public static unsafe IntPtr[] MonitorsHandleArray
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if( monitorsArray == null )
|
if (monitorsArray == null)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
IntPtr* arrayhandle = InternalIO.glfwGetMonitors( &count );
|
IntPtr* arrayhandle = InternalIO.glfwGetMonitors(&count);
|
||||||
monitorsArray = new IntPtr[count];
|
monitorsArray = new IntPtr[count];
|
||||||
Marshal.Copy( ( IntPtr )arrayhandle, monitorsArray, 0, count );
|
Marshal.Copy((IntPtr)arrayhandle, monitorsArray, 0, count);
|
||||||
Marshal.FreeHGlobal( ( IntPtr )arrayhandle );
|
Marshal.FreeHGlobal((IntPtr)arrayhandle);
|
||||||
}
|
}
|
||||||
return monitorsArray;
|
return monitorsArray;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IntPtr DefaultMonitor
|
public static IntPtr DefaultMonitor => MonitorsHandleArray[0];
|
||||||
{
|
|
||||||
get { return MonitorsHandleArray[ 0 ]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ namespace StgSharp
|
|||||||
InternalIO.InternalAppendLog("\n\n\n");
|
InternalIO.InternalAppendLog("\n\n\n");
|
||||||
InternalIO.InternalWriteLog(
|
InternalIO.InternalWriteLog(
|
||||||
$"Program {Assembly.GetEntryAssembly()!.FullName} on {Environment.MachineName} Started.", LogType.Info);
|
$"Program {Assembly.GetEntryAssembly()!.FullName} on {Environment.MachineName} Started.", LogType.Info);
|
||||||
_mainThreadID = Environment.CurrentManagedThreadId;
|
MainThreadID = Environment.CurrentManagedThreadId;
|
||||||
|
|
||||||
|
|
||||||
Dialogue.LoadDialogue();
|
Dialogue.LoadDialogue();
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ using StgSharp.HighPerformance;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -43,7 +45,9 @@ namespace StgSharp.HighPerformance
|
|||||||
public unsafe struct MatrixKernel
|
public unsafe struct MatrixKernel
|
||||||
{
|
{
|
||||||
|
|
||||||
[FieldOffset(0)] internal fixed float Buffer[16];
|
[FieldOffset(0)] internal fixed byte Buffer[64];
|
||||||
|
[FieldOffset(0)] internal fixed double FP64Buffer[8];
|
||||||
|
[FieldOffset(0)] internal fixed float FP32Buffer[16];
|
||||||
[FieldOffset(0)] public M128 XMM0;
|
[FieldOffset(0)] public M128 XMM0;
|
||||||
[FieldOffset(16)] public M128 XMM1;
|
[FieldOffset(16)] public M128 XMM1;
|
||||||
[FieldOffset(32)] public M128 XMM2;
|
[FieldOffset(32)] public M128 XMM2;
|
||||||
@@ -52,5 +56,17 @@ namespace StgSharp.HighPerformance
|
|||||||
[FieldOffset(32)] public M256 YMM1;
|
[FieldOffset(32)] public M256 YMM1;
|
||||||
[FieldOffset(64)] public M512 ZMM0;
|
[FieldOffset(64)] public M512 ZMM0;
|
||||||
|
|
||||||
|
public MatrixKernel()
|
||||||
|
{
|
||||||
|
Unsafe.SkipInit(out this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ref T UnsafeIndex<T>(int column, int row) where T: unmanaged, INumber<T>
|
||||||
|
{
|
||||||
|
ref M128 col = ref Unsafe.As<byte, M128>(ref Buffer[0]);
|
||||||
|
col = ref Unsafe.Add(ref col, column);
|
||||||
|
return ref col.Member<T>(row);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,8 +87,10 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
public void Push(T item)
|
public void Push(T item)
|
||||||
{
|
{
|
||||||
Header* header = (Header*)_buffer;
|
Header* header = (Header*)_buffer;
|
||||||
if (header->Top >= header->Capacity) {
|
if (header->Top >= header->Capacity)
|
||||||
|
{
|
||||||
Expand();
|
Expand();
|
||||||
|
header = (Header*)_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
T* dataStart = (T*)(_buffer + sizeof(Header));
|
T* dataStart = (T*)(_buffer + sizeof(Header));
|
||||||
|
|||||||
@@ -48,8 +48,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
public unsafe partial class HybridLayerSegregatedFitAllocator
|
public unsafe partial class HybridLayerSegregatedFitAllocator
|
||||||
{
|
{
|
||||||
|
|
||||||
private BufferExpansionLock _spareLock = new();
|
|
||||||
|
|
||||||
public hlsfHandle Alloc(uint size)
|
public hlsfHandle Alloc(uint size)
|
||||||
{
|
{
|
||||||
ArgumentOutOfRangeException.ThrowIfGreaterThan<nuint>(size, (nuint)levelSizeArray[^1] * 2);
|
ArgumentOutOfRangeException.ThrowIfGreaterThan<nuint>(size, (nuint)levelSizeArray[^1] * 2);
|
||||||
@@ -57,13 +55,7 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
int segmentIndex = DetermineSegmentIndex(size, level);
|
int segmentIndex = DetermineSegmentIndex(size, level);
|
||||||
|
|
||||||
int i = level, s = segmentIndex;
|
int i = level, s = segmentIndex;
|
||||||
if (TryPopLevelForAllocation(i, s, out Entry* handle)) {
|
Entry* handle;
|
||||||
return new hlsfHandle(handle, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
fallback:
|
|
||||||
i = level;
|
|
||||||
s = segmentIndex;
|
|
||||||
while (!TryPopLevelForAllocation(i, s, out handle))
|
while (!TryPopLevelForAllocation(i, s, out handle))
|
||||||
{
|
{
|
||||||
if (++s >= 3)
|
if (++s >= 3)
|
||||||
@@ -73,25 +65,19 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
}
|
}
|
||||||
if (i >= levelSizeArray.Length)
|
if (i >= levelSizeArray.Length)
|
||||||
{
|
{
|
||||||
if (!TryAllocateNew16MBBlock(out handle)) {
|
if (TryAllocateNew16MBBlock(out handle))
|
||||||
throw new OverflowException("Out of memory: Unable to allocate new 16MB block or find suitable bucket for allocation.");
|
{
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
throw new OverflowException("Out of memory: Unable to allocate new 16MB block or find suitable bucket for allocation.");
|
||||||
Thread.Sleep(0);
|
|
||||||
goto fallback;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handle != null) {
|
if (handle != null) {
|
||||||
SliceMemory(handle, (segmentIndex + 1) * levelSizeArray[level]);
|
SliceMemory(handle, (segmentIndex + 1) * levelSizeArray[level]);
|
||||||
}
|
}
|
||||||
|
handle->State = EntryState.Allocated;
|
||||||
return new hlsfHandle(handle, size);
|
return new hlsfHandle(handle, size);
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseEntryNextLock(handle);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SliceMemory(Entry* e, int offset)
|
private void SliceMemory(Entry* e, int offset)
|
||||||
@@ -102,12 +88,10 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
|
|
||||||
ulong originOffset = e->Position - (ulong)m_Buffer;
|
ulong originOffset = e->Position - (ulong)m_Buffer;
|
||||||
ulong finalOffset = originOffset + (ulong)offset;
|
ulong finalOffset = originOffset + (ulong)offset;
|
||||||
|
ulong end = e->Position + e->Size;
|
||||||
int remainSize = (int)(e->Size - offset);
|
int remainSize = (int)(e->Size - offset);
|
||||||
|
|
||||||
AcquireEntryNextLock(e);
|
int minLevel = int.Max((BitOperations.TrailingZeroCount(finalOffset) - 6) / 2, 0);
|
||||||
AcquireEntryPrevLock(next);
|
|
||||||
|
|
||||||
int minLevel = Math.Max((BitOperations.TrailingZeroCount(finalOffset) - 6) / 2, 0);
|
|
||||||
int i = minLevel >= levelSizeArray.Length ? levelSizeArray.Length - 1 : minLevel;
|
int i = minLevel >= levelSizeArray.Length ? levelSizeArray.Length - 1 : minLevel;
|
||||||
|
|
||||||
for (; i < levelSizeArray.Length; i++)
|
for (; i < levelSizeArray.Length; i++)
|
||||||
@@ -117,13 +101,9 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
int blockCount = (int)((ulong.Min(board, end) - board) / (ulong)levelSize);
|
int blockCount = (int)((ulong.Min(board, end) - board) / (ulong)levelSize);
|
||||||
if (blockCount == 0)
|
if (blockCount == 0)
|
||||||
{
|
{
|
||||||
int levelSize = levelSizeArray[i];
|
break;
|
||||||
int blockCount = remainSize / levelSize % 4;
|
}
|
||||||
if (blockCount == 0)
|
int s = blockCount * levelSize;
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int s = blockCount * levelSize;
|
|
||||||
|
|
||||||
// create and init new entry
|
// create and init new entry
|
||||||
Entry* newEntry = (Entry*)_entries.Allocate();
|
Entry* newEntry = (Entry*)_entries.Allocate();
|
||||||
@@ -132,25 +112,23 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
BucketNode* bucket = (BucketNode*)newEntry->Position;
|
BucketNode* bucket = (BucketNode*)newEntry->Position;
|
||||||
bucket->EntryRef = newEntry;
|
bucket->EntryRef = newEntry;
|
||||||
|
|
||||||
// link new entry
|
// link new entry
|
||||||
newEntry->PreviousNear = (ulong)current;
|
newEntry->PreviousNear = (ulong)current;
|
||||||
newEntry->NextNear = n;
|
newEntry->NextNear = n;
|
||||||
current->NextNear = (ulong)newEntry;
|
current->NextNear = (ulong)newEntry;
|
||||||
next->PreviousNear = (ulong)newEntry;
|
next->PreviousNear = (ulong)newEntry;
|
||||||
|
|
||||||
newEntry->Level = i;
|
newEntry->Level = i;
|
||||||
PushLevel(i, blockCount - 1, bucket);
|
PushLevel(i, blockCount - 1, bucket);
|
||||||
|
|
||||||
// set new entry
|
// set new entry
|
||||||
Entry* old = current;
|
Entry* old = current;
|
||||||
current = newEntry;
|
current = newEntry;
|
||||||
|
|
||||||
|
// update lock and data
|
||||||
|
finalOffset += (ulong)s;
|
||||||
|
remainSize -= s;
|
||||||
|
|
||||||
// update lock and data
|
|
||||||
finalOffset += (ulong)s;
|
|
||||||
remainSize -= s;
|
|
||||||
ReleaseEntryNextLock(old);
|
|
||||||
AcquireEntryNextLock(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
newEntry->Level = i;
|
newEntry->Level = i;
|
||||||
PushLevel(i, blockCount - 1, bucket);
|
PushLevel(i, blockCount - 1, bucket);
|
||||||
@@ -193,6 +171,18 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
next->PreviousNear = (ulong)newEntry;
|
next->PreviousNear = (ulong)newEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newEntry->Level = i;
|
||||||
|
PushLevel(i, blockCount - 1, bucket);
|
||||||
|
|
||||||
|
// set new entry
|
||||||
|
Entry* old = current;
|
||||||
|
current = newEntry;
|
||||||
|
|
||||||
|
// update lock and data
|
||||||
|
finalOffset += (ulong)s;
|
||||||
|
remainSize -= s;
|
||||||
|
|
||||||
|
|
||||||
newEntry->Level = i;
|
newEntry->Level = i;
|
||||||
PushLevel(i, blockCount - 1, bucket);
|
PushLevel(i, blockCount - 1, bucket);
|
||||||
|
|
||||||
@@ -202,65 +192,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
// update data
|
// update data
|
||||||
finalOffset += (ulong)s;
|
finalOffset += (ulong)s;
|
||||||
remainSize -= s;
|
remainSize -= s;
|
||||||
if (remainSize <= 0)
|
|
||||||
{
|
|
||||||
ReleaseEntryNextLock(current);
|
|
||||||
ReleaseEntryPrevLock(next);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (; i >= 0; i--)
|
|
||||||
{
|
|
||||||
int levelSize = levelSizeArray[i];
|
|
||||||
int blockCount = remainSize / levelSize % 4;
|
|
||||||
if (blockCount == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int s = blockCount * levelSize;
|
|
||||||
|
|
||||||
// create and init new entry
|
|
||||||
Entry* newEntry = (Entry*)_entries.Allocate();
|
|
||||||
newEntry->LockBuffer = 0;
|
|
||||||
newEntry->Position = (nuint)((ulong)m_Buffer + finalOffset);
|
|
||||||
newEntry->Size = (uint)s;
|
|
||||||
BucketNode* bucket = (BucketNode*)newEntry->Position;
|
|
||||||
bucket->EntryRef = newEntry;
|
|
||||||
bucket->LockBuffer = 0;
|
|
||||||
newEntry->State = EntryState.ThreadOccupied;
|
|
||||||
|
|
||||||
// link new entry
|
|
||||||
newEntry->PreviousNear = (ulong)current;
|
|
||||||
current->NextNear = (ulong)newEntry;
|
|
||||||
newEntry->NextNear = n;
|
|
||||||
next->PreviousNear = (ulong)newEntry;
|
|
||||||
|
|
||||||
newEntry->Level = i;
|
|
||||||
PushLevel(i, blockCount - 1, bucket);
|
|
||||||
|
|
||||||
// set new entry
|
|
||||||
Entry* old = current;
|
|
||||||
current = newEntry;
|
|
||||||
|
|
||||||
// update lock and data
|
|
||||||
finalOffset += (ulong)s;
|
|
||||||
remainSize -= s;
|
|
||||||
ReleaseEntryNextLock(old);
|
|
||||||
AcquireEntryNextLock(current);
|
|
||||||
if (remainSize <= 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Release locks in reverse order
|
|
||||||
ReleaseEntryNextLock(current);
|
|
||||||
ReleaseEntryPrevLock(next);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,22 +206,14 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
private bool TryAllocateNew16MBBlock(out Entry* handle)
|
private bool TryAllocateNew16MBBlock(out Entry* handle)
|
||||||
{
|
{
|
||||||
nuint pos = Volatile.Read(ref _spareMemory->Position);
|
nuint pos = _spareMemory->Position;
|
||||||
nuint blockSize = (nuint)levelSizeArray[^1] * 2; // Use last level size (16MB)
|
nuint blockSize = (nuint)levelSizeArray[^1] * 2; // Use last level size (16MB)
|
||||||
nuint newPos = pos + blockSize;
|
nuint newPos = pos + blockSize;
|
||||||
|
|
||||||
ulong p;
|
ulong p;
|
||||||
Entry* previous;
|
Entry* previous;
|
||||||
do
|
p = _spareMemory->PreviousNear;
|
||||||
{
|
previous = (Entry*)p;
|
||||||
p = Volatile.Read(ref _spareMemory->PreviousNear);
|
|
||||||
previous = (Entry*)p;
|
|
||||||
if (previous != null) {
|
|
||||||
AcquireEntryNextLock(previous);
|
|
||||||
}
|
|
||||||
AcquireEntryPrevLock(_spareMemory);
|
|
||||||
break;
|
|
||||||
} while (true);
|
|
||||||
if (_spareMemory->Size <= 0)
|
if (_spareMemory->Size <= 0)
|
||||||
{
|
{
|
||||||
handle = null;
|
handle = null;
|
||||||
@@ -310,34 +233,21 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
handle->Size = (uint)blockSize;
|
handle->Size = (uint)blockSize;
|
||||||
handle->Level = GetLevelFromSize((uint)blockSize);
|
handle->Level = GetLevelFromSize((uint)blockSize);
|
||||||
|
|
||||||
handle->PrevLock = 0;
|
// Update spare memory position
|
||||||
handle->NextLock = 0;
|
_spareMemory->Position = newPos; // Replace Volatile.Write with direct access
|
||||||
|
BucketNode* b = (BucketNode*)handle->Position;
|
||||||
|
b->EntryRef = handle;
|
||||||
|
PushLevel(handle->Level, DetermineSegmentIndex((uint)blockSize, handle->Level), b);
|
||||||
|
|
||||||
// Update spare memory position
|
// update position linked list
|
||||||
_spareMemory->Position = newPos;
|
handle->NextNear = (ulong)_spareMemory;
|
||||||
BucketNode* b = (BucketNode*)handle->Position;
|
handle->PreviousNear = p;
|
||||||
b->EntryRef = handle;
|
_spareMemory->PreviousNear = (ulong)handle; // Replace Volatile.Write with direct access
|
||||||
PushLevel(handle->Level, DetermineSegmentIndex((uint)blockSize, handle->Level), b);
|
if (previous != null) {
|
||||||
|
previous->NextNear = (ulong)handle;
|
||||||
|
}
|
||||||
|
|
||||||
// update position linked list
|
return true;
|
||||||
handle->NextNear = (ulong)_spareMemory;
|
|
||||||
handle->PreviousNear = p;
|
|
||||||
_spareMemory->PreviousNear = (ulong)handle;
|
|
||||||
if (previous != null) {
|
|
||||||
previous->NextNear = (ulong)handle;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
handle = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseEntryNextLock(previous);
|
|
||||||
ReleaseEntryPrevLock(_spareMemory);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -39,12 +39,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
public unsafe partial class HybridLayerSegregatedFitAllocator
|
public unsafe partial class HybridLayerSegregatedFitAllocator
|
||||||
{
|
{
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AcquireBucketNodeSpinLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
AcquireBucketNodeBothLocks(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initialize bucket system (called in constructor)
|
/// Initialize bucket system (called in constructor)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -53,6 +47,16 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
_bucketHeads = new ulong[levelSizeArray.Length * 3];
|
_bucketHeads = new ulong[levelSizeArray.Length * 3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region BucketNode Operations
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
private static bool IsNullOrEmpty(BucketNode* node)
|
||||||
|
{
|
||||||
|
return node == null || node->Magic != BucketNode.MAGIC_NUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
private void PushLevel(int levelIndex, int sizeIndex, BucketNode* node)
|
private void PushLevel(int levelIndex, int sizeIndex, BucketNode* node)
|
||||||
{
|
{
|
||||||
if (node == null || node->EntryRef == null) {
|
if (node == null || node->EntryRef == null) {
|
||||||
@@ -60,286 +64,110 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
}
|
}
|
||||||
|
|
||||||
int index = (3 * levelIndex) + sizeIndex;
|
int index = (3 * levelIndex) + sizeIndex;
|
||||||
if (Interlocked.CompareExchange(ref _bucketHeads[index], (nuint)node, EmptyHandle) == EmptyHandle)
|
if (_bucketHeads[index] == EmptyHandle)
|
||||||
{
|
{
|
||||||
|
_bucketHeads[index] = (nuint)node;
|
||||||
node->IsInBucket = true;
|
node->IsInBucket = true;
|
||||||
node->Magic = BucketNode.MAGIC_NUMBER;
|
node->Magic = BucketNode.MAGIC_NUMBER;
|
||||||
return;
|
return;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
while (true)
|
ulong head = _bucketHeads[index];
|
||||||
{
|
node->NextLevel = head;
|
||||||
AcquireBucketNodeNextLock(node);
|
BucketNode* headNode = (BucketNode*)head;
|
||||||
ulong head = Volatile.Read(ref _bucketHeads[index]);
|
node->IsInBucket = true;
|
||||||
node->NextLevel = head;
|
node->Magic = BucketNode.MAGIC_NUMBER;
|
||||||
BucketNode* headNode = (BucketNode*)head;
|
if (headNode != null) {
|
||||||
|
headNode->PreviousLevel = (ulong)node;
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Interlocked.CompareExchange(ref _bucketHeads[index], (nuint)node, head) == head)
|
|
||||||
{
|
|
||||||
if (headNode != null && !TryAcquireBucketNodePrevLock(headNode))
|
|
||||||
{
|
|
||||||
// reset state and retry
|
|
||||||
_ = Interlocked.CompareExchange(ref _bucketHeads[index], head, (nuint)node);
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
node->IsInBucket = true;
|
|
||||||
node->Magic = BucketNode.MAGIC_NUMBER;
|
|
||||||
if (headNode != null) {
|
|
||||||
headNode->PreviousLevel = (ulong)node;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (headNode != null) {
|
|
||||||
ReleaseBucketNodePrevLock(headNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseBucketNodeNextLock(node);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 根据锁类型释放BucketNode锁
|
|
||||||
/// </summary>
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseBucketNodeLockByType(BucketNode* node, byte lockType)
|
|
||||||
{
|
|
||||||
switch (lockType)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
ReleaseBucketNodePrevLock(node);
|
|
||||||
return; // PrevLock
|
|
||||||
case 1:
|
|
||||||
ReleaseBucketNodeBothLocks(node);
|
|
||||||
return; // BothLocks
|
|
||||||
case 2:
|
|
||||||
ReleaseBucketNodeNextLock(node);
|
|
||||||
return; // NextLock
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 按地址顺序释放BucketNode锁
|
|
||||||
/// </summary>
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseOrderedBucketLocks(BucketNode* previous, BucketNode* node, BucketNode* next)
|
|
||||||
{
|
|
||||||
if (previous != null) {
|
|
||||||
ReleaseBucketNodeNextLock(previous);
|
|
||||||
}
|
|
||||||
if (node != null) {
|
|
||||||
ReleaseBucketNodeBothLocks(node);
|
|
||||||
}
|
|
||||||
if (next != null) {
|
|
||||||
ReleaseBucketNodePrevLock(next);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
|
private void RemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
|
||||||
{
|
{
|
||||||
int index = (3 * levelIndex) + sizeIndex;
|
int index = (3 * levelIndex) + sizeIndex;
|
||||||
while (true)
|
|
||||||
|
if ((BucketNode*)_bucketHeads[index] == node)
|
||||||
{
|
{
|
||||||
if ((BucketNode*)Volatile.Read(ref _bucketHeads[index]) == node)
|
if (TryPopLevel(levelIndex, sizeIndex, out _)) {
|
||||||
{
|
|
||||||
if (TryPopLevel(levelIndex, sizeIndex, out _)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong p = Volatile.Read(ref node->PreviousLevel);
|
|
||||||
ulong n = Volatile.Read(ref node->NextLevel);
|
|
||||||
BucketNode* previous = (BucketNode*)p;
|
|
||||||
BucketNode* next = (BucketNode*)n;
|
|
||||||
|
|
||||||
if (!TryAcquireOrderedBucketLocks(previous, node, next))
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Volatile.Read(ref node->PreviousLevel) != p || Volatile.Read(ref node->NextLevel) != n)
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (previous != null) {
|
|
||||||
previous->NextLevel = n;
|
|
||||||
}
|
|
||||||
if (next != null) {
|
|
||||||
next->PreviousLevel = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->NextLevel = EmptyHandle;
|
|
||||||
node->PreviousLevel = EmptyHandle;
|
|
||||||
node->IsInBucket = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseOrderedBucketLocks(previous, node, next);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
ulong p = node->PreviousLevel;
|
||||||
private static bool TryAcquireBucketNodeSpinLock(BucketNode* node)
|
ulong n = node->NextLevel;
|
||||||
{
|
BucketNode* previous = (BucketNode*)p;
|
||||||
return TryAcquireBucketNodeBothLocks(node);
|
BucketNode* next = (BucketNode*)n;
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
if (previous != null) {
|
||||||
private static bool TryAcquireOrderedBucketLocks(BucketNode* previous, BucketNode* node, BucketNode* next)
|
previous->NextLevel = n;
|
||||||
{
|
|
||||||
if (previous != null && node != null && next != null)
|
|
||||||
{
|
|
||||||
// previous -> node -> next
|
|
||||||
return TryAcquireBucketNodeNextLock(previous) &&
|
|
||||||
TryAcquireBucketNodeBothLocks(node) &&
|
|
||||||
TryAcquireBucketNodePrevLock(next);
|
|
||||||
} else if (previous != null && node != null) {
|
|
||||||
return TryAcquireBucketNodeNextLock(previous) && TryAcquireBucketNodeBothLocks(node);
|
|
||||||
}
|
}
|
||||||
return true;
|
if (next != null) {
|
||||||
|
next->PreviousLevel = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
node->NextLevel = EmptyHandle;
|
||||||
|
node->PreviousLevel = EmptyHandle;
|
||||||
|
node->IsInBucket = false;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool TryPopLevel(int levelIndex, int sizeIndex, out BucketNode* node)
|
private bool TryPopLevel(int levelIndex, int sizeIndex, out BucketNode* node)
|
||||||
{
|
{
|
||||||
int index = (3 * levelIndex) + sizeIndex;
|
int index = (3 * levelIndex) + sizeIndex;
|
||||||
while (true)
|
|
||||||
|
ulong h = _bucketHeads[index];
|
||||||
|
BucketNode* head = (BucketNode*)h;
|
||||||
|
|
||||||
|
if (head == null)
|
||||||
{
|
{
|
||||||
ulong h = Volatile.Read(ref _bucketHeads[index]);
|
node = null;
|
||||||
BucketNode* head = (BucketNode*)h;
|
return false;
|
||||||
|
|
||||||
if (head == null)
|
|
||||||
{
|
|
||||||
node = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!TryAcquireBucketNodeNextLock(head))
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong n = Volatile.Read(ref head->NextLevel);
|
|
||||||
BucketNode* next = (BucketNode*)n;
|
|
||||||
|
|
||||||
if (next == null)
|
|
||||||
{
|
|
||||||
if (Interlocked.CompareExchange(ref _bucketHeads[index], EmptyHandle, h) == h)
|
|
||||||
{
|
|
||||||
node = head;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
node = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!TryAcquireBucketNodePrevLock(next))
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Interlocked.CompareExchange(ref _bucketHeads[index], head->NextLevel, h) == h)
|
|
||||||
{
|
|
||||||
node = head;
|
|
||||||
node->IsInBucket = false;
|
|
||||||
node->NextLevel = EmptyHandle;
|
|
||||||
if (next != null) {
|
|
||||||
next->PreviousLevel = EmptyHandle;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
Thread.Sleep(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (next != null) {
|
|
||||||
ReleaseBucketNodePrevLock(next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseBucketNodeNextLock(head);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ulong n = head->NextLevel;
|
||||||
|
BucketNode* next = (BucketNode*)n;
|
||||||
|
|
||||||
|
if (next == null)
|
||||||
|
{
|
||||||
|
_bucketHeads[index] = EmptyHandle;
|
||||||
|
node = head;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
_bucketHeads[index] = head->NextLevel;
|
||||||
|
node = head;
|
||||||
|
node->IsInBucket = false;
|
||||||
|
node->NextLevel = EmptyHandle;
|
||||||
|
if (next != null) {
|
||||||
|
next->PreviousLevel = EmptyHandle;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool TryRemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
|
private bool TryRemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
|
||||||
{
|
{
|
||||||
int index = (3 * levelIndex) + sizeIndex;
|
int index = (3 * levelIndex) + sizeIndex;
|
||||||
if ((BucketNode*)Volatile.Read(ref _bucketHeads[index]) == node)
|
if ((BucketNode*) _bucketHeads[index] == node) {
|
||||||
{
|
return TryPopLevel(levelIndex, sizeIndex, out _);
|
||||||
if (TryPopLevel(levelIndex, sizeIndex, out _)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong p = Volatile.Read(ref node->PreviousLevel);
|
ulong p = node->PreviousLevel;
|
||||||
ulong n = Volatile.Read(ref node->NextLevel);
|
ulong n = node->NextLevel;
|
||||||
BucketNode* previous = (BucketNode*)p;
|
BucketNode* previous = (BucketNode*)p;
|
||||||
BucketNode* next = (BucketNode*)n;
|
BucketNode* next = (BucketNode*)n;
|
||||||
|
|
||||||
if (!TryAcquireOrderedBucketLocks(previous, node, next)) {
|
if (previous != null) {
|
||||||
return false;
|
previous->NextLevel = n;
|
||||||
|
}
|
||||||
|
if (next != null) {
|
||||||
|
next->PreviousLevel = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
node->NextLevel = EmptyHandle;
|
||||||
{
|
node->PreviousLevel = EmptyHandle;
|
||||||
if (Volatile.Read(ref node->PreviousLevel) != p || Volatile.Read(ref node->NextLevel) != n) {
|
node->IsInBucket = false;
|
||||||
return false;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
if (previous != null) {
|
|
||||||
previous->NextLevel = n;
|
|
||||||
}
|
|
||||||
if (next != null) {
|
|
||||||
next->PreviousLevel = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->NextLevel = EmptyHandle;
|
|
||||||
node->PreviousLevel = EmptyHandle;
|
|
||||||
node->IsInBucket = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ReleaseOrderedBucketLocks(previous, node, next);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -364,139 +192,5 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region BucketNode Operations
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static bool IsNullOrEmpty(BucketNode* node)
|
|
||||||
{
|
|
||||||
return node == null || node->Magic != BucketNode.MAGIC_NUMBER;
|
|
||||||
}
|
|
||||||
|
|
||||||
// BucketNode 前驱锁操作(控制PreviousLevel字段)
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static bool TryAcquireBucketNodePrevLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
return Interlocked.CompareExchange(ref node->PrevLock, thread, 0) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AcquireBucketNodePrevLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
if (Volatile.Read(ref node->PrevLock) != thread)
|
|
||||||
{
|
|
||||||
while (Interlocked.CompareExchange(ref node->PrevLock, thread, 0) != 0) {
|
|
||||||
Thread.Sleep(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseBucketNodePrevLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
if (Volatile.Read(ref node->PrevLock) == thread) {
|
|
||||||
Volatile.Write(ref node->PrevLock, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// BucketNode 后继锁操作(控制NextLevel字段)
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static bool TryAcquireBucketNodeNextLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
return Interlocked.CompareExchange(ref node->NextLock, thread, 0) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AcquireBucketNodeNextLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
if (Volatile.Read(ref node->NextLock) != thread)
|
|
||||||
{
|
|
||||||
while (Interlocked.CompareExchange(ref node->NextLock, thread, 0) != 0) {
|
|
||||||
Thread.Sleep(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseBucketNodeNextLock(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int thread = Environment.CurrentManagedThreadId;
|
|
||||||
if (Volatile.Read(ref node->NextLock) == thread) {
|
|
||||||
Volatile.Write(ref node->NextLock, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static bool TryAcquireBucketNodeBothLocks(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TryAcquireBucketNodePrevLock(node))
|
|
||||||
{
|
|
||||||
if (TryAcquireBucketNodeNextLock(node))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
ReleaseBucketNodePrevLock(node); // 回滚
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseBucketNodeBothLocks(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseBucketNodePrevLock(node);
|
|
||||||
ReleaseBucketNodeNextLock(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AcquireBucketNodeBothLocks(BucketNode* node)
|
|
||||||
{
|
|
||||||
if (node == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AcquireBucketNodePrevLock(node);
|
|
||||||
AcquireBucketNodeNextLock(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,37 +54,24 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
if (e == null) {
|
if (e == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AcquireEntrySpinLock(e);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (GetEntryState(e) != EntryState.Allocated) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SetEntryState(e, EntryState.ThreadOccupied);
|
|
||||||
|
|
||||||
if (e->State != EntryState.Allocated) {
|
if (e->State != EntryState.Allocated) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Set to ThreadOccupied to prevent other operations
|
// Set to ThreadOccupied to prevent other operations
|
||||||
e->State = EntryState.Empty;
|
e->State = EntryState.Empty;
|
||||||
|
|
||||||
|
|
||||||
// Try merge with adjacent free blocks and remove them from buckets
|
// Try merge with adjacent free blocks and remove them from buckets
|
||||||
MergeAndRemoveFromBuckets(e);
|
MergeAndRemoveFromBuckets(e);
|
||||||
|
|
||||||
|
|
||||||
// Calculate final level and segment for the merged block
|
// Calculate final level and segment for the merged block
|
||||||
uint finalSize = e->Size;
|
uint finalSize = e->Size;
|
||||||
int finalLevel = GetLevelFromSize(finalSize);
|
int finalLevel = GetLevelFromSize(finalSize);
|
||||||
int finalSegment = DetermineSegmentIndex(finalSize, finalLevel);
|
int finalSegment = DetermineSegmentIndex(finalSize, finalLevel);
|
||||||
|
|
||||||
|
|
||||||
// Set the merged entry state to Empty (ready to be reused)
|
// Set the merged entry state to Empty (ready to be reused)
|
||||||
e->State = EntryState.Empty;
|
e->State = EntryState.Empty;
|
||||||
|
|
||||||
|
|
||||||
// Push the merged entry back to appropriate bucket
|
// Push the merged entry back to appropriate bucket
|
||||||
PushLevel(finalLevel, finalSegment, (BucketNode*)e->Position);
|
PushLevel(finalLevel, finalSegment, (BucketNode*)e->Position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,24 +41,18 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
public unsafe partial class HybridLayerSegregatedFitAllocator
|
public unsafe partial class HybridLayerSegregatedFitAllocator
|
||||||
{
|
{
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
private bool AssertBackwardBoundary(ulong currentOffset, Entry* target, int level)
|
||||||
private static void AcquireEntrySpinLock(Entry* entry)
|
|
||||||
{
|
{
|
||||||
AcquireEntryBothLocks(entry);
|
int nextLevelSize = levelSizeArray[level] * 4;
|
||||||
|
ulong targetHead = target->Position - (ulong)m_Buffer;
|
||||||
|
return (currentOffset / (ulong)nextLevelSize) == (targetHead / (ulong)nextLevelSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool AssertBackwardBoundary(ulong current, Entry* target, int level)
|
private bool AssertForwardBoundary(ulong currentOffset, Entry* target, int level)
|
||||||
{
|
{
|
||||||
int size = (level * 2) + 6;
|
int nextLevelSize = levelSizeArray[level] * 4;
|
||||||
ulong align = current >> size;
|
ulong targetTail = target->Position - (ulong)m_Buffer + target->Size - 1;
|
||||||
return align == target->Position >> size && align == (current + target->Size) >> size;
|
return (currentOffset / (ulong)nextLevelSize) == (targetTail / (ulong)nextLevelSize);
|
||||||
}
|
|
||||||
|
|
||||||
private bool AssertForwardBoundary(ulong current, Entry* target, int level)
|
|
||||||
{
|
|
||||||
int size = (level * 2) + 6;
|
|
||||||
ulong align = current >> size;
|
|
||||||
return align == target->Position >> size && align == (current - target->Size) >> size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -94,12 +88,12 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
|
|
||||||
Entry* result = entry;
|
Entry* result = entry;
|
||||||
uint size = entry->Size;
|
uint size = entry->Size;
|
||||||
int originLevel = GetLevelFromSize(size);
|
int originLevel = entry->Level;
|
||||||
int segment = DetermineSegmentIndex(size, originLevel);
|
int segment = DetermineSegmentIndex(size, originLevel);
|
||||||
|
|
||||||
RemoveFromBucket(originLevel, segment, (BucketNode*)entry->Position);
|
RemoveFromBucket(originLevel, segment, (BucketNode*)entry->Position);
|
||||||
|
|
||||||
while (originLevel >= entry->Level)
|
do
|
||||||
{
|
{
|
||||||
originLevel = entry->Level;
|
originLevel = entry->Level;
|
||||||
while (true)
|
while (true)
|
||||||
@@ -107,10 +101,15 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
// backward merging - simplified to single attempt
|
// backward merging - simplified to single attempt
|
||||||
ulong p = entry->PreviousNear;
|
ulong p = entry->PreviousNear;
|
||||||
Entry* prev = (Entry*)p;
|
Entry* prev = (Entry*)p;
|
||||||
|
|
||||||
|
|
||||||
|
// 计算当前块相对于分配空间基址的偏移量
|
||||||
|
ulong currentOffset = entry->Position - (ulong)m_Buffer;
|
||||||
|
|
||||||
if (prev == null ||
|
if (prev == null ||
|
||||||
prev == _spareMemory ||
|
prev == _spareMemory ||
|
||||||
!AssertBackwardBoundary(entry->Position, prev, originLevel) ||
|
!AssertBackwardBoundary(currentOffset, prev, originLevel) ||
|
||||||
IsAdjacentTo(entry, prev) ||
|
!IsAdjacentTo(entry, prev) ||
|
||||||
entry->Level != prev->Level ||
|
entry->Level != prev->Level ||
|
||||||
!TryRemoveFromBucket(originLevel, DetermineSegmentIndex(prev->Size, originLevel), (BucketNode*)prev->Position))
|
!TryRemoveFromBucket(originLevel, DetermineSegmentIndex(prev->Size, originLevel), (BucketNode*)prev->Position))
|
||||||
{
|
{
|
||||||
@@ -135,10 +134,13 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
// forward merging - simplified to single attempt
|
// forward merging - simplified to single attempt
|
||||||
ulong n = entry->NextNear;
|
ulong n = entry->NextNear;
|
||||||
Entry* next = (Entry*)n;
|
Entry* next = (Entry*)n;
|
||||||
|
|
||||||
|
ulong currentOffset = entry->Position - (ulong)m_Buffer;
|
||||||
|
|
||||||
if (next == null ||
|
if (next == null ||
|
||||||
next == _spareMemory ||
|
next == _spareMemory ||
|
||||||
!AssertForwardBoundary(entry->Position + entry->Size, next, entry->Level) ||
|
!AssertForwardBoundary(currentOffset, next, entry->Level) ||
|
||||||
IsAdjacentTo(entry, next) ||
|
!IsAdjacentTo(entry, next) ||
|
||||||
entry->Level != next->Level ||
|
entry->Level != next->Level ||
|
||||||
!TryRemoveFromBucket(originLevel, DetermineSegmentIndex(next->Size, originLevel), (BucketNode*)next->Position))
|
!TryRemoveFromBucket(originLevel, DetermineSegmentIndex(next->Size, originLevel), (BucketNode*)next->Position))
|
||||||
{
|
{
|
||||||
@@ -157,7 +159,7 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
RecycleEntry(next);
|
RecycleEntry(next);
|
||||||
}
|
}
|
||||||
entry->Level = GetLevelFromSize(entry->Size);
|
entry->Level = GetLevelFromSize(entry->Size);
|
||||||
}
|
} while (originLevel < entry->Level);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RecycleEntry(Entry* entry)
|
private void RecycleEntry(Entry* entry)
|
||||||
@@ -171,45 +173,25 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
_entries.Free((nuint)entry);
|
_entries.Free((nuint)entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void ReleaseEntrySpinLock(Entry* entry)
|
|
||||||
{
|
|
||||||
ReleaseEntryBothLocks(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Remove node from position linked list
|
/// Remove node from position linked list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void RemoveFromPositionChain(Entry* entry)
|
private void RemoveFromPositionChain(Entry* entry)
|
||||||
{
|
{
|
||||||
AcquireEntrySpinLock(entry);
|
Entry* prev = (Entry*)entry->PreviousNear;
|
||||||
try
|
Entry* next = (Entry*)entry->NextNear;
|
||||||
{
|
|
||||||
Entry* prev = (Entry*)entry->PreviousNear;
|
|
||||||
Entry* next = (Entry*)entry->NextNear;
|
|
||||||
|
|
||||||
if (prev != null) {
|
if (prev != null) {
|
||||||
prev->NextNear = entry->NextNear;
|
prev->NextNear = entry->NextNear;
|
||||||
}
|
|
||||||
if (next != null) {
|
|
||||||
next->PreviousNear = entry->PreviousNear;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear node pointers
|
|
||||||
entry->NextNear = EmptyHandle;
|
|
||||||
entry->PreviousNear = EmptyHandle;
|
|
||||||
_entries.Free((nuint)entry);
|
|
||||||
}
|
}
|
||||||
finally
|
if (next != null) {
|
||||||
{
|
next->PreviousNear = entry->PreviousNear;
|
||||||
ReleaseEntrySpinLock(entry);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
// Clear node pointers
|
||||||
private static bool TryAcquireEntrySpinLock(Entry* entry)
|
entry->NextNear = EmptyHandle;
|
||||||
{
|
entry->PreviousNear = EmptyHandle;
|
||||||
return TryAcquireEntryBothLocks(entry);
|
_entries.Free((nuint)entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -66,8 +66,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
_spareMemory->PreviousNear = EmptyHandle;
|
_spareMemory->PreviousNear = EmptyHandle;
|
||||||
_spareMemory->NextNear = EmptyHandle;
|
_spareMemory->NextNear = EmptyHandle;
|
||||||
_spareMemory->Position = (nuint)m_Buffer;
|
_spareMemory->Position = (nuint)m_Buffer;
|
||||||
_spareMemory->PrevLock = 0;
|
|
||||||
_spareMemory->NextLock = 0;
|
|
||||||
_spareMemory->Size = (uint)byteSize;
|
_spareMemory->Size = (uint)byteSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,8 +87,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
_spareMemory->PreviousNear = EmptyHandle;
|
_spareMemory->PreviousNear = EmptyHandle;
|
||||||
_spareMemory->NextNear = EmptyHandle;
|
_spareMemory->NextNear = EmptyHandle;
|
||||||
_spareMemory->Position = (nuint)m_Buffer;
|
_spareMemory->Position = (nuint)m_Buffer;
|
||||||
_spareMemory->PrevLock = 0;
|
|
||||||
_spareMemory->NextLock = 0;
|
|
||||||
_spareMemory->Size = (uint)byteSize;
|
_spareMemory->Size = (uint)byteSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// file="ISlabAllocatable.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.HighPerformance.Memory
|
|
||||||
{
|
|
||||||
public interface ISlabAllocatable { }
|
|
||||||
}
|
|
||||||
@@ -41,7 +41,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
internal sealed unsafe class ChunkedSlabAllocator<T> : SlabAllocator<T> where T: unmanaged
|
internal sealed unsafe class ChunkedSlabAllocator<T> : SlabAllocator<T> where T: unmanaged
|
||||||
{
|
{
|
||||||
|
|
||||||
private readonly BufferExpansionLock _lock = new();
|
|
||||||
private BufferStack<nuint> _buffers;
|
private BufferStack<nuint> _buffers;
|
||||||
private BufferStack<nuint> _recycle;
|
private BufferStack<nuint> _recycle;
|
||||||
private readonly int _elementSize = Unsafe.SizeOf<T>();
|
private readonly int _elementSize = Unsafe.SizeOf<T>();
|
||||||
@@ -74,42 +73,20 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
if (_recycle.TryPop(out nuint handle)) {
|
if (_recycle.TryPop(out nuint handle)) {
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
while (true)
|
nuint bufferHandle = _currentBuffer;
|
||||||
|
nuint curIndex = _currentIndex;
|
||||||
|
if (curIndex >= _currentCapacity)
|
||||||
{
|
{
|
||||||
nuint bufferHandle = Volatile.Read(ref _currentBuffer);
|
nuint cap = _currentCapacity;
|
||||||
nuint curIndex = Volatile.Read(ref _currentIndex);
|
nuint newBuffer = (nuint)NativeMemory.Alloc(cap * (nuint)_elementSize);
|
||||||
_lock.EnterMetaDataRead();
|
_buffers.Push(bufferHandle);
|
||||||
try
|
_currentBuffer = newBuffer;
|
||||||
{
|
_currentIndex = 0;
|
||||||
if (curIndex >= _currentCapacity)
|
|
||||||
{
|
|
||||||
_lock.ExitMetaDataRead();
|
|
||||||
_lock.EnterExpansionProcess();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
nuint cap = Volatile.Read(ref _currentCapacity);
|
|
||||||
nuint newBuffer = (nuint)NativeMemory.Alloc(cap * (nuint)_elementSize);
|
|
||||||
_buffers.Push(bufferHandle);
|
|
||||||
_ = Interlocked.Exchange(ref _currentBuffer, newBuffer);
|
|
||||||
_ = Interlocked.Exchange(ref _currentIndex, 0);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
_lock.ExitExpansionProcess();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
curIndex = Volatile.Read(ref _currentIndex);
|
|
||||||
_ = Interlocked.Add(
|
|
||||||
ref Unsafe.As<nuint, ulong>(ref _currentIndex), (ulong)_elementSize);
|
|
||||||
return _currentBuffer + ((nuint)_elementSize * curIndex);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (_lock.IsThreadReadingMetaData) {
|
|
||||||
_lock.ExitMetaDataRead();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
curIndex = _currentIndex;
|
||||||
|
_ = Interlocked.Add(
|
||||||
|
ref Unsafe.As<nuint, ulong>(ref _currentIndex), (ulong)_elementSize);
|
||||||
|
return _currentBuffer + ((nuint)_elementSize * curIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
@@ -118,7 +95,6 @@ namespace StgSharp.HighPerformance.Memory
|
|||||||
while (_buffers.TryPop(out nuint buffer)) {
|
while (_buffers.TryPop(out nuint buffer)) {
|
||||||
NativeMemory.Free((void*)buffer);
|
NativeMemory.Free((void*)buffer);
|
||||||
}
|
}
|
||||||
_lock.Dispose();
|
|
||||||
_buffers.Dispose();
|
_buffers.Dispose();
|
||||||
_recycle.Dispose();
|
_recycle.Dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// file="UnmanagedMemoryHandle.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Buffers;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.HighPerformance.Memory
|
|
||||||
{
|
|
||||||
public unsafe struct UnmanagedMemoryHandle
|
|
||||||
{
|
|
||||||
|
|
||||||
public readonly byte* BufferHandle, AllocatorHandle;
|
|
||||||
public readonly nuint Size;
|
|
||||||
|
|
||||||
public UnmanagedMemoryHandle(byte* pointer, byte* handle, nuint s)
|
|
||||||
{
|
|
||||||
BufferHandle = pointer;
|
|
||||||
AllocatorHandle = handle;
|
|
||||||
Size = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly ref byte this[nuint index]
|
|
||||||
{
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
get => ref Unsafe.AddByteOffset(ref Unsafe.AsRef<byte>(BufferHandle), index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly Enumerator GetEnumerator()
|
|
||||||
{
|
|
||||||
return new Enumerator(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ref struct Enumerator : IEnumerator<byte>
|
|
||||||
{
|
|
||||||
|
|
||||||
private nuint _index = nuint.MaxValue;
|
|
||||||
|
|
||||||
private UnmanagedMemoryHandle _handle;
|
|
||||||
|
|
||||||
internal Enumerator(UnmanagedMemoryHandle span)
|
|
||||||
{
|
|
||||||
_handle = span;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ref byte RefCurrent => ref _handle[_index];
|
|
||||||
|
|
||||||
public readonly void Dispose() { }
|
|
||||||
|
|
||||||
public bool MoveNext()
|
|
||||||
{
|
|
||||||
_index++;
|
|
||||||
return _index < _handle.Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
_index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
object IEnumerator.Current => RefCurrent;
|
|
||||||
|
|
||||||
byte IEnumerator<byte>.Current => RefCurrent;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// file="UnmanagedMemoryPool.BucketTLSF.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
using StgSharp.HighPerformance.Memory;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.HighPerformance.Memory
|
|
||||||
{
|
|
||||||
public unsafe partial class UnmanagedMemoryPool
|
|
||||||
{
|
|
||||||
|
|
||||||
private struct Entry : ISlabAllocatable
|
|
||||||
{
|
|
||||||
|
|
||||||
public Entry* NextNear, PreviousNear;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// file="UnmanagedMemoryPool.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Net.Security;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Transactions;
|
|
||||||
|
|
||||||
namespace StgSharp.HighPerformance.Memory
|
|
||||||
{
|
|
||||||
public unsafe partial class UnmanagedMemoryPool
|
|
||||||
{
|
|
||||||
|
|
||||||
private byte* m_Buffer;
|
|
||||||
private SlabAllocator<Entry> _nodes = new(64);
|
|
||||||
|
|
||||||
public
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -152,7 +152,5 @@ namespace StgSharp.HighPerformance
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private MegaBlockHead
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,175 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Blueprint.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A sets of complex logic designed for running in multi threads environment. Warning: do not
|
|
||||||
/// run a <see cref="BlueprintScheduler" /> instance in multi threads more than once.
|
|
||||||
/// </summary>
|
|
||||||
public partial class BlueprintScheduler : IConvertableToBlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private BeginningNode beginNode;
|
|
||||||
private Dictionary<string, BlueprintNode> allNode;
|
|
||||||
private EndingNode endNode;
|
|
||||||
|
|
||||||
private Func<bool> terminate;
|
|
||||||
private List<BlueprintNode> globalNodeList;
|
|
||||||
private List<BlueprintNode> nativeNodeList;
|
|
||||||
|
|
||||||
private SemaphoreSlim runningStat;
|
|
||||||
|
|
||||||
internal int currentGlobalNodeIndex;
|
|
||||||
internal int currentNativeNodeIndex;
|
|
||||||
|
|
||||||
public BlueprintScheduler()
|
|
||||||
{
|
|
||||||
allNode = new Dictionary<string, BlueprintNode>();
|
|
||||||
globalNodeList = new List<BlueprintNode>();
|
|
||||||
nativeNodeList = new List<BlueprintNode>();
|
|
||||||
runningStat = new SemaphoreSlim( 1, 1 );
|
|
||||||
beginNode = new BeginningNode( this );
|
|
||||||
endNode = new EndingNode( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlueprintNode BeginLayer => beginNode;
|
|
||||||
|
|
||||||
public BlueprintNode EndLayer => endNode;
|
|
||||||
|
|
||||||
public BlueprintNodeOperation Operation
|
|
||||||
{
|
|
||||||
get => ExecuteMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsRunning
|
|
||||||
{
|
|
||||||
get => runningStat.CurrentCount == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<string> InputInterfacesName
|
|
||||||
{
|
|
||||||
get { return beginNode.OutputInterfaces.Keys; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<string> OutputInterfacesName
|
|
||||||
{
|
|
||||||
get { return beginNode.OutputInterfaces.Keys; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**/
|
|
||||||
|
|
||||||
internal SemaphoreSlim RunningStat
|
|
||||||
{
|
|
||||||
get => runningStat;
|
|
||||||
}
|
|
||||||
/**/
|
|
||||||
|
|
||||||
public void AddNode( BlueprintNode node, bool isNative )
|
|
||||||
{
|
|
||||||
_ = node ?? throw new ArgumentNullException( nameof( node ) );
|
|
||||||
node.IsNative = isNative;
|
|
||||||
allNode.Add( node.Name, node );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteMain(
|
|
||||||
in Dictionary<string, BlueprintPipeline> input,
|
|
||||||
in Dictionary<string, BlueprintPipeline> output )
|
|
||||||
{
|
|
||||||
BlueprintRunner.Run( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
||||||
public (string name, BlueprintPipelineArgs arg)[] GetOutput()
|
|
||||||
{
|
|
||||||
return endNode.OutputData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Init()
|
|
||||||
{
|
|
||||||
foreach( KeyValuePair<string, BlueprintNode> item in allNode ) {
|
|
||||||
if( item.Value.IsNative ) {
|
|
||||||
nativeNodeList.Add( item.Value );
|
|
||||||
} else {
|
|
||||||
globalNodeList.Add( item.Value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nativeNodeList.Sort();
|
|
||||||
globalNodeList.Sort();
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
||||||
public void SetInput(
|
|
||||||
params (string name, BlueprintPipelineArgs arg)[] parameters )
|
|
||||||
{
|
|
||||||
beginNode.InputData = parameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Terminate()
|
|
||||||
{
|
|
||||||
Interlocked.Exchange( ref currentGlobalNodeIndex, int.MaxValue );
|
|
||||||
Interlocked.Exchange( ref currentNativeNodeIndex, int.MaxValue );
|
|
||||||
}
|
|
||||||
|
|
||||||
internal bool RequestNexGlobalNode( out BlueprintNode node )
|
|
||||||
{
|
|
||||||
if( currentGlobalNodeIndex < globalNodeList.Count ) {
|
|
||||||
node = globalNodeList[ currentGlobalNodeIndex ];
|
|
||||||
Interlocked.Increment( ref currentGlobalNodeIndex );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
node = default!;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal bool RequestNextNativeNode( out BlueprintNode node )
|
|
||||||
{
|
|
||||||
if( currentNativeNodeIndex < nativeNodeList.Count ) {
|
|
||||||
node = nativeNodeList[ currentNativeNodeIndex ];
|
|
||||||
Interlocked.Increment( ref currentNativeNodeIndex );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
node = default!;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
~BlueprintScheduler()
|
|
||||||
{
|
|
||||||
runningStat.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,303 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="BlueprintNode.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
using StgSharp.Entities;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.Serialization;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <risk>
|
|
||||||
/// Reset pipeline has risk, this operation is a direct operation to port in current node, the
|
|
||||||
/// port on the other node cannot get the change.
|
|
||||||
/// </risk>
|
|
||||||
#pragma warning disable CA1036
|
|
||||||
public class BlueprintNode : IComparable<BlueprintNode>
|
|
||||||
#pragma warning restore CA1036
|
|
||||||
{
|
|
||||||
|
|
||||||
private static BlueprintNode _emptyNode = new BlueprintNode(
|
|
||||||
string.Empty, null!, false );
|
|
||||||
|
|
||||||
private static Dictionary<string, BlueprintPipeline> _emptyLayer = new();
|
|
||||||
private protected bool _levelAvailable, _nativeRequested;
|
|
||||||
private protected Dictionary<string, BlueprintPipeline> _inputInterfaces;
|
|
||||||
private protected Dictionary<string, BlueprintPipeline> _outputInterfaces;
|
|
||||||
private protected int _level;
|
|
||||||
private IConvertableToBlueprintNode _mainOperation;
|
|
||||||
private string _name;
|
|
||||||
|
|
||||||
internal BlueprintNode(
|
|
||||||
string name,
|
|
||||||
IConvertableToBlueprintNode node,
|
|
||||||
bool isNative )
|
|
||||||
{
|
|
||||||
_levelAvailable = false;
|
|
||||||
_name = name;
|
|
||||||
_nativeRequested = isNative;
|
|
||||||
_mainOperation = node;
|
|
||||||
_inputInterfaces = new Dictionary<string, BlueprintPipeline>();
|
|
||||||
_outputInterfaces = new Dictionary<string, BlueprintPipeline>();
|
|
||||||
foreach( string portName in node.InputInterfacesName ) {
|
|
||||||
_inputInterfaces.Add( portName, null! );
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach( string portName in node.OutputInterfacesName ) {
|
|
||||||
_outputInterfaces.Add( portName, null! );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma warning disable CS8618
|
|
||||||
internal BlueprintNode(
|
|
||||||
BlueprintNodeOperation operation,
|
|
||||||
string name,
|
|
||||||
bool isNative,
|
|
||||||
string[] inputPorts,
|
|
||||||
string[] outputPorts )
|
|
||||||
#pragma warning restore CS8618
|
|
||||||
{
|
|
||||||
if( ( inputPorts == null ) || ( inputPorts.Length == 0 ) ) {
|
|
||||||
throw new ArgumentNullException( nameof( inputPorts ) );
|
|
||||||
}
|
|
||||||
if( ( outputPorts == null ) || ( outputPorts.Length == 0 ) ) {
|
|
||||||
throw new ArgumentNullException( nameof( outputPorts ) );
|
|
||||||
}
|
|
||||||
_levelAvailable = false;
|
|
||||||
_name = name;
|
|
||||||
_nativeRequested = isNative;
|
|
||||||
operation = operation ?? DefaultOperation;
|
|
||||||
_mainOperation = new DefaultConvertableToBlueprintNode(
|
|
||||||
operation,
|
|
||||||
inputPorts,
|
|
||||||
outputPorts);
|
|
||||||
_inputInterfaces = new Dictionary<string, BlueprintPipeline>();
|
|
||||||
_outputInterfaces = new Dictionary<string, BlueprintPipeline>();
|
|
||||||
foreach( string portName in inputPorts ) {
|
|
||||||
_inputInterfaces.Add(
|
|
||||||
portName,
|
|
||||||
SealedBlueprintPiipeline.SealOutput( this, name ) );
|
|
||||||
}
|
|
||||||
foreach( string portName in outputPorts ) {
|
|
||||||
_outputInterfaces.Add( portName, null! );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void DefaultOperation(
|
|
||||||
in Dictionary<string, BlueprintPipeline> input,
|
|
||||||
in Dictionary<string, BlueprintPipeline> output)
|
|
||||||
{
|
|
||||||
BlueprintPipeline.SkipAll(output);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BlueprintNode Empty
|
|
||||||
{
|
|
||||||
get => _emptyNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsNative
|
|
||||||
{
|
|
||||||
get => _nativeRequested;
|
|
||||||
internal set => _nativeRequested = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Dictionary<string, BlueprintPipeline> EmptyPortLayer
|
|
||||||
{
|
|
||||||
get => _emptyLayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Level
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if( _levelAvailable ) {
|
|
||||||
return _level;
|
|
||||||
}
|
|
||||||
_level = 0;
|
|
||||||
foreach( KeyValuePair<string, BlueprintPipeline> item in _inputInterfaces ) {
|
|
||||||
if( item.Value == null ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if( _level < item.Value.Level ) {
|
|
||||||
_level = item.Value.Level;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_level += 1;
|
|
||||||
_levelAvailable = true;
|
|
||||||
return _level;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name => _name;
|
|
||||||
|
|
||||||
internal Dictionary<string, BlueprintPipeline> InputInterfaces => _inputInterfaces;
|
|
||||||
|
|
||||||
internal Dictionary<string, BlueprintPipeline> OutputInterfaces => _outputInterfaces;
|
|
||||||
|
|
||||||
internal IConvertableToBlueprintNode Value
|
|
||||||
{
|
|
||||||
get => _mainOperation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Append(
|
|
||||||
[NotNull] BlueprintNode next,
|
|
||||||
string thisOutputPortName,
|
|
||||||
string afterInputPortName )
|
|
||||||
{
|
|
||||||
this._levelAvailable = false;
|
|
||||||
BlueprintPipeline pipeline = new BlueprintPipeline( this, next );
|
|
||||||
if( next is EndingNode enode ) {
|
|
||||||
enode.SetCertainInputPort( afterInputPortName, pipeline );
|
|
||||||
} else {
|
|
||||||
next.SetCertainInputPort( afterInputPortName, pipeline );
|
|
||||||
}
|
|
||||||
SetCertainOutputPort( thisOutputPortName, pipeline );
|
|
||||||
}
|
|
||||||
|
|
||||||
public int CompareTo( BlueprintNode other )
|
|
||||||
{
|
|
||||||
if( null == other ) {
|
|
||||||
throw new ArgumentNullException( nameof( other ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Level.CompareTo( other.Level );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Prepend(
|
|
||||||
[NotNull] BlueprintNode former,
|
|
||||||
string formerOutputPortName,
|
|
||||||
string thisInputPortName )
|
|
||||||
{
|
|
||||||
this._levelAvailable = false;
|
|
||||||
BlueprintPipeline pipeline = new BlueprintPipeline( former, this );
|
|
||||||
if( former is BeginningNode bnode ) {
|
|
||||||
bnode.SetCertainOutputPort( formerOutputPortName, pipeline );
|
|
||||||
} else {
|
|
||||||
former.SetCertainOutputPort( formerOutputPortName, pipeline );
|
|
||||||
}
|
|
||||||
SetCertainInputPort( thisInputPortName, pipeline );
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Run()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
//Console.WriteLine(_name);
|
|
||||||
BlueprintPipeline.WaitAll( _inputInterfaces );
|
|
||||||
if( _mainOperation != null ) {
|
|
||||||
_mainOperation.Operation(
|
|
||||||
in _inputInterfaces, in _outputInterfaces );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( Exception ) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region port operation
|
|
||||||
|
|
||||||
public BlueprintPipeline GetInputPort( string name )
|
|
||||||
{
|
|
||||||
BlueprintPipeline ret;
|
|
||||||
if( !_inputInterfaces.TryGetValue( name, out ret ) ) {
|
|
||||||
throw new ArgumentOutOfRangeException(
|
|
||||||
$"Cannot find the interface named {name} in node {Name}." );
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlueprintPipeline GetOutputPort( string name )
|
|
||||||
{
|
|
||||||
BlueprintPipeline ret;
|
|
||||||
if( !_outputInterfaces.TryGetValue( name, out ret ) ) {
|
|
||||||
throw new ArgumentOutOfRangeException(
|
|
||||||
$"Cannot find the interface named {name} in node {Name}." );
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetCertainInputPort(
|
|
||||||
string name,
|
|
||||||
BlueprintPipeline pipeline )
|
|
||||||
{
|
|
||||||
if( !_inputInterfaces.ContainsKey( name ) ) {
|
|
||||||
throw new ArgumentException(
|
|
||||||
$"Cannot find the interface named {name} in node {Name}." );
|
|
||||||
}
|
|
||||||
_inputInterfaces[ name ] = pipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetCertainOutputPort(
|
|
||||||
string name,
|
|
||||||
BlueprintPipeline pipeline )
|
|
||||||
{
|
|
||||||
if( !_outputInterfaces.ContainsKey( name ) ) {
|
|
||||||
throw new ArgumentOutOfRangeException(
|
|
||||||
$"Cannot find the interface named {name} in node {Name}." );
|
|
||||||
}
|
|
||||||
_outputInterfaces[ name ] = pipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}//--------------------------------- end of class -----------------------------------
|
|
||||||
|
|
||||||
public class BlueprintNodeRunException : Exception
|
|
||||||
{
|
|
||||||
|
|
||||||
protected BlueprintNodeRunException(
|
|
||||||
SerializationInfo info,
|
|
||||||
StreamingContext context )
|
|
||||||
: base( info, context ) { }
|
|
||||||
|
|
||||||
public BlueprintNodeRunException() { }
|
|
||||||
|
|
||||||
public BlueprintNodeRunException( Exception ex )
|
|
||||||
: base( string.Empty, ex ) { }
|
|
||||||
|
|
||||||
public BlueprintNodeRunException( string message ) : base( message ) { }
|
|
||||||
|
|
||||||
public BlueprintNodeRunException(
|
|
||||||
string message,
|
|
||||||
Exception innerException )
|
|
||||||
: base( message, innerException ) { }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="BlueprintNodeCraeater.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public partial class BlueprintScheduler
|
|
||||||
{
|
|
||||||
|
|
||||||
public BlueprintNode CreateBlueprintNode(
|
|
||||||
string name,
|
|
||||||
BlueprintNodeOperation operation,
|
|
||||||
string[] inputPort,
|
|
||||||
string[] outputPort,
|
|
||||||
bool isNative )
|
|
||||||
{
|
|
||||||
BlueprintNode node = new BlueprintNode(
|
|
||||||
operation, name, isNative, inputPort, outputPort );
|
|
||||||
if( isNative ) {
|
|
||||||
nativeNodeList.Add( node );
|
|
||||||
} else {
|
|
||||||
globalNodeList.Add( node );
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="BlueprintRunner.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
using StgSharp.Threading;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Data;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public static class BlueprintRunner
|
|
||||||
{
|
|
||||||
|
|
||||||
private static NodeRunner[] allAvailableTask = CreateBlueprintRunnerArray(
|
|
||||||
);
|
|
||||||
private static CancellationTokenSource cts = new CancellationTokenSource(
|
|
||||||
);
|
|
||||||
private static ConcurrentStack<BlueprintScheduler> blueprintInWaiting
|
|
||||||
= new ConcurrentStack<BlueprintScheduler>();
|
|
||||||
private static int _callingThread;
|
|
||||||
private static SemaphoreSlim bpLock = new SemaphoreSlim( 0, 1 );
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Only the fallowing occasions of calling are valid: 1. no bp is running or the only bp is
|
|
||||||
/// quitting. 2. calling from the main thread and the current running bp.
|
|
||||||
/// </summary>
|
|
||||||
internal static bool IsValidCalling
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if( ( NodeRunner.CurrentBlueprint == null ) || //no bp running at all
|
|
||||||
( ( blueprintInWaiting.IsEmpty ) && ( NodeRunner.CurrentBlueprint.IsRunning ==
|
|
||||||
false ) ) )
|
|
||||||
// a bp is quiting
|
|
||||||
{
|
|
||||||
//in case no bp is running
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
int? id = Task.CurrentId;
|
|
||||||
if( id is null ) {
|
|
||||||
// in case calling from main thread and current running bp
|
|
||||||
return _callingThread == Environment.CurrentManagedThreadId;
|
|
||||||
}
|
|
||||||
foreach( NodeRunner item in allAvailableTask ) {
|
|
||||||
if( item.Id == id ) {
|
|
||||||
//if calling from any bp running task
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Run( BlueprintScheduler blueprint )
|
|
||||||
{
|
|
||||||
//Console.WriteLine();
|
|
||||||
if( blueprint == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( blueprint.IsRunning ) {
|
|
||||||
throw new InvalidOperationException(
|
|
||||||
"Attempt to run a blueprint instance twice." );
|
|
||||||
}
|
|
||||||
if( IsValidCalling ) {
|
|
||||||
//Console.WriteLine("valid and run");
|
|
||||||
if( InterruptAndRunNewBp( blueprint ) ) {
|
|
||||||
while( InterruptAndRunNewBp( NodeRunner.CurrentBlueprint ) ) { }
|
|
||||||
;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bpLock.Wait();
|
|
||||||
if( InterruptAndRunNewBp( blueprint ) ) {
|
|
||||||
while( InterruptAndRunNewBp( NodeRunner.CurrentBlueprint ) ) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
bpLock.Release();
|
|
||||||
}
|
|
||||||
Interlocked.Exchange( ref _callingThread, -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SetMaxTaskCount( int size )
|
|
||||||
{
|
|
||||||
if( size < 1 ) {
|
|
||||||
size = 1;
|
|
||||||
}
|
|
||||||
if( allAvailableTask.Length >= size ) {
|
|
||||||
for( int i = size; i < allAvailableTask.Length; i++ ) {
|
|
||||||
if( allAvailableTask[ i ] != null ) {
|
|
||||||
allAvailableTask[ i ].Cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Array.Resize( ref allAvailableTask, size );
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Terminate()
|
|
||||||
{
|
|
||||||
cts.Cancel();
|
|
||||||
NodeRunner.CurrentBlueprint.Terminate();
|
|
||||||
foreach( NodeRunner task in allAvailableTask ) {
|
|
||||||
task.Cts.Cancel();
|
|
||||||
}
|
|
||||||
foreach( BlueprintScheduler bp in blueprintInWaiting ) {
|
|
||||||
bp.Terminate();
|
|
||||||
}
|
|
||||||
blueprintInWaiting.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static bool InterruptAndRunNewBp( BlueprintScheduler newBp )
|
|
||||||
{
|
|
||||||
Debug.Assert( newBp != null );
|
|
||||||
if( ( newBp != NodeRunner.CurrentBlueprint ) && ( NodeRunner.CurrentBlueprint !=
|
|
||||||
null ) ) {
|
|
||||||
//if a running bp exists
|
|
||||||
blueprintInWaiting.Push( NodeRunner.CurrentBlueprint );
|
|
||||||
}
|
|
||||||
|
|
||||||
//load new bp to current bp
|
|
||||||
Interlocked.Exchange( ref NodeRunner.CurrentBlueprint!, newBp );
|
|
||||||
Interlocked.Exchange(
|
|
||||||
ref _callingThread, Environment.CurrentManagedThreadId );
|
|
||||||
|
|
||||||
//run beginning node to init it first.
|
|
||||||
if( !NodeRunner.CurrentBlueprint.IsRunning ) {
|
|
||||||
( NodeRunner.CurrentBlueprint.BeginLayer as BeginningNode )!.Run(
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//refresh all tasks
|
|
||||||
for( int i = 0; i < allAvailableTask.Length; i++ ) {
|
|
||||||
NodeRunner item = allAvailableTask[ i ];
|
|
||||||
if( ( item is null ) || item.IsCompleted ) {
|
|
||||||
allAvailableTask[ i ] = NodeRunner.Run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BlueprintNode node;
|
|
||||||
while( !cts.Token.IsCancellationRequested && NodeRunner.CurrentBlueprint
|
|
||||||
.RequestNextNativeNode( out node ) ) {
|
|
||||||
node.Run();
|
|
||||||
if( !NodeRunner.CurrentBlueprint.IsRunning ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
( NodeRunner.CurrentBlueprint.EndLayer as EndingNode )!.Run();
|
|
||||||
return blueprintInWaiting.TryPeek( out NodeRunner.CurrentBlueprint );
|
|
||||||
}
|
|
||||||
|
|
||||||
private static NodeRunner[] CreateBlueprintRunnerArray()
|
|
||||||
{
|
|
||||||
int count = Environment.ProcessorCount;
|
|
||||||
return new NodeRunner[ count < 2 ? count : count - 2];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class NodeRunner : CancellableTask
|
|
||||||
{
|
|
||||||
|
|
||||||
private static BlueprintScheduler _current;
|
|
||||||
|
|
||||||
internal NodeRunner()
|
|
||||||
: base()
|
|
||||||
{
|
|
||||||
_startup = InternalRun;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static ref BlueprintScheduler CurrentBlueprint
|
|
||||||
{
|
|
||||||
get => ref _current;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static NodeRunner Run()
|
|
||||||
{
|
|
||||||
NodeRunner ret = new NodeRunner { _startup = InternalRun };
|
|
||||||
ret._internalTask = Task.Run( ret.InternalAction );
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void InternalRun( CancellationToken token )
|
|
||||||
{
|
|
||||||
//Console.WriteLine("Task Begin");
|
|
||||||
BlueprintNode item;
|
|
||||||
while( ( CurrentBlueprint != null ) && CurrentBlueprint.IsRunning && !token.IsCancellationRequested && CurrentBlueprint.RequestNexGlobalNode(
|
|
||||||
out item ) ) {
|
|
||||||
//Console.WriteLine($"Get node of {item.Name}, going to run.");
|
|
||||||
item.Run();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Console.WriteLine("Task Completed");
|
|
||||||
}
|
|
||||||
|
|
||||||
}//------------------------------------- End of Class ------------------------------------------
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="CrossFrameBlueprintNode.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.Blueprint;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public class CrossFrameOperation : IConvertableToBlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private static string[] _inputName = ["TaskIn"];
|
|
||||||
private static string[] _outputName = ["TaskOut"];
|
|
||||||
private Action _mainExecution;
|
|
||||||
private int currentCount;
|
|
||||||
private readonly int cycleCount;
|
|
||||||
|
|
||||||
public CrossFrameOperation( Action startup, int cycleCount )
|
|
||||||
{
|
|
||||||
MainExecution = startup;
|
|
||||||
this.cycleCount = ( cycleCount > 1 ) ?
|
|
||||||
cycleCount : throw new ArgumentException(
|
|
||||||
$"{$"The {typeof(CrossFrameOperation).Name} crosses only one cycle, "}{$"please use a {typeof(BlueprintNode).Name} instead."}" );
|
|
||||||
this.cycleCount = cycleCount;
|
|
||||||
currentCount = cycleCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action MainExecution
|
|
||||||
{
|
|
||||||
get => _mainExecution;
|
|
||||||
private protected set => _mainExecution = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlueprintNodeOperation Operation
|
|
||||||
{
|
|
||||||
get => ExecuteMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<string> InputInterfacesName => _inputName;
|
|
||||||
|
|
||||||
public IEnumerable<string> OutputInterfacesName => _outputName;
|
|
||||||
|
|
||||||
public void ExecuteMain(
|
|
||||||
in Dictionary<string, BlueprintPipeline> input,
|
|
||||||
in Dictionary<string, BlueprintPipeline> output )
|
|
||||||
{
|
|
||||||
if( currentCount < cycleCount ) {
|
|
||||||
Interlocked.Increment( ref currentCount );
|
|
||||||
} else {
|
|
||||||
Interlocked.Exchange( ref currentCount, 0 );
|
|
||||||
Task.Run( MainExecution );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Console.WriteLine(currentCount);
|
|
||||||
BlueprintPipeline.SkipAll( output );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="IConvertableToBlueprintNode.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public delegate void BlueprintNodeOperation(
|
|
||||||
in Dictionary<string, BlueprintPipeline> input,
|
|
||||||
in Dictionary<string, BlueprintPipeline> output );
|
|
||||||
|
|
||||||
public interface IConvertableToBlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
BlueprintNodeOperation Operation
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<string> InputInterfacesName
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<string> OutputInterfacesName
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class DefaultConvertableToBlueprintNode : IConvertableToBlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private string[] _input;
|
|
||||||
private string[] _output;
|
|
||||||
private BlueprintNodeOperation _execution;
|
|
||||||
|
|
||||||
public DefaultConvertableToBlueprintNode(
|
|
||||||
BlueprintNodeOperation execution,
|
|
||||||
string[] input,
|
|
||||||
string[] output )
|
|
||||||
{
|
|
||||||
_input = input;
|
|
||||||
_output = output;
|
|
||||||
_execution = execution;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlueprintNodeOperation Operation => _execution;
|
|
||||||
|
|
||||||
public IEnumerable<string> InputInterfacesName => _input;
|
|
||||||
|
|
||||||
public IEnumerable<string> OutputInterfacesName => _output;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="PipeLine.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Numerics;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Security.Authentication.ExtendedProtection;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public class BlueprintPipeline
|
|
||||||
{
|
|
||||||
|
|
||||||
private protected BlueprintNode after;
|
|
||||||
private protected BlueprintNode former;
|
|
||||||
private protected BlueprintPipelineArgs args;
|
|
||||||
private protected SemaphoreSlim formerCompleteSemaphore;
|
|
||||||
|
|
||||||
public BlueprintPipeline( BlueprintNode former, BlueprintNode after )
|
|
||||||
{
|
|
||||||
this.former = former;
|
|
||||||
this.after = after;
|
|
||||||
formerCompleteSemaphore = new SemaphoreSlim(
|
|
||||||
initialCount: 0, maxCount: 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlueprintNode After => after;
|
|
||||||
|
|
||||||
public BlueprintNode Former => former;
|
|
||||||
|
|
||||||
public BlueprintPipelineArgs Args
|
|
||||||
{
|
|
||||||
get => args;
|
|
||||||
set => args = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Level => former.Level;
|
|
||||||
|
|
||||||
public static void SkipAll(
|
|
||||||
Dictionary<string, BlueprintPipeline> ports )
|
|
||||||
{
|
|
||||||
if( ports == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach( KeyValuePair<string, BlueprintPipeline> item in ports ) {
|
|
||||||
if( item.Value != null ) {
|
|
||||||
item.Value.CompleteAndSkip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WaitAll(
|
|
||||||
Dictionary<string, BlueprintPipeline> ports )
|
|
||||||
{
|
|
||||||
if( ports == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach( KeyValuePair<string, BlueprintPipeline> item in ports ) {
|
|
||||||
if( item.Value != null ) {
|
|
||||||
item.Value.WaitForStart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void WaitForStart()
|
|
||||||
{
|
|
||||||
//Console.WriteLine($"Waiting \t{former.ContextName}\t->\t{after.ContextName}");
|
|
||||||
formerCompleteSemaphore.Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
~BlueprintPipeline()
|
|
||||||
{
|
|
||||||
formerCompleteSemaphore.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region pipline op
|
|
||||||
|
|
||||||
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
||||||
public void CompleteAndSkip()
|
|
||||||
{
|
|
||||||
//Console.WriteLine($"Complete\t{former.Name}\t->\t{after.Name}");
|
|
||||||
formerCompleteSemaphore.Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
||||||
public void CompleteAndWriteData( BlueprintPipelineArgs args )
|
|
||||||
{
|
|
||||||
this.args = args;
|
|
||||||
CompleteAndSkip();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class BlueprintPipelineArgs
|
|
||||||
{
|
|
||||||
public object? Value
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public object? ValueDefault
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class SealedBlueprintPiipeline:BlueprintPipeline
|
|
||||||
{
|
|
||||||
internal SealedBlueprintPiipeline(BlueprintNode former, BlueprintNode after):
|
|
||||||
base(former, after)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SealedBlueprintPiipeline SealOutput(BlueprintNode node, string portName)
|
|
||||||
{
|
|
||||||
return new SealedBlueprintPiipeline(node, BlueprintNode.Empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SealedBlueprintPiipeline SealInput(BlueprintNode node, string portName)
|
|
||||||
{
|
|
||||||
return new SealedBlueprintPiipeline(BlueprintNode.Empty, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed override void WaitForStart()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="RouteSwitch.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection.Emit;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
public class RouteSwitch : BlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private protected Dictionary<string, (BlueprintPipeline pipeline, Func<bool> openingRule)> outputDictionary;
|
|
||||||
|
|
||||||
public RouteSwitch( string name, bool isNative, string inputPorts )
|
|
||||||
: base(DefaultOperation, name, isNative, [inputPorts], [string.Empty] )
|
|
||||||
{
|
|
||||||
outputDictionary = new Dictionary<string, (BlueprintPipeline pipeline, Func<bool> openingRule)>(
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public new int Level
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if( _levelAvailable ) {
|
|
||||||
return _level;
|
|
||||||
}
|
|
||||||
_level = 0;
|
|
||||||
KeyValuePair<string, BlueprintPipeline> item = _inputInterfaces.First(
|
|
||||||
);
|
|
||||||
if( item.Value == null ) {
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
if( _level <= item.Value.Level ) {
|
|
||||||
_level = item.Value.Level;
|
|
||||||
}
|
|
||||||
return _level;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public new void AddBefore(
|
|
||||||
BlueprintNode after,
|
|
||||||
string thisOutputPortName,
|
|
||||||
string afterInputPortName )
|
|
||||||
{
|
|
||||||
this.AppendNode( after, afterInputPortName, () => true );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AppendNode(
|
|
||||||
BlueprintNode node,
|
|
||||||
string portName,
|
|
||||||
Func<bool> openningRule )
|
|
||||||
{
|
|
||||||
if( node == null ) {
|
|
||||||
throw new ArgumentNullException( nameof( node ) );
|
|
||||||
}
|
|
||||||
string indexName = $"{node.Name}.{portName}";
|
|
||||||
BlueprintPipeline p = new BlueprintPipeline( this, node );
|
|
||||||
node.InputInterfaces[ portName ] = p;
|
|
||||||
outputDictionary.Add( indexName, (p, openningRule) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public new void Run()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
BlueprintPipeline input = InputInterfaces.First().Value;
|
|
||||||
input.WaitForStart();
|
|
||||||
foreach( KeyValuePair<string, (BlueprintPipeline pipeline, Func<bool> openingRule)> item in outputDictionary ) {
|
|
||||||
if( item.Value.openingRule() ) {
|
|
||||||
item.Value.pipeline.CompleteAndWriteData( input.Args );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( Exception ) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="SideNode.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Blueprint
|
|
||||||
{
|
|
||||||
internal sealed class BeginningNode : BlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private BlueprintScheduler _bp;
|
|
||||||
|
|
||||||
public BeginningNode( BlueprintScheduler bp )
|
|
||||||
: base(
|
|
||||||
DefaultOperation, name: "BeginningNode", true, ["default"],
|
|
||||||
["default"] )
|
|
||||||
{
|
|
||||||
_bp = bp;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal (string name, BlueprintPipelineArgs arg)[] InputData
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if( value == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach( (string name, BlueprintPipelineArgs arg) parameter in value ) {
|
|
||||||
OutputInterfaces[ parameter.name ].Args = parameter.arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Run()
|
|
||||||
{
|
|
||||||
_bp.RunningStat.Wait();
|
|
||||||
BlueprintPipeline.SkipAll( _outputInterfaces );
|
|
||||||
}
|
|
||||||
|
|
||||||
public new void SetCertainOutputPort(
|
|
||||||
string name,
|
|
||||||
BlueprintPipeline pipeline )
|
|
||||||
{
|
|
||||||
if( _outputInterfaces.ContainsKey( name ) ) {
|
|
||||||
_outputInterfaces[ name ] = pipeline;
|
|
||||||
}
|
|
||||||
_outputInterfaces.Add( name, pipeline );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal sealed class EndingNode : BlueprintNode
|
|
||||||
{
|
|
||||||
|
|
||||||
private BlueprintScheduler _bp;
|
|
||||||
|
|
||||||
public EndingNode( BlueprintScheduler bp )
|
|
||||||
: base(
|
|
||||||
DefaultOperation, name: "EndingNode", true, ["default"],
|
|
||||||
["default"] )
|
|
||||||
{
|
|
||||||
_bp = bp;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal (string name, BlueprintPipelineArgs arg)[] OutputData
|
|
||||||
{
|
|
||||||
get { return InputInterfaces.Select(
|
|
||||||
key => (key.Key, key.Value.Args) )
|
|
||||||
.ToArray(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Run()
|
|
||||||
{
|
|
||||||
BlueprintPipeline.WaitAll( _inputInterfaces );
|
|
||||||
Interlocked.Exchange( ref _bp.currentGlobalNodeIndex, 0 );
|
|
||||||
Interlocked.Exchange( ref _bp.currentNativeNodeIndex, 0 );
|
|
||||||
_bp.RunningStat.Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
public new void SetCertainInputPort(
|
|
||||||
string name,
|
|
||||||
BlueprintPipeline pipeline )
|
|
||||||
{
|
|
||||||
if( _inputInterfaces.ContainsKey( name ) ) {
|
|
||||||
_inputInterfaces[ name ] = pipeline;
|
|
||||||
}
|
|
||||||
_inputInterfaces.Add( name, pipeline );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Counter.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace StgSharp
|
|
||||||
{
|
|
||||||
public class Counter<T>
|
|
||||||
where T: struct, IConvertible, IFormattable, IComparable
|
|
||||||
#if NET8_OR_GREATER
|
|
||||||
,INumber
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
internal dynamic _value;
|
|
||||||
|
|
||||||
internal readonly T _defualtIncreament;
|
|
||||||
internal readonly T _defualtDecreament;
|
|
||||||
internal readonly T _defaultValue;
|
|
||||||
|
|
||||||
public Counter( T defualtValue, T defualtIncreament, T defualtDecreament )
|
|
||||||
{
|
|
||||||
Type tType = typeof( T );
|
|
||||||
if (
|
|
||||||
tType != typeof(byte) &&
|
|
||||||
tType != typeof(short) &&
|
|
||||||
tType != typeof(int) &&
|
|
||||||
tType != typeof(long) &&
|
|
||||||
tType != typeof(sbyte) &&
|
|
||||||
tType != typeof(ushort) &&
|
|
||||||
tType != typeof(uint) &&
|
|
||||||
tType != typeof(ulong) &&
|
|
||||||
tType != typeof(float) &&
|
|
||||||
tType != typeof(double))
|
|
||||||
{
|
|
||||||
throw new ArgumentException(
|
|
||||||
"Input is not number value type");
|
|
||||||
}
|
|
||||||
|
|
||||||
_value = defualtValue;
|
|
||||||
_defaultValue = defualtValue;
|
|
||||||
_defualtIncreament = defualtIncreament;
|
|
||||||
_defualtDecreament = defualtDecreament;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T DecreamentSoan => _defualtDecreament;
|
|
||||||
|
|
||||||
public T IncreamentSpan => _defualtIncreament;
|
|
||||||
|
|
||||||
public T CurrentSpan => _value - _defaultValue;
|
|
||||||
|
|
||||||
public T Value
|
|
||||||
{
|
|
||||||
get => _value;
|
|
||||||
set => _value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add( T value )
|
|
||||||
{
|
|
||||||
_value += value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void QuickAdd()
|
|
||||||
{
|
|
||||||
_value += _defualtIncreament;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void QuickSub()
|
|
||||||
{
|
|
||||||
_value -= _defualtDecreament;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
_value = _defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Sub( T value )
|
|
||||||
{
|
|
||||||
_value -= value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return Value.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Counter<T> operator --( Counter<T> counter )
|
|
||||||
{
|
|
||||||
counter.QuickSub();
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Counter<T> operator ++( Counter<T> counter )
|
|
||||||
{
|
|
||||||
counter.QuickAdd();
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static implicit operator T( Counter<T> counter )
|
|
||||||
{
|
|
||||||
return counter.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="PlainGeometryCollisionSensor.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.Geometries;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace StgSharp
|
|
||||||
{
|
|
||||||
public class CollisionEventArgs:EventArgs
|
|
||||||
{
|
|
||||||
public CollisionEventArgs(IGeometry target, IGeometry boarder)
|
|
||||||
{
|
|
||||||
Target = target;
|
|
||||||
Boarder = boarder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IGeometry Target { get; set; }
|
|
||||||
public IGeometry Boarder { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PlainGeometryCollisionSensor<TBoarder,TTarget>
|
|
||||||
where TBoarder : IGeometry
|
|
||||||
where TTarget : IGeometry
|
|
||||||
{
|
|
||||||
internal PlainGeometry _boarder;
|
|
||||||
internal PlainGeometry _target;
|
|
||||||
internal EventHandler<CollisionEventArgs> _rule;
|
|
||||||
|
|
||||||
public event EventHandler<CollisionEventArgs> Rule
|
|
||||||
{
|
|
||||||
add { _rule += value; }
|
|
||||||
remove
|
|
||||||
{
|
|
||||||
if (value == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#pragma warning disable CS8601
|
|
||||||
_rule -= value;
|
|
||||||
#pragma warning restore CS8601
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public PlainGeometry boarder => _boarder;
|
|
||||||
|
|
||||||
public PlainGeometry target
|
|
||||||
{
|
|
||||||
get => _target;
|
|
||||||
set => _target = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="StateMachine.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp
|
|
||||||
{
|
|
||||||
public interface IStateMachine<T> where T: Enum
|
|
||||||
{
|
|
||||||
|
|
||||||
public T LastStableState
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryEnterState();
|
|
||||||
|
|
||||||
public bool TryExitState();
|
|
||||||
|
|
||||||
public bool TrySwitchState();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IStateMachineWithSwitchSpan<TState, TSpan> : IStateMachine<TState>
|
|
||||||
where TState: Enum
|
|
||||||
{
|
|
||||||
|
|
||||||
public bool IsInStabelState
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TState NextStableState
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TrySwitchState();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="TimeFunction.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Timing
|
|
||||||
{
|
|
||||||
public class TimeFunction
|
|
||||||
{
|
|
||||||
|
|
||||||
private float _beginning, _ending;
|
|
||||||
private Func<float, float> _timeRelatedCalculation;
|
|
||||||
private TimeSpanProvider _timeProvider;
|
|
||||||
|
|
||||||
internal TimeFunction() { }
|
|
||||||
|
|
||||||
public TimeFunction(
|
|
||||||
TimeSpanProvider timeSpanProvider,
|
|
||||||
Func<float, float> timeRelatedCalculation,
|
|
||||||
float range )
|
|
||||||
{
|
|
||||||
_timeProvider = timeSpanProvider;
|
|
||||||
_timeRelatedCalculation = timeRelatedCalculation;
|
|
||||||
if( timeSpanProvider == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_beginning = _timeProvider.CurrentSecond;
|
|
||||||
_ending = _timeProvider.CurrentSecond + range;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool IsComplete
|
|
||||||
{
|
|
||||||
get => _timeProvider.CurrentSecond > _ending;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Func<float, float> TimeRelatedCalculation
|
|
||||||
{
|
|
||||||
get { return _timeRelatedCalculation; }
|
|
||||||
set { _timeRelatedCalculation = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TimeFunction One
|
|
||||||
{
|
|
||||||
get => new TimeFunctionOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
public TimeSpanProvider TimeSpanProvider
|
|
||||||
{
|
|
||||||
get { return _timeProvider; }
|
|
||||||
set { _timeProvider = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual float Calculate()
|
|
||||||
{
|
|
||||||
if( _timeProvider.CurrentSecond < _ending ) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return _timeRelatedCalculation(
|
|
||||||
_timeProvider.CurrentSecond - _beginning );
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TimeFunction Proportional(
|
|
||||||
TimeSpanProvider time,
|
|
||||||
float begin,
|
|
||||||
float range )
|
|
||||||
{
|
|
||||||
return new TimeFunction( time, ( float t ) => t + begin, range );
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual TimeFunction Renew(
|
|
||||||
(Func<float, float> func, float range) funcPair )
|
|
||||||
{
|
|
||||||
return new TimeFunction(
|
|
||||||
_timeProvider, funcPair.func, funcPair.range );
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual TimeFunction Renew(
|
|
||||||
Func<float, float> func,
|
|
||||||
float range )
|
|
||||||
{
|
|
||||||
return new TimeFunction( _timeProvider, func, range );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
float range = _ending - _beginning;
|
|
||||||
_beginning = _timeProvider.CurrentSecond;
|
|
||||||
_ending = _beginning + range;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual TimeFunction Reverse()
|
|
||||||
{
|
|
||||||
float range = _ending - _beginning;
|
|
||||||
return new TimeFunction(
|
|
||||||
_timeProvider, p => _timeRelatedCalculation( range - p ),
|
|
||||||
range );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class TimeFunctionOne : TimeFunction
|
|
||||||
{
|
|
||||||
|
|
||||||
internal TimeFunctionOne() : base() { }
|
|
||||||
|
|
||||||
public override bool IsComplete
|
|
||||||
{
|
|
||||||
get => true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float Calculate()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override TimeFunction Renew(
|
|
||||||
(Func<float, float> func, float range) funcPair )
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override TimeFunction Renew(
|
|
||||||
Func<float, float> func,
|
|
||||||
float range )
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma warning disable CA1822
|
|
||||||
public new void Reset()
|
|
||||||
#pragma warning restore CA1822
|
|
||||||
{ }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="TimeProvider.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
using StgSharp.Timing;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace StgSharp
|
|
||||||
{
|
|
||||||
public static partial class StgSharp
|
|
||||||
{
|
|
||||||
|
|
||||||
internal static StgSharpTime mainTimeProvider = new StgSharpTime();
|
|
||||||
|
|
||||||
internal static TimeSourceProviderBase MainTimeProvider => mainTimeProvider;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class StgSharpTime : TimeSourceProviderBase
|
|
||||||
{
|
|
||||||
|
|
||||||
private static List<TimeSpanProvider> subscriberList = new List<TimeSpanProvider>(
|
|
||||||
);
|
|
||||||
private static long accuracy;
|
|
||||||
private static Stopwatch mainProvider = new Stopwatch();
|
|
||||||
private static Thread timeProvideThread;
|
|
||||||
|
|
||||||
internal StgSharpTime() { }
|
|
||||||
|
|
||||||
public static TimeSourceProviderBase OnlyInstance => StgSharp.MainTimeProvider;
|
|
||||||
|
|
||||||
public override sealed void StartProvidingTime()
|
|
||||||
{
|
|
||||||
if( mainProvider.IsRunning ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mainProvider.Start();
|
|
||||||
|
|
||||||
//speed test
|
|
||||||
long totalMS, internalFrequncy = Stopwatch.Frequency;
|
|
||||||
for( int i = 0; i < 100; i++ ) {
|
|
||||||
totalMS = mainProvider.ElapsedTicks / ( internalFrequncy / ( 1000L * 1000L ) );
|
|
||||||
for( int t = 0; t < 10; t++ ) {
|
|
||||||
if( totalMS < 1000 ) {
|
|
||||||
subscriberList.Add(
|
|
||||||
new TimeSpanProvider(
|
|
||||||
100L, TimeSpanProvider.DefaultProvider ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mainProvider.Stop();
|
|
||||||
subscriberList.Clear();
|
|
||||||
totalMS = mainProvider.ElapsedTicks / ( internalFrequncy / ( 1000L * 1000L ) ) / 100L;
|
|
||||||
accuracy = ( totalMS * 2 ) / 3;
|
|
||||||
mainProvider.Reset();
|
|
||||||
timeProvideThread = new Thread( new ThreadStart( ProvideTime ) );
|
|
||||||
timeProvideThread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void StopProvidingTime()
|
|
||||||
{
|
|
||||||
lock( mainProvider ) {
|
|
||||||
mainProvider.Stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Terminate()
|
|
||||||
{
|
|
||||||
lock( mainProvider ) {
|
|
||||||
mainProvider.Stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override sealed void AddSubscriberUnsynced(
|
|
||||||
TimeSpanProvider subscriber )
|
|
||||||
{
|
|
||||||
subscriberList.Add( subscriber );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override sealed void RemoveSubscriberUnsynced(
|
|
||||||
TimeSpanProvider subscriber )
|
|
||||||
{
|
|
||||||
subscriberList.Remove( subscriber );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ProvideTime()
|
|
||||||
{
|
|
||||||
long totalMS, internalFrequncy = Stopwatch.Frequency;
|
|
||||||
lock( mainProvider ) {
|
|
||||||
mainProvider.Restart();
|
|
||||||
}
|
|
||||||
while( mainProvider.IsRunning ) {
|
|
||||||
totalMS = mainProvider.ElapsedTicks / ( internalFrequncy / ( 1000L * 1000L ) );
|
|
||||||
if( subscriberList.Count == 0 ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
CheckSubscriberSemaphore.Wait();
|
|
||||||
List<TimeSpanProvider> toRemoveList = new List<TimeSpanProvider>(
|
|
||||||
);
|
|
||||||
foreach( TimeSpanProvider subscriber in subscriberList ) {
|
|
||||||
if( !subscriber.CheckTime( totalMS ) ) {
|
|
||||||
toRemoveList.Add( subscriber );
|
|
||||||
InternalIO.InternalWriteLog(
|
|
||||||
$"Time subscriber {subscriber} is to be removed.",
|
|
||||||
LogType.Info );
|
|
||||||
}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
if( toRemoveList.Count != 0 ) {
|
|
||||||
foreach( TimeSpanProvider subscriber in toRemoveList ) {
|
|
||||||
subscriberList.Remove( subscriber );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CheckSubscriberSemaphore.Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="TimeSourceProvider.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace StgSharp.Timing
|
|
||||||
{
|
|
||||||
public abstract class TimeSourceProviderBase
|
|
||||||
{
|
|
||||||
|
|
||||||
private SemaphoreSlim _addSubscriberSemaphore = new SemaphoreSlim(
|
|
||||||
1, 1 );
|
|
||||||
|
|
||||||
protected SemaphoreSlim CheckSubscriberSemaphore
|
|
||||||
{
|
|
||||||
get => _addSubscriberSemaphore;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddSubscriber( TimeSpanProvider subscriber )
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
_addSubscriberSemaphore.Wait();
|
|
||||||
AddSubscriberUnsynced( subscriber );
|
|
||||||
}
|
|
||||||
catch( Exception ) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
_addSubscriberSemaphore.Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemoveSubscriber( TimeSpanProvider subscriber )
|
|
||||||
{
|
|
||||||
_addSubscriberSemaphore.Wait();
|
|
||||||
try {
|
|
||||||
RemoveSubscriberUnsynced( subscriber );
|
|
||||||
}
|
|
||||||
catch( Exception ) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
_addSubscriberSemaphore.Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void StartProvidingTime();
|
|
||||||
|
|
||||||
public abstract void StopProvidingTime();
|
|
||||||
|
|
||||||
protected abstract void AddSubscriberUnsynced(
|
|
||||||
TimeSpanProvider subscriber );
|
|
||||||
|
|
||||||
protected abstract void RemoveSubscriberUnsynced(
|
|
||||||
TimeSpanProvider subscriber );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="TimeSpanAwaitingToken.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics.Contracts;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Timing
|
|
||||||
{
|
|
||||||
#nullable enable
|
|
||||||
|
|
||||||
public sealed class TimeSpanAwaitingToken : IDisposable
|
|
||||||
{
|
|
||||||
|
|
||||||
private static readonly ConcurrentStack<int> s_unusedID = new ConcurrentStack<int>(
|
|
||||||
[0] );
|
|
||||||
private static int s_maxID;
|
|
||||||
private static readonly object s_lock = new object();
|
|
||||||
|
|
||||||
private EventHandler? _refreshHandler,_missHandler;
|
|
||||||
private int _size, _id;
|
|
||||||
|
|
||||||
private object _participantObject = new object();
|
|
||||||
private SemaphoreSlim _awaitingSemaphore;
|
|
||||||
|
|
||||||
private TimeSpanProvider _provider;
|
|
||||||
|
|
||||||
internal TimeSpanAwaitingToken( TimeSpanProvider provider )
|
|
||||||
{
|
|
||||||
if( s_unusedID.Count == 1 ) {
|
|
||||||
lock( s_lock ) {
|
|
||||||
s_unusedID.TryPop( out int id );
|
|
||||||
TokenID = id;
|
|
||||||
s_unusedID.Push( s_maxID++ );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s_unusedID.TryPop( out int id );
|
|
||||||
TokenID = id;
|
|
||||||
}
|
|
||||||
_provider = provider;
|
|
||||||
_size = 1;
|
|
||||||
_awaitingSemaphore = new SemaphoreSlim( 0, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
internal TimeSpanAwaitingToken( TimeSpanProvider provider, int count )
|
|
||||||
{
|
|
||||||
if( s_unusedID.Count == 1 ) {
|
|
||||||
lock( s_lock ) {
|
|
||||||
s_unusedID.TryPop( out int id );
|
|
||||||
TokenID = id;
|
|
||||||
s_unusedID.Push( s_maxID++ );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s_unusedID.TryPop( out int id );
|
|
||||||
TokenID = id;
|
|
||||||
}
|
|
||||||
_provider = provider;
|
|
||||||
_size = count;
|
|
||||||
_awaitingSemaphore = new SemaphoreSlim( 0, _size );
|
|
||||||
}
|
|
||||||
|
|
||||||
public event EventHandler MissTimeSpanRefreshed
|
|
||||||
{
|
|
||||||
add { _missHandler += value; }
|
|
||||||
remove { _missHandler -= value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public event EventHandler TimeSpanRefreshed
|
|
||||||
{
|
|
||||||
add { _refreshHandler += value; }
|
|
||||||
remove { _refreshHandler -= value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int TokenID
|
|
||||||
{
|
|
||||||
get => _id;
|
|
||||||
private set => _id = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal SemaphoreSlim AwaitingSemaphoreSlim
|
|
||||||
{
|
|
||||||
get => _awaitingSemaphore;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_provider.QuitSpanAwaiting( this );
|
|
||||||
s_unusedID.Push( TokenID );
|
|
||||||
_awaitingSemaphore.Dispose();
|
|
||||||
GC.SuppressFinalize( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int GetHashCode()
|
|
||||||
{
|
|
||||||
return _id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Participant()
|
|
||||||
{
|
|
||||||
lock( _participantObject ) {
|
|
||||||
_size++;
|
|
||||||
SemaphoreSlim newSemaphore = new SemaphoreSlim(
|
|
||||||
_awaitingSemaphore.CurrentCount, _size );
|
|
||||||
Interlocked.Exchange( ref _awaitingSemaphore, newSemaphore )
|
|
||||||
.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WaitNextSpan()
|
|
||||||
{
|
|
||||||
_awaitingSemaphore.Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void MissRefresh()
|
|
||||||
{
|
|
||||||
_missHandler?.Invoke( this, EventArgs.Empty );
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
||||||
internal void Refresh()
|
|
||||||
{
|
|
||||||
_refreshHandler?.Invoke( this, EventArgs.Empty );
|
|
||||||
}
|
|
||||||
|
|
||||||
~TimeSpanAwaitingToken()
|
|
||||||
{
|
|
||||||
Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#nullable restore
|
|
||||||
}
|
|
||||||
@@ -1,233 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="TimeSpanProvider.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace StgSharp.Timing
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A microsecond-accuracy timer. It will refresh every a certain time span.
|
|
||||||
/// </summary>
|
|
||||||
public class TimeSpanProvider
|
|
||||||
{
|
|
||||||
|
|
||||||
private bool _subscribed;
|
|
||||||
|
|
||||||
private ConcurrentQueue<TimeSpanAwaitingToken> _tokenToAdd = new ConcurrentQueue<TimeSpanAwaitingToken>(
|
|
||||||
);
|
|
||||||
private ConcurrentQueue<TimeSpanAwaitingToken> _tokenToQuit;
|
|
||||||
private Counter<int> timeSpanCount = new Counter<int>( -1, 1, 1 );
|
|
||||||
private HashSet<TimeSpanAwaitingToken> _awaitingTokens;
|
|
||||||
private long _maxSpanCount;
|
|
||||||
private long _spanBegin;
|
|
||||||
private readonly long _spanLength;
|
|
||||||
private readonly TimeSourceProviderBase _timeSource;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new <see cref="TimeSpanProvider" /> and define the length of time span. Length
|
|
||||||
/// of a single time span is defined in microseconds.
|
|
||||||
/// </summary>
|
|
||||||
/// <param _name="spanMicroSeconds"></param>
|
|
||||||
/// <param _name="provider"></param>
|
|
||||||
public TimeSpanProvider(
|
|
||||||
long spanMicroSeconds,
|
|
||||||
TimeSourceProviderBase provider )
|
|
||||||
{
|
|
||||||
if( provider == null ) {
|
|
||||||
throw new ArgumentNullException( nameof( provider ) );
|
|
||||||
}
|
|
||||||
_timeSource = provider;
|
|
||||||
_spanLength = spanMicroSeconds;
|
|
||||||
_maxSpanCount = int.MaxValue;
|
|
||||||
provider.AddSubscriber( this );
|
|
||||||
_subscribed = true;
|
|
||||||
_awaitingTokens = new HashSet<TimeSpanAwaitingToken>();
|
|
||||||
_tokenToQuit = new ConcurrentQueue<TimeSpanAwaitingToken>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new <see cref="TimeSpanProvider" /> and define the length of time span. Length
|
|
||||||
/// of a single time span is defined in seconds.
|
|
||||||
/// </summary>
|
|
||||||
/// <param _name="spanSeconds"></param>
|
|
||||||
/// <param _name="provider"></param>
|
|
||||||
public TimeSpanProvider(
|
|
||||||
double spanSeconds,
|
|
||||||
TimeSourceProviderBase provider )
|
|
||||||
{
|
|
||||||
if( provider == null ) {
|
|
||||||
throw new ArgumentNullException( nameof( provider ) );
|
|
||||||
}
|
|
||||||
_timeSource = provider;
|
|
||||||
_spanLength = ( long )( spanSeconds * 1000L * 1000L );
|
|
||||||
_spanBegin = -_spanLength;
|
|
||||||
_maxSpanCount = long.MaxValue;
|
|
||||||
provider.AddSubscriber( this );
|
|
||||||
_subscribed = true;
|
|
||||||
_awaitingTokens = new HashSet<TimeSpanAwaitingToken>();
|
|
||||||
_tokenToQuit = new ConcurrentQueue<TimeSpanAwaitingToken>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new <see cref="TimeSpanProvider" /> and define the length of time span. Length
|
|
||||||
/// of a single time span is defined in microseconds.
|
|
||||||
/// </summary>
|
|
||||||
/// <param _name="spanLength"></param>
|
|
||||||
/// <param _name="maxSpan"></param>
|
|
||||||
/// <param _name="provider"></param>
|
|
||||||
public TimeSpanProvider(
|
|
||||||
long spanLength,
|
|
||||||
long maxSpan,
|
|
||||||
TimeSourceProviderBase provider )
|
|
||||||
{
|
|
||||||
if( provider == null ) {
|
|
||||||
throw new ArgumentNullException( nameof( provider ) );
|
|
||||||
}
|
|
||||||
if( maxSpan <= 0 ) {
|
|
||||||
throw new ArgumentException(
|
|
||||||
"Sapn count cannot be smaller than zero" );
|
|
||||||
}
|
|
||||||
_timeSource = provider;
|
|
||||||
_spanLength = spanLength;
|
|
||||||
_spanBegin = -_spanLength;
|
|
||||||
provider.AddSubscriber( this );
|
|
||||||
_subscribed = true;
|
|
||||||
_awaitingTokens = new HashSet<TimeSpanAwaitingToken>();
|
|
||||||
_tokenToQuit = new ConcurrentQueue<TimeSpanAwaitingToken>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public double SpanLength
|
|
||||||
{
|
|
||||||
get => ( _spanLength * 1.0 ) / ( 1000L * 1000L );
|
|
||||||
}
|
|
||||||
|
|
||||||
public float CurrentSecond
|
|
||||||
{
|
|
||||||
get => timeSpanCount.Value * SpanLengthLowPrecession;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float SpanLengthLowPrecession
|
|
||||||
{
|
|
||||||
get => ( _spanLength * 1.0f ) / ( 1000 * 1000 );
|
|
||||||
}
|
|
||||||
|
|
||||||
public int CurrentSpan
|
|
||||||
{
|
|
||||||
get => timeSpanCount.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Time source provider provided in <see cref="StgSharp" /> internal framework.
|
|
||||||
/// </summary>
|
|
||||||
public static TimeSourceProviderBase DefaultProvider => StgSharpTime.OnlyInstance;
|
|
||||||
|
|
||||||
public TimeSpanAwaitingToken ParticipantSpanAwaiting( int count )
|
|
||||||
{
|
|
||||||
TimeSpanAwaitingToken token = new TimeSpanAwaitingToken(
|
|
||||||
this, count );
|
|
||||||
_tokenToAdd.Enqueue( token );
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void QuitSpanAwaiting( TimeSpanAwaitingToken token )
|
|
||||||
{
|
|
||||||
_tokenToQuit.Enqueue( token );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void StopSpanProviding()
|
|
||||||
{
|
|
||||||
Interlocked.Exchange( ref _maxSpanCount, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SubscribeToTimeSource(
|
|
||||||
TimeSourceProviderBase serviceHandler )
|
|
||||||
{
|
|
||||||
if( serviceHandler == null ) {
|
|
||||||
throw new ArgumentNullException( nameof( serviceHandler ) );
|
|
||||||
}
|
|
||||||
if( _subscribed ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_subscribed = true;
|
|
||||||
serviceHandler.AddSubscriber( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
public int ToInt32()
|
|
||||||
{
|
|
||||||
return timeSpanCount.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal bool CheckTime( long microseconds )
|
|
||||||
{
|
|
||||||
if( microseconds - _spanBegin < _spanLength ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
while( !_tokenToAdd.IsEmpty ) {
|
|
||||||
_tokenToAdd.TryDequeue( out TimeSpanAwaitingToken tokenAdd );
|
|
||||||
_awaitingTokens.Add( tokenAdd );
|
|
||||||
}
|
|
||||||
while( !_tokenToQuit.IsEmpty ) {
|
|
||||||
_tokenToQuit.TryDequeue( out TimeSpanAwaitingToken tokenQuit );
|
|
||||||
_awaitingTokens.Remove( tokenQuit );
|
|
||||||
InternalIO.InternalWriteLog(
|
|
||||||
$"Awaiting token {tokenQuit!.TokenID} has been removed.",
|
|
||||||
LogType.Info );
|
|
||||||
}
|
|
||||||
|
|
||||||
_spanBegin = microseconds;
|
|
||||||
timeSpanCount++;
|
|
||||||
|
|
||||||
foreach( TimeSpanAwaitingToken item in _awaitingTokens ) {
|
|
||||||
if( item.AwaitingSemaphoreSlim.CurrentCount == 0 ) {
|
|
||||||
item.AwaitingSemaphoreSlim.Release();
|
|
||||||
item.Refresh();
|
|
||||||
} else {
|
|
||||||
item.MissRefresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeSpanCount < _maxSpanCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static explicit operator int(
|
|
||||||
[NotNull]TimeSpanProvider provider )
|
|
||||||
{
|
|
||||||
return provider.ToInt32();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,313 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Camera.cs"
|
|
||||||
// Project: StepVisualizer
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.Graphics;
|
|
||||||
using StgSharp.Graphics.OpenGL;
|
|
||||||
using StgSharp.Graphics.ShaderEdit;
|
|
||||||
using StgSharp.Math;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Numerics;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace StgSharp.Graphics
|
|
||||||
{
|
|
||||||
public sealed class Camera : IglConvertable
|
|
||||||
{
|
|
||||||
|
|
||||||
private bool _isLookAtAvailable;
|
|
||||||
internal Matrix44 _lookAt;
|
|
||||||
internal Matrix44 _projection;
|
|
||||||
internal Matrix44 cameraAtt;
|
|
||||||
internal Matrix44 rotation;
|
|
||||||
internal Matrix44 rotationAtt;
|
|
||||||
internal Radius _pitch;
|
|
||||||
internal Radius _row;
|
|
||||||
internal Radius _yaw;
|
|
||||||
internal Uniform<Matrix44> convertedUniform;
|
|
||||||
internal Vec3 _target, up;
|
|
||||||
|
|
||||||
public Camera()
|
|
||||||
{
|
|
||||||
cameraAtt = Matrix44.Unit;
|
|
||||||
_target = Vec3.Zero;
|
|
||||||
up = Vec3.Zero;
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
_lookAt = Matrix44.Unit;
|
|
||||||
rotationAtt = Matrix44.Unit;
|
|
||||||
_projection = new Matrix44();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Camera( Vec3 position, Vec3 target, Vec3 up )
|
|
||||||
: this()
|
|
||||||
{
|
|
||||||
rotationAtt = Matrix44.Unit;
|
|
||||||
cameraAtt = new Matrix44();
|
|
||||||
SetViewDirection( position, target, up );
|
|
||||||
_pitch = Radius.Zero;
|
|
||||||
_row = Radius.Zero;
|
|
||||||
_yaw = Radius.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Matrix44 Projection => _projection;
|
|
||||||
|
|
||||||
public Matrix44 View
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if( _isLookAtAvailable ) {
|
|
||||||
return _lookAt;
|
|
||||||
}
|
|
||||||
Matrix44 move = Matrix44.Unit;
|
|
||||||
move.colum3.vec -= cameraAtt.colum3.vec;
|
|
||||||
_lookAt = rotationAtt.Transpose * move;
|
|
||||||
_isLookAtAvailable = true;
|
|
||||||
return _lookAt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Matrix44 CameraMatrix()
|
|
||||||
{
|
|
||||||
return Projection * View;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DisplayGLtypeDefinition()
|
|
||||||
{
|
|
||||||
Console.WriteLine( "uniform matrix4x4 cameraName;" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get all uniform related to this <see cref="Camera" />.
|
|
||||||
/// </summary>
|
|
||||||
/// <param _label="source">
|
|
||||||
/// Shader program requires this camera.
|
|
||||||
/// </param>
|
|
||||||
/// <param _label="uniformName">
|
|
||||||
/// ContextName of all related uniforms. If you fallow form from <see
|
|
||||||
/// cref="IglConvertable.DisplayGLtypeDefinition" />
|
|
||||||
/// </param>
|
|
||||||
/// <exception cref="ArgumentException">
|
|
||||||
///
|
|
||||||
/// </exception>
|
|
||||||
public unsafe void GainAllUniforms( ShaderProgram source, params string[] uniformName )
|
|
||||||
{
|
|
||||||
if( uniformName is null || uniformName.Length != 1 ) {
|
|
||||||
throw new ArgumentException(
|
|
||||||
"Camera needs exactly one uniform.", nameof( uniformName ) );
|
|
||||||
}
|
|
||||||
convertedUniform = source.GetUniform<Matrix44>( uniformName[ 0 ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MoveNear( float distance )
|
|
||||||
{
|
|
||||||
cameraAtt.colum3.Z -= distance;
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MoveRight( float distance )
|
|
||||||
{
|
|
||||||
cameraAtt.colum3.X -= distance;
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MoveUp( float distance )
|
|
||||||
{
|
|
||||||
cameraAtt.colum3.Y -= distance;
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public unsafe void SetAllUniforms()
|
|
||||||
{
|
|
||||||
//Console.WriteLine(Projection * ViewBase);
|
|
||||||
OpenGL.OpenGLFunction.CurrentGL.SetUniformValue( convertedUniform, Projection * View );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetViewDirection( Vec3 position, Vec3 target, Vec3 up )
|
|
||||||
{
|
|
||||||
Vec3 direction = position - target;
|
|
||||||
if( ( position.reg == cameraAtt.colum3.reg ) &&
|
|
||||||
( this.up == up ) &&
|
|
||||||
( cameraAtt.colum2.reg == direction.reg ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( direction.GetLength() == 0 )
|
|
||||||
{
|
|
||||||
//deadlock
|
|
||||||
throw new ArgumentException();
|
|
||||||
}
|
|
||||||
if( Vec3.IsParallel( direction, up ) ) {
|
|
||||||
throw new ArgumentException();
|
|
||||||
}
|
|
||||||
_target = direction;
|
|
||||||
this.up = up;
|
|
||||||
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
|
|
||||||
Linear.Orthogonalize( ref direction, ref up );
|
|
||||||
|
|
||||||
Vec3 right = Linear.Orthogonalize( Linear.Cross( up, direction ) );
|
|
||||||
|
|
||||||
cameraAtt.colum0.reg = right.reg;
|
|
||||||
cameraAtt.colum1.reg = up.reg;
|
|
||||||
cameraAtt.colum2.reg = direction.reg;
|
|
||||||
cameraAtt.colum3.reg = position.reg;
|
|
||||||
|
|
||||||
InternalPitch();
|
|
||||||
InternalRow();
|
|
||||||
InternalYaw();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetViewRange(
|
|
||||||
Radius fovRadius,
|
|
||||||
Vec2 size,
|
|
||||||
Vec2 offset,
|
|
||||||
(float front, float back) dephRange )
|
|
||||||
{
|
|
||||||
float
|
|
||||||
distance = _target.GetLength(),
|
|
||||||
near = distance - dephRange.front,
|
|
||||||
far = distance + dephRange.back,
|
|
||||||
offsetX = offset.X,
|
|
||||||
offsetY = offset.Y,
|
|
||||||
width = Scaler.Abs( GeometryScaler.Tan( fovRadius / 2 ) * near * 2 ),
|
|
||||||
height = ( width * size.Y ) / size.X;
|
|
||||||
|
|
||||||
_projection.colum0.X = ( 2 * near ) / width;
|
|
||||||
_projection.colum1.Y = ( 2 * near ) / height;
|
|
||||||
_projection.colum2.X = ( 2 * offsetX ) / width;
|
|
||||||
_projection.colum2.Y = ( 2 * offsetY ) / height;
|
|
||||||
_projection.colum2.Z = ( far + near ) / ( near - far );
|
|
||||||
_projection.colum2.W = -1;
|
|
||||||
_projection.colum3.Z = ( 2 * near * far ) / ( near - far );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Test( params Vec4[] vec )
|
|
||||||
{
|
|
||||||
Console.WriteLine( View );
|
|
||||||
Console.WriteLine( Projection );
|
|
||||||
Console.WriteLine( Projection * View );
|
|
||||||
Console.WriteLine( View );
|
|
||||||
foreach( Vec4 item in vec ) {
|
|
||||||
Console.Write( $"{Projection * View * item};" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderStruct IglConvertable.GetConvertedGLtype()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
~Camera() { }
|
|
||||||
|
|
||||||
#region rotation
|
|
||||||
|
|
||||||
public void Yaw( Radius r )
|
|
||||||
{
|
|
||||||
_yaw -= r;
|
|
||||||
|
|
||||||
//Console.WriteLine(_yaw._radius);
|
|
||||||
//Console.WriteLine(rotationAtt);
|
|
||||||
InternalYaw();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Pitch( Radius r )
|
|
||||||
{
|
|
||||||
_pitch -= r;
|
|
||||||
|
|
||||||
//Console.WriteLine(_pitch._radius);
|
|
||||||
//Console.WriteLine(rotationAtt);
|
|
||||||
InternalPitch();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Row( Radius r )
|
|
||||||
{
|
|
||||||
_row -= r;
|
|
||||||
|
|
||||||
//Console.WriteLine(_row._radius);
|
|
||||||
//Console.WriteLine(rotationAtt);
|
|
||||||
InternalRow();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void InternalPitch()
|
|
||||||
{
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
|
|
||||||
Matrix32 partialCoord = new Matrix32( cameraAtt.colum1.vec, cameraAtt.colum2.vec );
|
|
||||||
float angle = _pitch._radius;
|
|
||||||
|
|
||||||
Matrix22 rotation = new Matrix22(
|
|
||||||
Scaler.Cos( angle ), -Scaler.Sin( angle ), Scaler.Sin( angle ),
|
|
||||||
Scaler.Cos( angle ) );
|
|
||||||
|
|
||||||
partialCoord *= rotation;
|
|
||||||
rotationAtt.colum1.reg = partialCoord.colum0.reg;
|
|
||||||
rotationAtt.colum2.reg = partialCoord.colum1.reg;
|
|
||||||
rotationAtt.isTransposed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void InternalRow()
|
|
||||||
{
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
|
|
||||||
Matrix32 partialCoord = new Matrix32( cameraAtt.colum0.vec, cameraAtt.colum1.vec );
|
|
||||||
float angle = _row._radius;
|
|
||||||
|
|
||||||
Matrix22 rotation = new Matrix22(
|
|
||||||
Scaler.Cos( angle ), -Scaler.Sin( angle ), Scaler.Sin( angle ),
|
|
||||||
Scaler.Cos( angle ) );
|
|
||||||
|
|
||||||
partialCoord *= rotation;
|
|
||||||
rotationAtt.colum0.reg = partialCoord.colum0.reg;
|
|
||||||
rotationAtt.colum1.reg = partialCoord.colum1.reg;
|
|
||||||
rotationAtt.isTransposed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void InternalYaw()
|
|
||||||
{
|
|
||||||
_isLookAtAvailable = false;
|
|
||||||
|
|
||||||
Matrix32 partialCoord = new Matrix32( cameraAtt.colum0.vec, cameraAtt.colum2.vec );
|
|
||||||
float angle = _yaw._radius;
|
|
||||||
Matrix22 rotation = new Matrix22(
|
|
||||||
Scaler.Cos( angle ), -Scaler.Sin( angle ), Scaler.Sin( angle ),
|
|
||||||
Scaler.Cos( angle ) );
|
|
||||||
|
|
||||||
partialCoord *= rotation;
|
|
||||||
rotationAtt.colum0.reg = partialCoord.colum0.reg;
|
|
||||||
rotationAtt.colum2.reg = partialCoord.colum1.reg;
|
|
||||||
rotationAtt.isTransposed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Vec2HP.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.HighPerformance;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Runtime.Intrinsics;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Math.HighPrecision
|
|
||||||
{
|
|
||||||
[StructLayout(LayoutKind.Explicit, Pack = 16)]
|
|
||||||
public struct Vec2HP : IFixedVector<Vec2HP>
|
|
||||||
{
|
|
||||||
|
|
||||||
[FieldOffset(0)] private M256 buffer;
|
|
||||||
[FieldOffset(0)] private Vector256<float> clrBuffer;
|
|
||||||
|
|
||||||
[FieldOffset(0 * sizeof(double))] public double X;
|
|
||||||
[FieldOffset(1 * sizeof(double))] public double Y;
|
|
||||||
|
|
||||||
public Vec2HP(double x, double y)
|
|
||||||
{
|
|
||||||
this.X = x;
|
|
||||||
this.Y = y;
|
|
||||||
Unsafe.SkipInit(out buffer);
|
|
||||||
Unsafe.SkipInit(out clrBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vec2HP Zero => new Vec2HP(0, 0);
|
|
||||||
|
|
||||||
public static Vec2HP One => new Vec2HP(1, 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Vec3HP.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.HighPerformance;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Runtime.Intrinsics;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Math.HighPrecision
|
|
||||||
{
|
|
||||||
[StructLayout(LayoutKind.Explicit, Pack = 16)]
|
|
||||||
public struct Vec3HP : IFixedVector<Vec3HP>
|
|
||||||
{
|
|
||||||
|
|
||||||
[FieldOffset(0)] internal M256 buffer;
|
|
||||||
[FieldOffset(0)] internal Vector256<float> clrBuffer;
|
|
||||||
[FieldOffset(0 * sizeof(double))] public double X;
|
|
||||||
[FieldOffset(1 * sizeof(double))] public double Y;
|
|
||||||
[FieldOffset(2 * sizeof(double))] public double Z;
|
|
||||||
|
|
||||||
public Vec3HP() : this(0, 0, 0) { }
|
|
||||||
|
|
||||||
public Vec3HP(Vector256<float> clrBuffer)
|
|
||||||
{
|
|
||||||
this.X = 0;
|
|
||||||
this.Y = 0;
|
|
||||||
this.Z = 0;
|
|
||||||
Unsafe.SkipInit(out buffer);
|
|
||||||
Unsafe.SkipInit(out this.clrBuffer);
|
|
||||||
this.clrBuffer = clrBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vec3HP(double x, double y, double z)
|
|
||||||
{
|
|
||||||
this.X = x;
|
|
||||||
this.Y = y;
|
|
||||||
this.Z = z;
|
|
||||||
Unsafe.SkipInit(out buffer);
|
|
||||||
Unsafe.SkipInit(out clrBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vec3HP Zero => new Vec3HP(1, 1, 1);
|
|
||||||
|
|
||||||
public static Vec3HP One => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return $"Double precision 3D Vector<{X},{Y},{Z}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
// file="Vec4HP.cs"
|
|
||||||
// Project: StgSharp
|
|
||||||
// AuthorGroup: Nitload Space
|
|
||||||
// Copyright (c) Nitload Space. All rights reserved.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person
|
|
||||||
// obtaining a copy of this software and associated documentation
|
|
||||||
// files (the “Software”), to deal in the Software without restriction,
|
|
||||||
// including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
// and to permit persons to whom the Software is furnished to do so,
|
|
||||||
// subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and
|
|
||||||
// this permission notice shall be included in all copies
|
|
||||||
// or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED “AS IS”,
|
|
||||||
// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
using StgSharp.HighPerformance;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Runtime.Intrinsics;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace StgSharp.Math.HighPrecision
|
|
||||||
{
|
|
||||||
[StructLayout(LayoutKind.Explicit, Pack =16)]
|
|
||||||
public struct Vec4HP : IFixedVector<Vec4HP>
|
|
||||||
{
|
|
||||||
|
|
||||||
[FieldOffset(0)] private M256 buffer;
|
|
||||||
[FieldOffset(0)] private Vector256<float> clrBuffer;
|
|
||||||
[FieldOffset(3 * sizeof(double))] public double W;
|
|
||||||
[FieldOffset(0 * sizeof(double))] public double X;
|
|
||||||
[FieldOffset(1 * sizeof(double))] public double Y;
|
|
||||||
[FieldOffset(2 * sizeof(double))] public double Z;
|
|
||||||
|
|
||||||
public Vec4HP(double x, double y, double z, double w)
|
|
||||||
{
|
|
||||||
this.X = x;
|
|
||||||
this.Y = y;
|
|
||||||
this.Z = z;
|
|
||||||
this.W = w;
|
|
||||||
Unsafe.SkipInit(out buffer);
|
|
||||||
Unsafe.SkipInit(out clrBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vec4HP Zero => new Vec4HP(0, 0, 0, 0);
|
|
||||||
|
|
||||||
public static Vec4HP One => new Vec4HP(1, 1, 1, 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user