source: OniSplit/Metadata/CompareVisitor.cs@ 1138

Last change on this file since 1138 was 1114, checked in by iritscen, 5 years ago

Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File size: 3.2 KB
Line 
1namespace Oni.Metadata
2{
3 internal class CompareVisitor : MetaTypeVisitor
4 {
5 private readonly BinaryReader reader1;
6 private readonly BinaryReader reader2;
7 private bool equals = true;
8
9 public CompareVisitor(BinaryReader reader1, BinaryReader reader2)
10 {
11 this.reader1 = reader1;
12 this.reader2 = reader2;
13 }
14
15 public bool AreEquals => equals;
16
17 public override void VisitByte(MetaByte type) => equals = (reader1.ReadByte() == reader2.ReadByte());
18 public override void VisitInt16(MetaInt16 type) => equals = (reader1.ReadInt16() == reader2.ReadInt16());
19 public override void VisitInt32(MetaInt32 type) => equals = (reader1.ReadInt32() == reader2.ReadInt32());
20 public override void VisitUInt32(MetaUInt32 type) => equals = (reader1.ReadUInt32() == reader2.ReadUInt32());
21 public override void VisitInt64(MetaInt64 type) => equals = (reader1.ReadInt64() == reader2.ReadInt64());
22 public override void VisitUInt64(MetaUInt64 type) => equals = (reader1.ReadUInt64() == reader2.ReadUInt64());
23 public override void VisitFloat(MetaFloat type) => equals = (reader1.ReadSingle() == reader2.ReadSingle());
24 public override void VisitColor(MetaColor type) => equals = (reader1.ReadInt32() == reader2.ReadInt32());
25 public override void VisitRawOffset(MetaRawOffset type) => equals = (reader1.ReadInt32() == reader2.ReadInt32());
26 public override void VisitSepOffset(MetaSepOffset type) => equals = (reader1.ReadInt32() == reader2.ReadInt32());
27 public override void VisitPointer(MetaPointer type) => equals = (reader1.ReadInt32() == reader2.ReadInt32());
28 public override void VisitString(MetaString type) => equals = (reader1.ReadString(type.Count) == reader2.ReadString(type.Count));
29
30 public override void VisitPadding(MetaPadding type)
31 {
32 reader1.Skip(type.Count);
33 reader2.Skip(type.Count);
34 }
35
36 public override void VisitStruct(MetaStruct type)
37 {
38 foreach (var field in type.Fields)
39 {
40 field.Type.Accept(this);
41
42 if (!equals)
43 break;
44 }
45 }
46
47 public override void VisitArray(MetaArray type)
48 {
49 CompareArray(type.ElementType, type.Count);
50 }
51
52 public override void VisitVarArray(MetaVarArray type)
53 {
54 int count1, count2;
55
56 if (type.CountField.Type == MetaType.Int16)
57 {
58 count1 = reader1.ReadInt16();
59 count2 = reader2.ReadInt16();
60 }
61 else
62 {
63 count1 = reader1.ReadInt32();
64 count2 = reader2.ReadInt32();
65 }
66
67 equals = (count1 == count2);
68
69 if (!equals)
70 return;
71
72 CompareArray(type.ElementType, count1);
73 }
74
75 private void CompareArray(MetaType elementType, int count)
76 {
77 for (int i = 0; i < count; i++)
78 {
79 elementType.Accept(this);
80
81 if (!equals)
82 break;
83 }
84 }
85 }
86}
Note: See TracBrowser for help on using the repository browser.