Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
Diff3Node.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.Generic;
5 using System.Text;
6 using SiliconStudio.Assets.Visitors;
7 
8 namespace SiliconStudio.Assets.Diff
9 {
10  public class Diff3Node : IDataVisitNode<Diff3Node>
11  {
12  private static readonly Func<Diff3Node, bool> StaticCheckVisitChildren = CheckVisitChildren;
13  private static readonly Func<Diff3Node, bool> StaticCheckVisitNode = CheckVisitNode;
14 
15  public Diff3Node()
16  {
17  }
18 
19  public Diff3Node(DataVisitNode baseNode, DataVisitNode asset1Node, DataVisitNode asset2Node)
20  {
21  BaseNode = baseNode;
22  Asset1Node = asset1Node;
23  Asset2Node = asset2Node;
24  }
25 
26  public DataVisitNode BaseNode { get; set; }
27 
28  public DataVisitNode Asset1Node { get; set; }
29 
30  public DataVisitNode Asset2Node { get; set; }
31 
32  public Diff3ChangeType ChangeType { get; set; }
33 
34  public Diff3Node Parent { get; set; }
35 
36  /// <summary>
37  /// Gets or sets the type of the instance. Null if instance type is different between the nodes.
38  /// </summary>
39  /// <value>The type of the instance.</value>
40  public Type InstanceType { get; set; }
41 
43  {
44  return this.Children(StaticCheckVisitNode, StaticCheckVisitChildren);
45  }
46 
47  private static bool CheckVisitChildren(Diff3Node diff3)
48  {
49  return diff3.ChangeType == Diff3ChangeType.Children || diff3.ChangeType != Diff3ChangeType.None;
50  }
51 
52  private static bool CheckVisitNode(Diff3Node diff3)
53  {
54  return diff3.ChangeType != Diff3ChangeType.Children;
55  }
56 
57  public bool HasConflict
58  {
59  get
60  {
61  return ChangeType >= Diff3ChangeType.Conflict;
62  }
63  }
64 
65  /// <summary>
66  /// Gets a value indicating whether this instance has <see cref="Members"/>.
67  /// </summary>
68  /// <value><c>true</c> if this instance has members; otherwise, <c>false</c>.</value>
69  public bool HasMembers
70  {
71  get
72  {
73  return Members != null;
74  }
75  }
76 
77  /// <summary>
78  /// Gets a value indicating whether this instance has <see cref="Items"/>.
79  /// </summary>
80  /// <value><c>true</c> if this instance has items; otherwise, <c>false</c>.</value>
81  public bool HasItems
82  {
83  get
84  {
85  return Items != null;
86  }
87  }
88 
89  public List<Diff3Node> Members { get; set; }
90 
91  public List<Diff3Node> Items { get; set; }
92 
93  /// <summary>
94  /// Replace the value for the asset1 for this data node.
95  /// </summary>
96  /// <param name="dataInstance">The data instance.</param>
97  /// <param name="selector">The selector.</param>
98  /// <param name="isRemoved"></param>
99  public void ReplaceValue(object dataInstance, Func<Diff3Node, DataVisitNode> selector, bool isRemoved)
100  {
101  if (selector == null) throw new ArgumentNullException("selector");
102  var node = this.Asset1Node ?? this.BaseNode ?? this.Asset2Node;
103 
104  var dataNode = selector(this);
105  var parentNode = Parent;
106 
107  if (node is DataVisitMember)
108  {
109  ((DataVisitMember)dataNode).SetValue(dataInstance);
110  }
111  else if (node is DataVisitListItem)
112  {
113  var descriptor = ((DataVisitListItem)node).Descriptor;
114  if (isRemoved)
115  {
116  var listNode = (DataVisitListItem)node;
117  descriptor.RemoveAt(selector(parentNode).Instance, listNode.Index);
118  }
119  else
120  {
121  descriptor.Add(selector(parentNode).Instance, dataInstance);
122  }
123  }
124  else if (node is DataVisitDictionaryItem)
125  {
126  var dictItem = (DataVisitDictionaryItem)node;
127  var descriptor = dictItem.Descriptor;
128 
129  if (dataInstance == null)
130  {
131  descriptor.Remove(selector(parentNode).Instance, dictItem.Key);
132  }
133  else
134  {
135  descriptor.SetValue(selector(parentNode).Instance, dictItem.Key, dataInstance);
136  }
137  }
138  else if (node is DataVisitArrayItem)
139  {
140  var arrayItem = (DataVisitArrayItem)node;
141  ((Array)selector(parentNode).Instance).SetValue(dataInstance, arrayItem.Index);
142  }
143  }
144 
145 
146  public override string ToString()
147  {
148  var text = new StringBuilder();
149  text.Append("Diff = ");
150  text.Append(ChangeType);
151  if (HasMembers)
152  {
153  text.AppendFormat(" Members = {0}", Members.Count);
154  }
155  if (HasItems)
156  {
157  text.AppendFormat(" Items = {0}", Items.Count);
158  }
159 
160  text.AppendFormat(" Type = {0}", InstanceType == null ? "unknown" : InstanceType.FullName);
161 
162  return text.ToString();
163  }
164  }
165 }
A diff element for a member (field or property) of a class.
void ReplaceValue(object dataInstance, Func< Diff3Node, DataVisitNode > selector, bool isRemoved)
Replace the value for the asset1 for this data node.
Definition: Diff3Node.cs:99
Diff3Node(DataVisitNode baseNode, DataVisitNode asset1Node, DataVisitNode asset2Node)
Definition: Diff3Node.cs:19
IEnumerable< Diff3Node > FindDifferences()
Definition: Diff3Node.cs:42
Base class for all items in a collection (array, list or dictionary)