Skip to content

Commit

Permalink
remove manually calculating the struct sizes
Browse files Browse the repository at this point in the history
  • Loading branch information
diogotr7 committed Jan 19, 2025
1 parent 9fbac85 commit 0c81943
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 68 deletions.
73 changes: 10 additions & 63 deletions src/StarBreaker.DataCore/DataCoreDatabase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Frozen;
using System.Runtime.CompilerServices;
using System.Text;
using StarBreaker.Common;

Expand Down Expand Up @@ -42,7 +41,7 @@ public sealed class DataCoreDatabase
public readonly DataCoreStringId2[] EnumOptions;
public readonly FrozenSet<CigGuid> MainRecords;

private readonly FrozenDictionary<int, StructOffsetAndSize> Offsets;
public readonly int[] Offsets;
private readonly DataCorePropertyDefinition[][] Properties;
private readonly FrozenDictionary<int, string> CachedStrings;
private readonly FrozenDictionary<int, string> CachedStrings2;
Expand Down Expand Up @@ -144,9 +143,10 @@ public DataCoreDatabase(Stream fs)

public SpanReader GetReader(int structIndex, int instanceIndex)
{
var info = Offsets[structIndex];
var offset = info.Offset + info.Size * instanceIndex;
return new SpanReader(DataSection, offset - DataSectionOffset);
var structTypeOffset = Offsets[structIndex];
var size = StructDefinitions[structIndex].StructSize;
var offset = structTypeOffset + size * instanceIndex;
return new SpanReader(DataSection, (int)offset - DataSectionOffset);
}

public string GetString(DataCoreStringId id) => CachedStrings[id.Id];
Expand All @@ -171,19 +171,19 @@ private static FrozenDictionary<int, string> ReadStringTable(ReadOnlySpan<byte>
return strings.ToFrozenDictionary();
}

private FrozenDictionary<int, StructOffsetAndSize> ReadOffsets(int initialOffset, ReadOnlySpan<DataCoreDataMapping> mappings)
private int[] ReadOffsets(int initialOffset, ReadOnlySpan<DataCoreDataMapping> mappings)
{
var instances = new Dictionary<int, StructOffsetAndSize>();
var offsets = new int[StructDefinitions.Length];

var offset = initialOffset;
foreach (var mapping in mappings)
{
var size = CalculateStructSize(mapping.StructIndex);
instances[mapping.StructIndex] = new StructOffsetAndSize(offset, size);
var size = StructDefinitions[mapping.StructIndex].StructSize;
offsets[mapping.StructIndex] = offset;
offset += (int)(size * mapping.StructCount);
}

return instances.ToFrozenDictionary();
return offsets;
}

private DataCorePropertyDefinition[][] ReadProperties()
Expand Down Expand Up @@ -236,57 +236,4 @@ private static DataCorePropertyDefinition[] GetStructProperties(int index, DataC

return result;
}

private int CalculateStructSize(int structIndex)
{
var size = 0;

foreach (var attribute in GetProperties(structIndex))
{
if (attribute.ConversionType != ConversionType.Attribute)
{
//array count + array offset
size += sizeof(int) * 2;
continue;
}

size += attribute.DataType switch
{
DataType.Reference => Unsafe.SizeOf<DataCoreReference>(),
DataType.WeakPointer => Unsafe.SizeOf<DataCorePointer>(),
DataType.StrongPointer => Unsafe.SizeOf<DataCorePointer>(),
DataType.EnumChoice => Unsafe.SizeOf<DataCoreStringId>(),
DataType.Guid => Unsafe.SizeOf<CigGuid>(),
DataType.Locale => Unsafe.SizeOf<DataCoreStringId>(),
DataType.Double => Unsafe.SizeOf<double>(),
DataType.Single => Unsafe.SizeOf<float>(),
DataType.String => Unsafe.SizeOf<DataCoreStringId>(),
DataType.UInt64 => Unsafe.SizeOf<ulong>(),
DataType.UInt32 => Unsafe.SizeOf<uint>(),
DataType.UInt16 => Unsafe.SizeOf<ushort>(),
DataType.Byte => Unsafe.SizeOf<byte>(),
DataType.Int64 => Unsafe.SizeOf<long>(),
DataType.Int32 => Unsafe.SizeOf<int>(),
DataType.Int16 => Unsafe.SizeOf<short>(),
DataType.SByte => Unsafe.SizeOf<sbyte>(),
DataType.Boolean => Unsafe.SizeOf<byte>(),
DataType.Class => CalculateStructSize(attribute.StructIndex),
_ => throw new InvalidOperationException(nameof(DataType))
};
}

return size;
}

public readonly struct StructOffsetAndSize
{
public readonly int Offset;
public readonly int Size;

public StructOffsetAndSize(int offset, int size)
{
Offset = offset;
Size = size;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public readonly record struct DataCorePropertyDefinition
public readonly DataType DataType;
public readonly ConversionType ConversionType;
private readonly ushort _padding;

public string GetName(DataCoreDatabase db) => db.GetString2(NameOffset);

#if DEBUG
Expand Down
5 changes: 2 additions & 3 deletions src/StarBreaker.DataCore/Structs/DataCoreRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ public readonly record struct DataCoreRecord
public readonly int StructIndex;
public readonly CigGuid Id;
public readonly ushort InstanceIndex;
//TODO: what is this
public readonly ushort OtherIndex;

public readonly ushort StructSize;

public string GetName(DataCoreDatabase db) => db.GetString2(NameOffset);
public string GetFileName(DataCoreDatabase db) => db.GetString(FileNameOffset);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public readonly record struct DataCoreStructDefinition
public readonly int ParentTypeIndex;
public readonly ushort AttributeCount;
public readonly ushort FirstAttributeIndex;
public readonly uint NodeType;
public readonly uint StructSize;

public string GetName(DataCoreDatabase db) => db.GetString2(NameOffset);

Expand Down

0 comments on commit 0c81943

Please sign in to comment.