OperationContext.cs
59 lines
| 2.1 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r92 | namespace Implab.Diagnostics { | ||
struct OperationContext { | ||||
readonly LogicalOperation m_initial; | ||||
public readonly static OperationContext EMPTY = new OperationContext(LogicalOperation.EMPTY, false); | ||||
LogicalOperation m_current; | ||||
readonly bool m_ownership; | ||||
public OperationContext(LogicalOperation operation, bool ownership) { | ||||
Safe.ArgumentNotNull(operation, "operation"); | ||||
m_initial = operation; | ||||
m_current = operation; | ||||
m_ownership = ownership; | ||||
} | ||||
public LogicalOperation CurrentOperation { | ||||
get { return m_current; } | ||||
} | ||||
public void BeginLogicalOperation(string name) { | ||||
m_current = new LogicalOperation(name, m_current); | ||||
} | ||||
public LogicalOperation DetachLogicalOperation() { | ||||
var detached = m_current; | ||||
if (m_current != LogicalOperation.EMPTY) { | ||||
if (m_current != m_initial) | ||||
m_current = m_current.Parent; | ||||
else if (m_ownership) | ||||
m_current = LogicalOperation.EMPTY; | ||||
cin
|
r93 | else { | ||
TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context"); | ||||
cin
|
r92 | detached = LogicalOperation.EMPTY; | ||
cin
|
r93 | } | ||
} else { | ||||
TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context"); | ||||
cin
|
r92 | } | ||
cin
|
r93 | |||
cin
|
r92 | return detached; | ||
} | ||||
public void EndLogicalOperation() { | ||||
if (m_current != m_initial) { | ||||
m_current = m_current.Parent; | ||||
cin
|
r93 | } else if (m_current != LogicalOperation.EMPTY && m_ownership) { | ||
m_current = LogicalOperation.EMPTY; | ||||
cin
|
r92 | } else { | ||
TraceLog.TraceWarning("EndLogicalOperation can't be applied in the current context"); | ||||
} | ||||
} | ||||
cin
|
r93 | |||
public void Leave() { | ||||
if ((m_ownership && m_current != LogicalOperation.EMPTY) || (!m_ownership && m_current != m_initial) ) | ||||
TraceLog.TraceWarning("Trying to leave unfinished logical operation {0}", m_current.Name); | ||||
} | ||||
cin
|
r92 | } | ||
} | ||||