Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
AssetFileChangedEventSquasher.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System.Collections.Generic;
4 using System.Linq;
5 
6 namespace SiliconStudio.Assets.Analysis
7 {
8  /// <summary>
9  /// Used to squash a list of <see cref="AssetFileChangedEvent"/>.
10  /// </summary>
11  internal class AssetFileChangedEventSquasher
12  {
13  private static readonly ComparerPackageAndLocation ComparerPackageAndLocationInstance = new ComparerPackageAndLocation();
14  private readonly Dictionary<AssetFileChangedEvent, AssetFileChangedEvent> filteredAssetFileChangedEvents = new Dictionary<AssetFileChangedEvent, AssetFileChangedEvent>(ComparerPackageAndLocationInstance);
15 
16  /// <summary>
17  /// Squashes the list of events and returned a compact form of it. This method guaranty that for a specific file, there will be only a single event.
18  /// So for example, if there is a Added + Changed + Deleted event, there will be only a Deleted event in final.
19  /// </summary>
20  /// <param name="currentAssetFileChangedEvents">The current asset file changed events.</param>
21  /// <returns>An enumeration of events.</returns>
22  public IEnumerable<AssetFileChangedEvent> Squash(List<AssetFileChangedEvent> currentAssetFileChangedEvents)
23  {
24  if (currentAssetFileChangedEvents.Count == 0)
25  return Enumerable.Empty<AssetFileChangedEvent>();
26 
27  // Compute the list of AssetFileChangedEvent in reverse order
28  // and squash them per Package/AssetLocation.
29  // The original list of currentAssetFileChangedEvents is not squashed
30  // so it means that AssetFileChangedEvent.ChangeType in this list are single flags (e.g. AssetFileChangedType.Added)
31  // Here we are squashing individual events into a single one for the same URL.
32  // Though there are few cases:
33  // - If the new event is Added or Deleted, than It will completely replace previous change types
34  // - If the new event is Added, it will keep previous AssetFileChangedType.SourceXXX
35  filteredAssetFileChangedEvents.Clear();
36  var eventsCopy = new List<AssetFileChangedEvent>();
37  foreach (var currentAssetEvent in currentAssetFileChangedEvents)
38  {
39  AssetFileChangedEvent previousEvent;
40  if (filteredAssetFileChangedEvents.TryGetValue(currentAssetEvent, out previousEvent))
41  {
42  var sourceEventTypes = (previousEvent.ChangeType & AssetFileChangedType.SourceEventMask);
43  // If new event is added or deleted, then it replace completely previous
44  // squash
45  if (currentAssetEvent.ChangeType == AssetFileChangedType.Added ||
46  currentAssetEvent.ChangeType == AssetFileChangedType.Deleted)
47  {
48  previousEvent.ChangeType = currentAssetEvent.ChangeType;
49 
50  // Force source events, we keep them in case of Added
51  if (currentAssetEvent.ChangeType == AssetFileChangedType.Added)
52  {
53  previousEvent.ChangeType |= sourceEventTypes;
54  }
55  }
56  else
57  {
58  // In case of a SourceDeleted event, delete previous (SourceAdded event if any)
59  if (currentAssetEvent.ChangeType == AssetFileChangedType.SourceDeleted)
60  {
61  previousEvent.ChangeType = (previousEvent.ChangeType & (~AssetFileChangedType.SourceEventMask));
62  }
63 
64  // Else we can merge the event into a single one
65  previousEvent.ChangeType |= currentAssetEvent.ChangeType;
66  }
67  }
68  else
69  {
70  eventsCopy.Add(currentAssetEvent);
71  filteredAssetFileChangedEvents.Add(currentAssetEvent, currentAssetEvent);
72  }
73 
74  }
75  filteredAssetFileChangedEvents.Clear();
76 
77  return eventsCopy;
78  }
79 
80  private class ComparerPackageAndLocation : IEqualityComparer<AssetFileChangedEvent>
81  {
82  public bool Equals(AssetFileChangedEvent x, AssetFileChangedEvent y)
83  {
84  if (ReferenceEquals(x, y))
85  return true;
86  if (ReferenceEquals(x, null))
87  return false;
88 
89  return x.Package == y.Package && x.AssetLocation == y.AssetLocation;
90  }
91 
92  public int GetHashCode(AssetFileChangedEvent obj)
93  {
94  var hashCode = (obj.Package != null ? obj.Package.GetHashCode() : 0);
95  hashCode = (hashCode * 397) ^ (obj.AssetLocation != null ? obj.AssetLocation.GetHashCode() : 0);
96  return hashCode;
97  }
98  }
99  }
100 }
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
Definition: DirectXTexP.h:191
AssetFileChangedType
Type of a change event for an asset.