Guest User

Untitled

a guest
Mar 16th, 2012
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 2.14 KB | None | 0 0
  1. Public Class ChangeTracker(Of T As {IEquatable(Of T), ICloneable})
  2.     'item "checkpoints" that are internal to this list
  3.     Private _originals As New Dictionary(Of Integer, T)()
  4.     Private _originalIndex As New Dictionary(Of T, Integer)()
  5.  
  6.     'the current, live-edited objects
  7.     Private _copies As New Dictionary(Of Integer, T)()
  8.     Private _copyIndex As New Dictionary(Of T, Integer)()
  9.  
  10.     Public Function IsChanged(ByVal copy As T) As Boolean
  11.         Dim original = _originals(_copyIndex(copy))
  12.         Return original.Equals(copy)
  13.     End Function
  14.  
  15.     Public Function GetChangedItems() As IEnumerable(Of T)
  16.         Return _copies.Values.Where(Function(c) IsChanged(c))
  17.     End Function
  18.  
  19.     Public Function GetTrackedItems() As IEnumerable(Of T)
  20.         Return _copies.Values
  21.     End Function
  22.  
  23.     Public Sub SetNewCheckpoint()
  24.         For Each copy In Me.GetChangedItems().ToList()
  25.             Dim dbId As Integer = _copyIndex(copy)
  26.             Dim oldOriginal = _originals(dbId)
  27.             Dim newOriginal = DirectCast(copy.Clone(), T)
  28.  
  29.             _originals(dbId) = newOriginal
  30.             _originalIndex.Remove(oldOriginal)
  31.             _originalIndex.Add(newOriginal, dbId)
  32.         Next
  33.     End Sub
  34.  
  35.     Public Sub StartTracking(ByVal dbId As Integer, ByVal item As T)
  36.         Dim newOriginal = DirectCast(item.Clone(), T)
  37.         _originals(dbId) = newOriginal
  38.         _originalIndex(newOriginal) = dbId
  39.  
  40.         _copies(dbId) = item
  41.         _copyIndex(item) = dbId
  42.     End Sub
  43.  
  44.     Public Sub StopTracking(ByVal dbId As Integer)
  45.         Dim original = _originals(dbId)
  46.         Dim copy = _copies(dbId)
  47.  
  48.         _copies.Remove(dbId)
  49.         _originals.Remove(dbId)
  50.         _copyIndex.Remove(copy)
  51.         _originalIndex.Remove(original)
  52.     End Sub
  53.  
  54.     Public Function IsTracking(ByVal dbId As Integer) As Boolean
  55.         Return _originals.ContainsKey(dbId)
  56.     End Function
  57.  
  58.     Public Function IsTracking(ByVal item As T) As Boolean
  59.         Return _copyIndex.ContainsKey(item)
  60.     End Function
  61.  
  62.     Public Function GetItem(ByVal dbId As Integer) As T
  63.         Return _copies(dbId)
  64.     End Function
  65. End Class
Advertisement
Add Comment
Please, Sign In to add comment