Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
AssetDependencySet.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;
4 using System.Collections;
5 using System.Collections.Generic;
6 using System.Diagnostics;
7 using System.Linq;
8 using SiliconStudio.Core.Serialization;
9 
10 namespace SiliconStudio.Assets.Analysis
11 {
12  /// <summary>
13  /// Describes dependencies (in/out/miss) for a specific asset.
14  /// </summary>
15  /// <remarks>There are 3 types of dependencies:
16  /// <ul>
17  /// <li><c>in</c> dependencies: through the <see cref="Parents"/> property, contains assets
18  /// that are referencing this asset.</li>
19  /// <li><c>out</c> dependencies: directly from the instance of this object, contains assets
20  /// that are referenced this asset.</li>
21  /// <li><c>missing</c> dependencies: through the <see cref="MissingReferences"/> property,
22  /// contains assets referenced by this asset and that are missing.</li>
23  /// </ul>
24  /// </remarks>
25  [DebuggerDisplay("In [{Parents.Count}] / Out [{Count}] Miss [{MissingReferenceCount}]")]
26  public class AssetDependencySet : HashSet<AssetItem>
27  {
28  private readonly AssetItem item;
29  private readonly HashSet<AssetItem> parents;
30  private List<IContentReference> missingReferences;
31 
32  public AssetDependencySet(AssetItem assetItem)
33  : base(AssetItem.DefaultComparerById)
34  {
35  if (assetItem == null) throw new ArgumentNullException("assetItem");
36  item = assetItem;
37  parents = new HashSet<AssetItem>(AssetItem.DefaultComparerById);
38  }
39 
41  : base(AssetItem.DefaultComparerById)
42  {
43  if (set == null) throw new ArgumentNullException("set");
44  item = set.Item;
45  parents = new HashSet<AssetItem>(AssetItem.DefaultComparerById);
46 
47  // Copy Output refs
48  foreach (var child in set)
49  {
50  Add(child.Clone(true));
51  }
52 
53  // Copy missing refs
54  if (set.missingReferences != null)
55  {
56  foreach (var missingRef in set.missingReferences)
57  {
58  AddMissingReference(missingRef);
59  }
60  }
61 
62  // Copy Input refs
63  foreach (var parent in set.parents)
64  {
65  parents.Add(parent.Clone(true));
66  }
67  }
68 
69  public Guid Id
70  {
71  get
72  {
73  return item.Id;
74  }
75  }
76 
77  /// <summary>
78  /// Gets the itemReferenced.
79  /// </summary>
80  /// <value>The itemReferenced.</value>
81  public AssetItem Item
82  {
83  get
84  {
85  return item;
86  }
87  }
88 
89  public HashSet<AssetItem> Parents
90  {
91  get
92  {
93  return parents;
94  }
95  }
96 
97  /// <summary>
98  /// Resets this instance and clear all dependencies (including missing)
99  /// </summary>
100  public void Reset(bool keepParents)
101  {
102  missingReferences = null;
103  Clear();
104  if (!keepParents)
105  {
106  parents.Clear();
107  }
108  }
109 
110  /// <summary>
111  /// Gets a value indicating whether this instance has missing references.
112  /// </summary>
113  /// <value><c>true</c> if this instance has missing references; otherwise,
114  /// <c>false</c>.</value>
115  public bool HasMissingReferences
116  {
117  get
118  {
119  return missingReferences != null && missingReferences.Count > 0;
120  }
121  }
122 
123  public int MissingReferenceCount
124  {
125  get
126  {
127  return missingReferences != null ? missingReferences.Count : 0;
128  }
129  }
130 
131  /// <summary>
132  /// Gets the missing references.
133  /// </summary>
134  /// <value>The missing references.</value>
135  public IEnumerable<IContentReference> MissingReferences
136  {
137  get
138  {
139  return missingReferences ?? Enumerable.Empty<IContentReference>();
140  }
141  }
142 
143  /// <summary>
144  /// Adds a missing reference.
145  /// </summary>
146  /// <param name="contentReference">The content reference.</param>
147  /// <exception cref="System.ArgumentNullException">contentReference</exception>
148  public void AddMissingReference(IContentReference contentReference)
149  {
150  if (contentReference == null) throw new ArgumentNullException("contentReference");
151  if (missingReferences == null)
152  missingReferences = new List<IContentReference>();
153  missingReferences.Add(contentReference);
154  }
155 
156  /// <summary>
157  /// Removes a missing reference
158  /// </summary>
159  /// <param name="guid">The unique identifier.</param>
160  public void RemoveMissingReference(Guid guid)
161  {
162  if (missingReferences == null) return;
163  for (int i = missingReferences.Count - 1; i >= 0; i--)
164  {
165  if (missingReferences[i].Id == guid)
166  {
167  missingReferences.RemoveAt(i);
168  break;
169  }
170  }
171 
172  // Remove list if no longer used
173  if (missingReferences.Count == 0)
174  {
175  missingReferences = null;
176  }
177  }
178  }
179 }
void AddMissingReference(IContentReference contentReference)
Adds a missing reference.
void Reset(bool keepParents)
Resets this instance and clear all dependencies (including missing)
An asset item part of a Package accessible through SiliconStudio.Assets.Package.Assets.
Definition: AssetItem.cs:17
Describes dependencies (in/out/miss) for a specific asset.
void RemoveMissingReference(Guid guid)
Removes a missing reference
An interface that provides a reference to an asset.