Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Public Class ChangeTracker(Of T As {IEquatable(Of T), ICloneable})
- 'item "checkpoints" that are internal to this list
- Private _originals As New Dictionary(Of Integer, T)()
- Private _originalIndex As New Dictionary(Of T, Integer)()
- 'the current, live-edited objects
- Private _copies As New Dictionary(Of Integer, T)()
- Private _copyIndex As New Dictionary(Of T, Integer)()
- Public Function IsChanged(ByVal copy As T) As Boolean
- Dim original = _originals(_copyIndex(copy))
- Return original.Equals(copy)
- End Function
- Public Function GetChangedItems() As IEnumerable(Of T)
- Return _copies.Values.Where(Function(c) IsChanged(c))
- End Function
- Public Function GetTrackedItems() As IEnumerable(Of T)
- Return _copies.Values
- End Function
- Public Sub SetNewCheckpoint()
- For Each copy In Me.GetChangedItems().ToList()
- Dim dbId As Integer = _copyIndex(copy)
- Dim oldOriginal = _originals(dbId)
- Dim newOriginal = DirectCast(copy.Clone(), T)
- _originals(dbId) = newOriginal
- _originalIndex.Remove(oldOriginal)
- _originalIndex.Add(newOriginal, dbId)
- Next
- End Sub
- Public Sub StartTracking(ByVal dbId As Integer, ByVal item As T)
- Dim newOriginal = DirectCast(item.Clone(), T)
- _originals(dbId) = newOriginal
- _originalIndex(newOriginal) = dbId
- _copies(dbId) = item
- _copyIndex(item) = dbId
- End Sub
- Public Sub StopTracking(ByVal dbId As Integer)
- Dim original = _originals(dbId)
- Dim copy = _copies(dbId)
- _copies.Remove(dbId)
- _originals.Remove(dbId)
- _copyIndex.Remove(copy)
- _originalIndex.Remove(original)
- End Sub
- Public Function IsTracking(ByVal dbId As Integer) As Boolean
- Return _originals.ContainsKey(dbId)
- End Function
- Public Function IsTracking(ByVal item As T) As Boolean
- Return _copyIndex.ContainsKey(item)
- End Function
- Public Function GetItem(ByVal dbId As Integer) As T
- Return _copies(dbId)
- End Function
- End Class
Advertisement
Add Comment
Please, Sign In to add comment