ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/OniSplit/Metadata/LinkVisitor.cs
Revision: 1114
Committed: Wed Jan 22 14:08:57 2020 UTC (5 years, 8 months ago) by iritscen
File size: 2813 byte(s)
Log Message:
Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File Contents

# Content
1 using System;
2 using System.Collections.Generic;
3
4 namespace Oni.Metadata
5 {
6 internal class LinkVisitor : MetaTypeVisitor
7 {
8 private readonly List<int> links = new List<int>();
9 private readonly BinaryReader reader;
10
11 public LinkVisitor(BinaryReader reader)
12 {
13 this.reader = reader;
14 }
15
16 public ICollection<int> Links => links;
17
18 public override void VisitByte(MetaByte type) => reader.Position += type.Size;
19 public override void VisitInt16(MetaInt16 type) => reader.Position += type.Size;
20 public override void VisitUInt16(MetaUInt16 type) => reader.Position += type.Size;
21 public override void VisitInt32(MetaInt32 type) => reader.Position += type.Size;
22 public override void VisitUInt32(MetaUInt32 type) => reader.Position += type.Size;
23 public override void VisitInt64(MetaInt64 type) => reader.Position += type.Size;
24 public override void VisitUInt64(MetaUInt64 type) => reader.Position += type.Size;
25 public override void VisitFloat(MetaFloat type) => reader.Position += type.Size;
26 public override void VisitColor(MetaColor type) => reader.Position += type.Size;
27 public override void VisitRawOffset(MetaRawOffset type) => reader.Position += type.Size;
28 public override void VisitSepOffset(MetaSepOffset type) => reader.Position += type.Size;
29
30 public override void VisitPointer(MetaPointer type)
31 {
32 int id = reader.ReadInt32();
33
34 if (id != 0)
35 links.Add(id);
36 }
37
38 public override void VisitString(MetaString type) => reader.Position += type.Size;
39 public override void VisitPadding(MetaPadding type) => reader.Position += type.Size;
40
41 public override void VisitStruct(MetaStruct type)
42 {
43 foreach (Field field in type.Fields)
44 field.Type.Accept(this);
45 }
46
47 public override void VisitArray(MetaArray type) => VisitArray(type.ElementType, type.Count);
48
49 public override void VisitVarArray(MetaVarArray type)
50 {
51 int count;
52
53 if (type.CountField.Type == MetaType.Int16)
54 count = reader.ReadUInt16();
55 else
56 count = reader.ReadInt32();
57
58 VisitArray(type.ElementType, count);
59 }
60
61 private void VisitArray(MetaType elementType, int count)
62 {
63 if (elementType is MetaPointer || elementType is MetaStruct)
64 {
65 for (int i = 0; i < count; i++)
66 elementType.Accept(this);
67 }
68 else
69 {
70 reader.Position += elementType.Size * count;
71 }
72 }
73 }
74 }