public StructDefinition Resolve(GR2Reader gr2) { Debug.Assert(IsValid); // Type definitions use a 2-level cache // First we'll check the reference itself, if it has a cached ref to the resolved type // If it has, we have nothing to do // If the struct wasn't resolved yet, try the type definition cache // When a type definition is read from the GR2 file, it is stored here using its definition address as a key if (Type == null) { gr2.Types.TryGetValue(this, out Type); } if (Type == null) { // We haven't seen this type before, read its definition from the file and cache it #if DEBUG_GR2_SERIALIZATION System.Console.WriteLine(String.Format(" ===== Struct definition at {0:X8} ===== ", Offset)); #endif var originalPos = gr2.Stream.Position; gr2.Seek(this); Type = gr2.ReadStructDefinition(); gr2.Stream.Seek(originalPos, SeekOrigin.Begin); gr2.Types[this] = Type; } return(Type); }
public string Resolve(GR2Reader gr2) { Debug.Assert(IsValid); // Don't use a global string cache here, as string constants are rarely referenced twice, // unlike struct definitions if (Value == null) { var originalPos = gr2.Stream.Position; gr2.Seek(this); Value = gr2.ReadString(); gr2.Stream.Seek(originalPos, SeekOrigin.Begin); } return(Value); }
public List <RelocatableReference> Resolve(GR2Reader gr2) { Debug.Assert(IsValid); if (Items == null) { #if DEBUG_GR2_SERIALIZATION System.Console.WriteLine(String.Format(" (Reference list at {0:X8})", Offset)); #endif var originalPos = gr2.Stream.Position; gr2.Seek(this); Items = new List <RelocatableReference>(); for (int i = 0; i < Size; i++) { Items.Add(gr2.ReadReference()); #if DEBUG_GR2_SERIALIZATION System.Console.WriteLine(String.Format(" {0:X8}", r.Offset)); #endif } gr2.Stream.Seek(originalPos, SeekOrigin.Begin); } return(Items); }