OperationContext.cs
65 lines
| 2.3 KiB
| text/x-csharp
|
CSharpLexer
|
|
r92 | namespace Implab.Diagnostics { | ||
| struct OperationContext { | ||||
| public readonly static OperationContext EMPTY = new OperationContext(LogicalOperation.EMPTY, false); | ||||
|
|
r134 | |||
| LogicalOperation m_initial; | ||||
|
|
r92 | LogicalOperation m_current; | ||
|
|
r134 | bool m_ownership; | ||
|
|
r92 | |||
| 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; | ||||
|
|
r93 | else { | ||
|
|
r195 | TraceLog.TraceWarning("DetachLogicalOperation can't be performed in the current context"); | ||
|
|
r92 | detached = LogicalOperation.EMPTY; | ||
|
|
r93 | } | ||
| } else { | ||||
|
|
r195 | TraceLog.TraceWarning("DetachLogicalOperation can't be performed in the current context"); | ||
|
|
r92 | } | ||
|
|
r93 | |||
|
|
r92 | return detached; | ||
| } | ||||
|
|
r134 | public LogicalOperation EndLogicalOperation() { | ||
| var current = m_current; | ||||
| if (m_current != LogicalOperation.EMPTY && (m_current != m_initial || m_ownership)) { | ||||
|
|
r92 | m_current = m_current.Parent; | ||
|
|
r134 | if (current == m_initial) { | ||
| // we have complete the owned operation | ||||
| m_initial = m_current; | ||||
| m_ownership = false; | ||||
| } | ||||
|
|
r92 | } else { | ||
|
|
r195 | TraceLog.TraceWarning("EndLogicalOperation can't be performed in the current context"); | ||
|
|
r92 | } | ||
|
|
r134 | return current; | ||
|
|
r92 | } | ||
|
|
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); | ||||
| } | ||||
|
|
r92 | } | ||
| } | ||||
