-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathBaseOperationOrSignal.cs
More file actions
97 lines (80 loc) · 3.08 KB
/
BaseOperationOrSignal.cs
File metadata and controls
97 lines (80 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections.Generic;
using System.Linq;
using TiaCodegen.Commands.Signals;
using TiaCodegen.Interfaces;
namespace TiaCodegen.Commands
{
public abstract class BaseOperationOrSignal : IOperationOrSignal
{
public string DebugInfo { get; set; }
private ulong operationId;
public BaseOperationOrSignal(params IOperationOrSignal[] operationOrSignals)
{
Children = new List<IOperationOrSignal>();
if (operationOrSignals != null)
Children.AddRange(operationOrSignals);
}
public virtual List<IOperationOrSignal> Children { get; set; }
public ulong OperationId { get => operationId;
set => operationId = value; }
public IOperationOrSignal Parent { get; set; }
public bool DoNotCreateContact { get; set; }
public virtual int Cardinality { get; set; }
public virtual int CreateContactAndFillCardinality(IOperationOrSignal parent)
{
this.Cardinality = 1;
if (Children.Count > 0 && Children.Last() is Or)
{
this.Cardinality = Children.Last().CreateContactAndFillCardinality(parent);
Children.Last().DoNotCreateContact = true;
}
return this.Cardinality;
}
public void Add(params IOperationOrSignal[] operationOrSignals)
{
Children.AddRange(operationOrSignals);
}
public override string ToString()
{
if (this is And || this is Or)
{
return this.GetType().Name + " (" + string.Join(",", Children.Select(x => x.ToString())) + ")";
}
return this.GetType().Name;
}
public IOperationOrSignal GetFirstChildNotAnd()
{
if (this is And && Children.Count > 0)
{
var ch1 = ((And)this).Children[0];
if (ch1 is BaseOperationOrSignal)
return ((BaseOperationOrSignal)ch1).GetFirstChildNotAnd();
}
return this;
}
public IOperationOrSignal Clone()
{
try
{
var inst = (BaseOperationOrSignal)Activator.CreateInstance(this.GetType(), null);
var props = this.GetType().GetProperties();
foreach (var p in props)
{
if (p.Name == "Children" || p.Name == "Parent" || p.Name == "SignalId" || p.Name == "OperationId" || p.Name == "Cardinality" || p.Name == "DoNotCreateContact")
continue;
p.SetValue(inst, p.GetValue(this));
}
foreach (var c in Children)
{
inst.Children.Add(c.Clone());
}
return inst;
}
catch (Exception ex)
{
throw new Exception("Error Clone: " + this.GetType().Name, ex);
}
}
}
}