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