mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 09:54:35 +08:00
separate LayersMap
This commit is contained in:
parent
c787efe29f
commit
6c3b62c2e3
@ -8,324 +8,6 @@ using System.Linq;
|
|||||||
namespace DCFApixels.DragonECS.Core
|
namespace DCFApixels.DragonECS.Core
|
||||||
{
|
{
|
||||||
using VertexID = DependencyGraphVertextID;
|
using VertexID = DependencyGraphVertextID;
|
||||||
public class LayersMap : IDependencyGraph<string>
|
|
||||||
{
|
|
||||||
#region IDependencyGraph
|
|
||||||
VertexID IDependencyGraph<string>.AddVertex(string vertex, bool isLocked) { return _graph.AddVertex(vertex, isLocked); }
|
|
||||||
bool IDependencyGraph<string>.ContainsVertex(string vertex) { return _graph.ContainsVertex(vertex); }
|
|
||||||
VertexID IDependencyGraph<string>.GetVertexID(string vertex) { return _graph.GetVertexID(vertex); }
|
|
||||||
string IDependencyGraph<string>.GetVertexFromID(VertexID vertexID) { return _graph.GetVertexFromID(vertexID); }
|
|
||||||
bool IDependencyGraph<string>.RemoveVertex(string vertex) { return _graph.RemoveVertex(vertex); }
|
|
||||||
void IDependencyGraph<string>.AddDependency(VertexID fromID, VertexID toID, bool moveToRight) { _graph.AddDependency(fromID, toID, moveToRight); }
|
|
||||||
string[] IDependencyGraph<string>.Sort() { return _graph.Sort(); }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private readonly IDependencyGraph<string> _graph;
|
|
||||||
private readonly EcsPipeline.Builder _pipelineBuilder;
|
|
||||||
private readonly string _preBeginLayer;
|
|
||||||
|
|
||||||
#region Properties
|
|
||||||
public EcsPipeline.Builder Back
|
|
||||||
{
|
|
||||||
get { return _pipelineBuilder; }
|
|
||||||
}
|
|
||||||
public int Count
|
|
||||||
{
|
|
||||||
get { return _graph.Count; }
|
|
||||||
}
|
|
||||||
public ReadonlyDependenciesCollection<string> Dependencies
|
|
||||||
{
|
|
||||||
get { return _graph.Dependencies; }
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Constructors
|
|
||||||
public LayersMap(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder)
|
|
||||||
{
|
|
||||||
_graph = graph;
|
|
||||||
_pipelineBuilder = pipelineBuilder;
|
|
||||||
}
|
|
||||||
public LayersMap(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, string preBeginlayer, string beginlayer, string basicLayer, string endLayer, string postEndLayer)
|
|
||||||
{
|
|
||||||
_graph = graph;
|
|
||||||
_pipelineBuilder = pipelineBuilder;
|
|
||||||
|
|
||||||
graph.AddVertex(preBeginlayer, true);
|
|
||||||
graph.AddVertex(beginlayer, true);
|
|
||||||
graph.AddVertex(basicLayer, true);
|
|
||||||
graph.AddVertex(endLayer, true);
|
|
||||||
graph.AddVertex(postEndLayer, true);
|
|
||||||
|
|
||||||
Move(preBeginlayer);
|
|
||||||
//.Before(beginlayer);
|
|
||||||
Move(beginlayer)
|
|
||||||
//.Before(basicLayer)
|
|
||||||
.After(preBeginlayer);
|
|
||||||
Move(basicLayer)
|
|
||||||
//.Before(endLayer)
|
|
||||||
.After(beginlayer);
|
|
||||||
Move(endLayer)
|
|
||||||
//.Before(postEndLayer)
|
|
||||||
.After(basicLayer);
|
|
||||||
Move(postEndLayer)
|
|
||||||
.After(endLayer);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Add
|
|
||||||
public MoveHandler Add(string layer)
|
|
||||||
{
|
|
||||||
VertexID id = _graph.AddVertex(layer, false);
|
|
||||||
return new MoveHandler(_graph, _pipelineBuilder, id);
|
|
||||||
}
|
|
||||||
public MoveHandler Add(params string[] layers)
|
|
||||||
{
|
|
||||||
return Add(layersRange: layers);
|
|
||||||
}
|
|
||||||
public MoveHandler Add(IEnumerable<string> layersRange)
|
|
||||||
{
|
|
||||||
foreach (var layer in layersRange)
|
|
||||||
{
|
|
||||||
Add(layer);
|
|
||||||
}
|
|
||||||
return new MoveHandler(_graph, _pipelineBuilder, layersRange);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Move
|
|
||||||
public MoveHandler Move(string layer)
|
|
||||||
{
|
|
||||||
VertexID id = _graph.GetVertexID(layer);
|
|
||||||
return new MoveHandler(_graph, _pipelineBuilder, id);
|
|
||||||
}
|
|
||||||
public MoveHandler Move(params string[] layers)
|
|
||||||
{
|
|
||||||
return new MoveHandler(_graph, _pipelineBuilder, layers);
|
|
||||||
}
|
|
||||||
public MoveHandler Move(IEnumerable<string> layersRange)
|
|
||||||
{
|
|
||||||
return new MoveHandler(_graph, _pipelineBuilder, layersRange);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region MoveHandler
|
|
||||||
public struct MoveHandler
|
|
||||||
{
|
|
||||||
private readonly IDependencyGraph<string> _graph;
|
|
||||||
private readonly EcsPipeline.Builder _pipelineBuilder;
|
|
||||||
private readonly VertexID _layerID;
|
|
||||||
private readonly IEnumerable<string> _layersRange;
|
|
||||||
|
|
||||||
#region Properties
|
|
||||||
public EcsPipeline.Builder Back
|
|
||||||
{
|
|
||||||
get { return _pipelineBuilder; }
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Constructors
|
|
||||||
public MoveHandler(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, VertexID id)
|
|
||||||
{
|
|
||||||
_graph = graph;
|
|
||||||
_pipelineBuilder = pipelineBuilder;
|
|
||||||
_layerID = id;
|
|
||||||
_layersRange = null;
|
|
||||||
}
|
|
||||||
public MoveHandler(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, IEnumerable<string> layersRange)
|
|
||||||
{
|
|
||||||
_graph = graph;
|
|
||||||
_pipelineBuilder = pipelineBuilder;
|
|
||||||
_layerID = VertexID.NULL;
|
|
||||||
_layersRange = layersRange;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Before
|
|
||||||
public MoveHandler Before(params string[] targets)
|
|
||||||
{
|
|
||||||
return Before(targetsRange: targets);
|
|
||||||
}
|
|
||||||
public MoveHandler Before(IEnumerable<string> targetsRange)
|
|
||||||
{
|
|
||||||
foreach (var target in targetsRange)
|
|
||||||
{
|
|
||||||
Before(target);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
public MoveHandler Before(string targetLayer)
|
|
||||||
{
|
|
||||||
if (_layerID != VertexID.NULL)
|
|
||||||
{
|
|
||||||
_graph.AddDependency(_layerID, _graph.GetVertexID(targetLayer), true);
|
|
||||||
}
|
|
||||||
if (_layersRange != null)
|
|
||||||
{
|
|
||||||
foreach (var layer in _layersRange)
|
|
||||||
{
|
|
||||||
_graph.AddDependency(_graph.GetVertexID(layer), _graph.GetVertexID(targetLayer), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region After
|
|
||||||
public MoveHandler After(params string[] targets)
|
|
||||||
{
|
|
||||||
return After(targetsRange: targets);
|
|
||||||
}
|
|
||||||
public MoveHandler After(IEnumerable<string> targetsRange)
|
|
||||||
{
|
|
||||||
foreach (var target in targetsRange)
|
|
||||||
{
|
|
||||||
After(target);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
public MoveHandler After(string targetLayer)
|
|
||||||
{
|
|
||||||
if (_layerID != VertexID.NULL)
|
|
||||||
{
|
|
||||||
_graph.AddDependency(_graph.GetVertexID(targetLayer), _layerID, false);
|
|
||||||
}
|
|
||||||
if (_layersRange != null)
|
|
||||||
{
|
|
||||||
foreach (var layer in _layersRange)
|
|
||||||
{
|
|
||||||
_graph.AddDependency(_graph.GetVertexID(targetLayer), _graph.GetVertexID(layer), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region MergeWith
|
|
||||||
public void MergeWith(IDependencyGraph<string> other)
|
|
||||||
{
|
|
||||||
_graph.MergeWith(other);
|
|
||||||
}
|
|
||||||
//[Obsolete("Use MergeWith(LayersMap)")]
|
|
||||||
public void MergeWith(IReadOnlyList<string> other)
|
|
||||||
{
|
|
||||||
var enumerator = other.GetEnumerator();
|
|
||||||
string prev = null;
|
|
||||||
if (_preBeginLayer != null)
|
|
||||||
{
|
|
||||||
while (enumerator.MoveNext())
|
|
||||||
{
|
|
||||||
var layer = enumerator.Current;
|
|
||||||
if (layer == _preBeginLayer) { break; }
|
|
||||||
|
|
||||||
Add(layer);
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
Move(prev).Before(layer);
|
|
||||||
}
|
|
||||||
prev = layer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (enumerator.MoveNext())
|
|
||||||
{
|
|
||||||
var layer = enumerator.Current;
|
|
||||||
Add(layer);
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
Move(layer).After(prev);
|
|
||||||
}
|
|
||||||
prev = layer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion;
|
|
||||||
|
|
||||||
#region Other
|
|
||||||
public bool Contains(string layer)
|
|
||||||
{
|
|
||||||
return _graph.ContainsVertex(layer);
|
|
||||||
}
|
|
||||||
public IEnumerator<string> GetEnumerator() { return _graph.GetEnumerator(); }
|
|
||||||
IEnumerator IEnumerable.GetEnumerator() { return _graph.GetEnumerator(); }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Build
|
|
||||||
public string[] Build()
|
|
||||||
{
|
|
||||||
return _graph.Sort();
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Obsolete
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Add(layer).Before(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder Insert(string targetLayer, string newLayer)
|
|
||||||
{
|
|
||||||
Add(newLayer).Before(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Add(layer).After(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder InsertAfter(string targetLayer, string newLayer)
|
|
||||||
{
|
|
||||||
Add(newLayer).After(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Move(layer).Before(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder Move(string targetLayer, string newLayer)
|
|
||||||
{
|
|
||||||
Move(newLayer).Before(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Move(layer).After(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder MoveAfter(string targetLayer, string newLayer)
|
|
||||||
{
|
|
||||||
Move(newLayer).After(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Add(layers).Before(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder Insert(string targetLayer, params string[] newLayers)
|
|
||||||
{
|
|
||||||
Add(newLayers).Before(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Add(layers).After(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder InsertAfter(string targetLayer, params string[] newLayers)
|
|
||||||
{
|
|
||||||
Add(newLayers).After(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Move(layers).Before(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder Move(string targetLayer, params string[] movingLayers)
|
|
||||||
{
|
|
||||||
Move(movingLayers).Before(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
[Obsolete("Use " + nameof(LayersMap) + ".Move(layers).After(targetLayer).Back;")]
|
|
||||||
public EcsPipeline.Builder MoveAfter(string targetLayer, params string[] movingLayers)
|
|
||||||
{
|
|
||||||
Move(movingLayers).After(targetLayer);
|
|
||||||
return _pipelineBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Obsolete]
|
|
||||||
public object this[int index]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
foreach (var item in this)
|
|
||||||
{
|
|
||||||
if (i == index)
|
|
||||||
{
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum DependencyGraphVertextID : short { NULL = 0 }
|
public enum DependencyGraphVertextID : short { NULL = 0 }
|
||||||
public interface IDependencyGraph<T> : IReadOnlyCollection<T>
|
public interface IDependencyGraph<T> : IReadOnlyCollection<T>
|
||||||
{
|
{
|
||||||
@ -385,7 +67,10 @@ namespace DCFApixels.DragonECS.Core
|
|||||||
public void Dispose() { }
|
public void Dispose() { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public unsafe partial class DependencyGraph<T> : IDependencyGraph<T>
|
|
||||||
|
|
||||||
|
|
||||||
|
public unsafe class DependencyGraph<T> : IDependencyGraph<T>
|
||||||
{
|
{
|
||||||
private readonly Dictionary<T, VertexID> _vertexIDs = new Dictionary<T, VertexID>(32);
|
private readonly Dictionary<T, VertexID> _vertexIDs = new Dictionary<T, VertexID>(32);
|
||||||
private StructList<VertexInfo> _vertexInfos = new StructList<VertexInfo>(32);
|
private StructList<VertexInfo> _vertexInfos = new StructList<VertexInfo>(32);
|
||||||
@ -513,7 +198,7 @@ namespace DCFApixels.DragonECS.Core
|
|||||||
#region MergeWith
|
#region MergeWith
|
||||||
public void MergeWith(IDependencyGraph<T> other)
|
public void MergeWith(IDependencyGraph<T> other)
|
||||||
{
|
{
|
||||||
if(other is DependencyGraph<T> graph)
|
if (other is DependencyGraph<T> graph)
|
||||||
{
|
{
|
||||||
foreach (var otherDependency in graph._dependencies)
|
foreach (var otherDependency in graph._dependencies)
|
||||||
{
|
{
|
||||||
@ -598,7 +283,7 @@ namespace DCFApixels.DragonECS.Core
|
|||||||
{
|
{
|
||||||
var toID = (VertexID)i;
|
var toID = (VertexID)i;
|
||||||
ref var toInfo = ref GetVertexInfo(i);
|
ref var toInfo = ref GetVertexInfo(i);
|
||||||
if(toInfo.isContained && toInfo.hasAnyDependency == false)
|
if (toInfo.isContained && toInfo.hasAnyDependency == false)
|
||||||
{
|
{
|
||||||
basicLayerAdjacencyList.Insert(inserIndex, (toID, toInfo.insertionIndex));
|
basicLayerAdjacencyList.Insert(inserIndex, (toID, toInfo.insertionIndex));
|
||||||
toInfo.inDegree += 1;
|
toInfo.inDegree += 1;
|
||||||
@ -826,7 +511,7 @@ namespace DCFApixels.DragonECS.Core
|
|||||||
{
|
{
|
||||||
if (_index++ >= _graph.GetVertexInfosCount()) { return false; }
|
if (_index++ >= _graph.GetVertexInfosCount()) { return false; }
|
||||||
ref var info = ref _graph.GetVertexInfo(_index);
|
ref var info = ref _graph.GetVertexInfo(_index);
|
||||||
if(info.isContained == false)
|
if (info.isContained == false)
|
||||||
{
|
{
|
||||||
return MoveNext();
|
return MoveNext();
|
||||||
}
|
}
|
||||||
|
325
src/Utils/LayersMap.cs
Normal file
325
src/Utils/LayersMap.cs
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace DCFApixels.DragonECS.Core
|
||||||
|
{
|
||||||
|
using VertexID = DependencyGraphVertextID;
|
||||||
|
public class LayersMap : IDependencyGraph<string>
|
||||||
|
{
|
||||||
|
#region IDependencyGraph
|
||||||
|
VertexID IDependencyGraph<string>.AddVertex(string vertex, bool isLocked) { return _graph.AddVertex(vertex, isLocked); }
|
||||||
|
bool IDependencyGraph<string>.ContainsVertex(string vertex) { return _graph.ContainsVertex(vertex); }
|
||||||
|
VertexID IDependencyGraph<string>.GetVertexID(string vertex) { return _graph.GetVertexID(vertex); }
|
||||||
|
string IDependencyGraph<string>.GetVertexFromID(VertexID vertexID) { return _graph.GetVertexFromID(vertexID); }
|
||||||
|
bool IDependencyGraph<string>.RemoveVertex(string vertex) { return _graph.RemoveVertex(vertex); }
|
||||||
|
void IDependencyGraph<string>.AddDependency(VertexID fromID, VertexID toID, bool moveToRight) { _graph.AddDependency(fromID, toID, moveToRight); }
|
||||||
|
string[] IDependencyGraph<string>.Sort() { return _graph.Sort(); }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private readonly IDependencyGraph<string> _graph;
|
||||||
|
private readonly EcsPipeline.Builder _pipelineBuilder;
|
||||||
|
private readonly string _preBeginLayer;
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
public EcsPipeline.Builder Back
|
||||||
|
{
|
||||||
|
get { return _pipelineBuilder; }
|
||||||
|
}
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get { return _graph.Count; }
|
||||||
|
}
|
||||||
|
public ReadonlyDependenciesCollection<string> Dependencies
|
||||||
|
{
|
||||||
|
get { return _graph.Dependencies; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructors
|
||||||
|
public LayersMap(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder)
|
||||||
|
{
|
||||||
|
_graph = graph;
|
||||||
|
_pipelineBuilder = pipelineBuilder;
|
||||||
|
}
|
||||||
|
public LayersMap(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, string preBeginlayer, string beginlayer, string basicLayer, string endLayer, string postEndLayer)
|
||||||
|
{
|
||||||
|
_graph = graph;
|
||||||
|
_pipelineBuilder = pipelineBuilder;
|
||||||
|
|
||||||
|
graph.AddVertex(preBeginlayer, true);
|
||||||
|
graph.AddVertex(beginlayer, true);
|
||||||
|
graph.AddVertex(basicLayer, true);
|
||||||
|
graph.AddVertex(endLayer, true);
|
||||||
|
graph.AddVertex(postEndLayer, true);
|
||||||
|
|
||||||
|
Move(preBeginlayer);
|
||||||
|
//.Before(beginlayer);
|
||||||
|
Move(beginlayer)
|
||||||
|
//.Before(basicLayer)
|
||||||
|
.After(preBeginlayer);
|
||||||
|
Move(basicLayer)
|
||||||
|
//.Before(endLayer)
|
||||||
|
.After(beginlayer);
|
||||||
|
Move(endLayer)
|
||||||
|
//.Before(postEndLayer)
|
||||||
|
.After(basicLayer);
|
||||||
|
Move(postEndLayer)
|
||||||
|
.After(endLayer);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Add
|
||||||
|
public MoveHandler Add(string layer)
|
||||||
|
{
|
||||||
|
VertexID id = _graph.AddVertex(layer, false);
|
||||||
|
return new MoveHandler(_graph, _pipelineBuilder, id);
|
||||||
|
}
|
||||||
|
public MoveHandler Add(params string[] layers)
|
||||||
|
{
|
||||||
|
return Add(layersRange: layers);
|
||||||
|
}
|
||||||
|
public MoveHandler Add(IEnumerable<string> layersRange)
|
||||||
|
{
|
||||||
|
foreach (var layer in layersRange)
|
||||||
|
{
|
||||||
|
Add(layer);
|
||||||
|
}
|
||||||
|
return new MoveHandler(_graph, _pipelineBuilder, layersRange);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Move
|
||||||
|
public MoveHandler Move(string layer)
|
||||||
|
{
|
||||||
|
VertexID id = _graph.GetVertexID(layer);
|
||||||
|
return new MoveHandler(_graph, _pipelineBuilder, id);
|
||||||
|
}
|
||||||
|
public MoveHandler Move(params string[] layers)
|
||||||
|
{
|
||||||
|
return new MoveHandler(_graph, _pipelineBuilder, layers);
|
||||||
|
}
|
||||||
|
public MoveHandler Move(IEnumerable<string> layersRange)
|
||||||
|
{
|
||||||
|
return new MoveHandler(_graph, _pipelineBuilder, layersRange);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region MoveHandler
|
||||||
|
public struct MoveHandler
|
||||||
|
{
|
||||||
|
private readonly IDependencyGraph<string> _graph;
|
||||||
|
private readonly EcsPipeline.Builder _pipelineBuilder;
|
||||||
|
private readonly VertexID _layerID;
|
||||||
|
private readonly IEnumerable<string> _layersRange;
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
public EcsPipeline.Builder Back
|
||||||
|
{
|
||||||
|
get { return _pipelineBuilder; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructors
|
||||||
|
public MoveHandler(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, VertexID id)
|
||||||
|
{
|
||||||
|
_graph = graph;
|
||||||
|
_pipelineBuilder = pipelineBuilder;
|
||||||
|
_layerID = id;
|
||||||
|
_layersRange = null;
|
||||||
|
}
|
||||||
|
public MoveHandler(IDependencyGraph<string> graph, EcsPipeline.Builder pipelineBuilder, IEnumerable<string> layersRange)
|
||||||
|
{
|
||||||
|
_graph = graph;
|
||||||
|
_pipelineBuilder = pipelineBuilder;
|
||||||
|
_layerID = VertexID.NULL;
|
||||||
|
_layersRange = layersRange;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Before
|
||||||
|
public MoveHandler Before(params string[] targets)
|
||||||
|
{
|
||||||
|
return Before(targetsRange: targets);
|
||||||
|
}
|
||||||
|
public MoveHandler Before(IEnumerable<string> targetsRange)
|
||||||
|
{
|
||||||
|
foreach (var target in targetsRange)
|
||||||
|
{
|
||||||
|
Before(target);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public MoveHandler Before(string targetLayer)
|
||||||
|
{
|
||||||
|
if (_layerID != VertexID.NULL)
|
||||||
|
{
|
||||||
|
_graph.AddDependency(_layerID, _graph.GetVertexID(targetLayer), true);
|
||||||
|
}
|
||||||
|
if (_layersRange != null)
|
||||||
|
{
|
||||||
|
foreach (var layer in _layersRange)
|
||||||
|
{
|
||||||
|
_graph.AddDependency(_graph.GetVertexID(layer), _graph.GetVertexID(targetLayer), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region After
|
||||||
|
public MoveHandler After(params string[] targets)
|
||||||
|
{
|
||||||
|
return After(targetsRange: targets);
|
||||||
|
}
|
||||||
|
public MoveHandler After(IEnumerable<string> targetsRange)
|
||||||
|
{
|
||||||
|
foreach (var target in targetsRange)
|
||||||
|
{
|
||||||
|
After(target);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public MoveHandler After(string targetLayer)
|
||||||
|
{
|
||||||
|
if (_layerID != VertexID.NULL)
|
||||||
|
{
|
||||||
|
_graph.AddDependency(_graph.GetVertexID(targetLayer), _layerID, false);
|
||||||
|
}
|
||||||
|
if (_layersRange != null)
|
||||||
|
{
|
||||||
|
foreach (var layer in _layersRange)
|
||||||
|
{
|
||||||
|
_graph.AddDependency(_graph.GetVertexID(targetLayer), _graph.GetVertexID(layer), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region MergeWith
|
||||||
|
public void MergeWith(IDependencyGraph<string> other)
|
||||||
|
{
|
||||||
|
_graph.MergeWith(other);
|
||||||
|
}
|
||||||
|
//[Obsolete("Use MergeWith(LayersMap)")]
|
||||||
|
public void MergeWith(IReadOnlyList<string> other)
|
||||||
|
{
|
||||||
|
var enumerator = other.GetEnumerator();
|
||||||
|
string prev = null;
|
||||||
|
if (_preBeginLayer != null)
|
||||||
|
{
|
||||||
|
while (enumerator.MoveNext())
|
||||||
|
{
|
||||||
|
var layer = enumerator.Current;
|
||||||
|
if (layer == _preBeginLayer) { break; }
|
||||||
|
|
||||||
|
Add(layer);
|
||||||
|
if (prev != null)
|
||||||
|
{
|
||||||
|
Move(prev).Before(layer);
|
||||||
|
}
|
||||||
|
prev = layer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (enumerator.MoveNext())
|
||||||
|
{
|
||||||
|
var layer = enumerator.Current;
|
||||||
|
Add(layer);
|
||||||
|
if (prev != null)
|
||||||
|
{
|
||||||
|
Move(layer).After(prev);
|
||||||
|
}
|
||||||
|
prev = layer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion;
|
||||||
|
|
||||||
|
#region Other
|
||||||
|
public bool Contains(string layer)
|
||||||
|
{
|
||||||
|
return _graph.ContainsVertex(layer);
|
||||||
|
}
|
||||||
|
public IEnumerator<string> GetEnumerator() { return _graph.GetEnumerator(); }
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() { return _graph.GetEnumerator(); }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Build
|
||||||
|
public string[] Build()
|
||||||
|
{
|
||||||
|
return _graph.Sort();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Obsolete
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Add(layer).Before(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder Insert(string targetLayer, string newLayer)
|
||||||
|
{
|
||||||
|
Add(newLayer).Before(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Add(layer).After(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder InsertAfter(string targetLayer, string newLayer)
|
||||||
|
{
|
||||||
|
Add(newLayer).After(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Move(layer).Before(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder Move(string targetLayer, string newLayer)
|
||||||
|
{
|
||||||
|
Move(newLayer).Before(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Move(layer).After(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder MoveAfter(string targetLayer, string newLayer)
|
||||||
|
{
|
||||||
|
Move(newLayer).After(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Add(layers).Before(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder Insert(string targetLayer, params string[] newLayers)
|
||||||
|
{
|
||||||
|
Add(newLayers).Before(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Add(layers).After(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder InsertAfter(string targetLayer, params string[] newLayers)
|
||||||
|
{
|
||||||
|
Add(newLayers).After(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Move(layers).Before(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder Move(string targetLayer, params string[] movingLayers)
|
||||||
|
{
|
||||||
|
Move(movingLayers).Before(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
[Obsolete("Use " + nameof(LayersMap) + ".Move(layers).After(targetLayer).Back;")]
|
||||||
|
public EcsPipeline.Builder MoveAfter(string targetLayer, params string[] movingLayers)
|
||||||
|
{
|
||||||
|
Move(movingLayers).After(targetLayer);
|
||||||
|
return _pipelineBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Obsolete]
|
||||||
|
public object this[int index]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
foreach (var item in this)
|
||||||
|
{
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user