1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
|
4 |
namespace Oni.Metadata |
5 |
{ |
6 |
internal class MetaStruct : MetaType |
7 |
{ |
8 |
private readonly List<Field> fields = new List<Field>(); |
9 |
private readonly MetaStruct baseStruct; |
10 |
|
11 |
public MetaStruct(params Field[] declaredFields) |
12 |
: this(null, null, declaredFields) |
13 |
{ |
14 |
} |
15 |
|
16 |
public MetaStruct(MetaStruct baseStruct, params Field[] declaredFields) |
17 |
: this(null, null, declaredFields) |
18 |
{ |
19 |
} |
20 |
|
21 |
public MetaStruct(string name, params Field[] declaredFields) |
22 |
: this(name, null, declaredFields) |
23 |
{ |
24 |
} |
25 |
|
26 |
public MetaStruct(string name, MetaStruct baseStruct, params Field[] declaredFields) |
27 |
{ |
28 |
this.baseStruct = baseStruct; |
29 |
|
30 |
if (baseStruct != null) |
31 |
fields.AddRange(baseStruct.fields); |
32 |
|
33 |
fields.AddRange(declaredFields); |
34 |
|
35 |
int size = 0; |
36 |
|
37 |
foreach (var field in fields) |
38 |
size += field.Type.Size; |
39 |
|
40 |
Name = name; |
41 |
Size = size; |
42 |
} |
43 |
|
44 |
public IEnumerable<Field> Fields => fields; |
45 |
|
46 |
protected override bool IsLeafImpl() |
47 |
{ |
48 |
foreach (var field in fields) |
49 |
{ |
50 |
if (!field.Type.IsLeaf) |
51 |
return false; |
52 |
} |
53 |
|
54 |
return true; |
55 |
} |
56 |
|
57 |
public override void Accept(IMetaTypeVisitor visitor) |
58 |
{ |
59 |
visitor.VisitStruct(this); |
60 |
} |
61 |
} |
62 |
} |