Skip to content

Commit

Permalink
Update BymlArrayChangelog
Browse files Browse the repository at this point in the history
Allow duplicate indices
  • Loading branch information
ArchLeaders committed Dec 7, 2024
1 parent 8792eab commit e7d2baa
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 49 deletions.
4 changes: 2 additions & 2 deletions src/BymlLibrary/Byml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@ public Byml(BymlHashMap64 hashMap64)
Value = hashMap64;
}

public static implicit operator Byml(Dictionary<int, (BymlChangeType, Byml)> arrayChangelog) => new(arrayChangelog);
public Byml(IDictionary<int, (BymlChangeType, Byml)> arrayChangelog) : this(new BymlArrayChangelog(arrayChangelog))
public static implicit operator Byml(List<(int, BymlChangeType, Byml)> arrayChangelog) => new(arrayChangelog);
public Byml(IEnumerable<(int, BymlChangeType, Byml)> arrayChangelog) : this(new BymlArrayChangelog(arrayChangelog))
{
}

Expand Down
18 changes: 8 additions & 10 deletions src/BymlLibrary/ImmutableByml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public ImmutableByml(ref RevrsReader reader)
$"Invalid BYML magic: '{Encoding.UTF8.GetString(BitConverter.GetBytes(Header.Magic))}'");
}

if (Header.Version < 2 || Header.Version > 7) {
if (Header.Version is < 2 or > 7) {
throw new InvalidDataException(
$"Unsupported BYML version: '{Header.Version}'");
}
Expand All @@ -56,7 +56,7 @@ public ImmutableByml(ref RevrsReader reader)
reader.Seek(Header.KeyTableOffset);
ref BymlContainer keyTableHeader
= ref CheckContainerHeader(ref reader, BymlNodeType.StringTable);
KeyTable = new(_data, Header.KeyTableOffset, keyTableHeader.Count);
KeyTable = new ImmutableBymlStringTable(_data, Header.KeyTableOffset, keyTableHeader.Count);

if (reader.Endianness.IsNotSystemEndianness()) {
ImmutableBymlStringTable.Reverse(ref reader, Header.KeyTableOffset, keyTableHeader.Count);
Expand All @@ -67,15 +67,15 @@ ref BymlContainer keyTableHeader
reader.Seek(Header.StringTableOffset);
ref BymlContainer stringTableHeader
= ref CheckContainerHeader(ref reader, BymlNodeType.StringTable);
StringTable = new(_data, Header.StringTableOffset, stringTableHeader.Count);
StringTable = new ImmutableBymlStringTable(_data, Header.StringTableOffset, stringTableHeader.Count);

if (reader.Endianness.IsNotSystemEndianness()) {
ImmutableBymlStringTable.Reverse(ref reader, Header.KeyTableOffset, stringTableHeader.Count);
}
}

if (reader.Endianness.IsNotSystemEndianness()) {
// So much for 0 allocation :sadge:
// So much for 0 allocation
HashSet<int> reversedOffsets = [
Header.KeyTableOffset,
Header.StringTableOffset,
Expand All @@ -86,15 +86,15 @@ ref BymlContainer stringTableHeader
}

ref BymlContainer rootNodeHeader
= ref _data[(_value = new(Header.RootNodeOffset)).Offset..].Read<BymlContainer>();
= ref _data[(_value = new BymlValue(Header.RootNodeOffset)).Offset..].Read<BymlContainer>();
Type = rootNodeHeader.Type;
Endianness = reader.Endianness;
}

internal ImmutableByml(Span<byte> data, int value, BymlNodeType type)
{
_data = data;
_value = new(value);
_value = new BymlValue(value);
Type = type;
}

Expand Down Expand Up @@ -158,7 +158,7 @@ public readonly ImmutableBymlStringTable GetStringTable()
{
ref BymlContainer header
= ref CheckContainerHeader(BymlNodeType.StringTable);
return new(_data, _value.Offset, header.Count);
return new ImmutableBymlStringTable(_data, _value.Offset, header.Count);
}

//
Expand Down Expand Up @@ -260,12 +260,10 @@ internal static void ReverseNode(ref RevrsReader reader, int value, BymlNodeType
return;
}

if (reversedOffsets.Contains(value)) {
if (!reversedOffsets.Add(value)) {
return;
}

reversedOffsets.Add(value);

if (type.IsContainerType()) {
ReverseContainer(ref reader, value, reversedOffsets);
}
Expand Down
38 changes: 17 additions & 21 deletions src/BymlLibrary/Nodes/Containers/BymlArrayChangelog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@

namespace BymlLibrary.Nodes.Containers;

public class BymlArrayChangelog : SortedDictionary<int, (BymlChangeType, Byml)>, IBymlNode
public class BymlArrayChangelog : List<(int, BymlChangeType, Byml)>, IBymlNode
{
public BymlArrayChangelog()
{
}

public BymlArrayChangelog(IDictionary<int, (BymlChangeType, Byml)> values) : base(values)
public BymlArrayChangelog(IEnumerable<(int, BymlChangeType, Byml)> values) : base(values)
{
}

Expand All @@ -21,8 +21,8 @@ public void EmitYaml(ref Utf8YamlEmitter emitter)
emitter.Tag("!array_changelog");
emitter.BeginMapping();

foreach (var (hash, (change, node)) in this) {
emitter.WriteInt32(hash);
foreach ((int index, BymlChangeType change, Byml node) in this) {
emitter.WriteInt32(index);
emitter.BeginMapping(MappingStyle.Flow);
{
emitter.WriteString(change.ToString());
Expand All @@ -36,7 +36,7 @@ public void EmitYaml(ref Utf8YamlEmitter emitter)

public bool HasContainerNodes()
{
foreach (var (_, (_, node)) in this) {
foreach ((_, _, Byml node) in this) {
if (node.Type.IsContainerType()) {
return true;
}
Expand All @@ -48,8 +48,8 @@ public bool HasContainerNodes()
public int GetValueHash()
{
HashCode hashCode = new();
foreach (var (key, (change, node)) in this) {
hashCode.Add(key);
foreach ((int index, BymlChangeType change, Byml node) in this) {
hashCode.Add(index);
hashCode.Add(change);
hashCode.Add(Byml.ValueEqualityComparer.Default.GetHashCode(node));
}
Expand All @@ -61,8 +61,8 @@ public int GetValueHash()
int IBymlNode.Collect(in BymlWriter writer)
{
HashCode hashCode = new();
foreach (var (key, (change, node)) in this) {
hashCode.Add(key);
foreach ((int index, BymlChangeType change, Byml node) in this) {
hashCode.Add(index);
hashCode.Add(change);
hashCode.Add(writer.Collect(node));
}
Expand All @@ -74,13 +74,13 @@ int IBymlNode.Collect(in BymlWriter writer)
void IBymlNode.Write(BymlWriter context, Action<Byml> write)
{
context.WriteContainerHeader(BymlNodeType.ArrayChangelog, Count);
foreach (var (key, (change, node)) in this) {
context.Writer.Write(key);
foreach ((int index, BymlChangeType change, Byml node) in this) {
context.Writer.Write(index);
context.Writer.Write(change);
write(node);
}

foreach ((_, Byml node) in Values) {
foreach ((_, _, Byml node) in this) {
context.Writer.Write(node.Type);
}

Expand All @@ -95,29 +95,25 @@ public bool Equals(BymlArrayChangelog? x, BymlArrayChangelog? y)
return y == x;
}

if (x.Count != y.Count) {
return false;
}

return x.Keys.SequenceEqual(y.Keys) && x.Values.SequenceEqual(y.Values, EntryValueEqualityComparer.Default);
return x.Count == y.Count && x.SequenceEqual(y, EntryValueEqualityComparer.Default);
}

public int GetHashCode([DisallowNull] BymlArrayChangelog obj)
public int GetHashCode(BymlArrayChangelog obj)
{
throw new NotImplementedException();
}
}

private class EntryValueEqualityComparer : IEqualityComparer<(BymlChangeType Change, Byml Node)>
private class EntryValueEqualityComparer : IEqualityComparer<(int Index, BymlChangeType Change, Byml Node)>
{
public static readonly EntryValueEqualityComparer Default = new();

public bool Equals((BymlChangeType Change, Byml Node) x, (BymlChangeType Change, Byml Node) y)
public bool Equals((int Index, BymlChangeType Change, Byml Node) x, (int Index, BymlChangeType Change, Byml Node) y)
{
return x.Change == y.Change && Byml.ValueEqualityComparer.Default.Equals(x.Node, y.Node);
}

public int GetHashCode([DisallowNull] (BymlChangeType, Byml) obj)
public int GetHashCode((int, BymlChangeType, Byml) obj)
{
throw new NotImplementedException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public readonly ImmutableBymlArrayChangelogEntry this[int index] {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get {
Entry entry = _entries[index];
return new(entry.Index, entry.Change, _data, entry.Value, _types[index]);
return new ImmutableBymlArrayChangelogEntry(entry.Index, entry.Change, _data, entry.Value, _types[index]);
}
}

Expand All @@ -64,8 +64,7 @@ public static void Reverse(in Span<byte> slice)
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public readonly Enumerator GetEnumerator()
=> new(this);
public Enumerator GetEnumerator() => new(this);

[method: MethodImpl(MethodImplOptions.AggressiveInlining)]
public ref struct Enumerator(ImmutableBymlArrayChangelog container)
Expand All @@ -81,32 +80,30 @@ public readonly ImmutableBymlArrayChangelogEntry Current {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool MoveNext()
{
if (++_index >= _container.Count) {
return false;
}

return true;
return ++_index < _container.Count;
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public BymlArrayChangelog ToMutable(in ImmutableByml root)
{
BymlArrayChangelog arrayChangelog = [];
foreach (var (key, change, value) in this) {
arrayChangelog[key] = (change, Byml.FromImmutable(value, root));
foreach ((int index, BymlChangeType change, ImmutableByml value) in this) {
arrayChangelog.Add(
(index, change, Byml.FromImmutable(value, root))
);
}

return arrayChangelog;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal unsafe void EmitYaml(ref Utf8YamlEmitter emitter, in ImmutableByml root)
internal void EmitYaml(ref Utf8YamlEmitter emitter, in ImmutableByml root)
{
emitter.Tag("!array-changelog");
emitter.BeginMapping();

foreach (var (index, change, node) in this) {
foreach ((int index, BymlChangeType change, ImmutableByml node) in this) {
emitter.WriteInt32(index);
emitter.BeginMapping();
{
Expand All @@ -124,11 +121,11 @@ public static void Reverse(ref RevrsReader reader, int offset, int count, in Has
{
for (int i = 0; i < count; i++) {
Entry entry = reader.Read<Entry, Entry.Reverser>(
offset + BymlContainer.SIZE + (Entry.SIZE * i)
offset + BymlContainer.SIZE + Entry.SIZE * i
);

ImmutableByml.ReverseNode(ref reader, entry.Value,
reader.Read<BymlNodeType>(offset + BymlContainer.SIZE + (Entry.SIZE * count) + i),
reader.Read<BymlNodeType>(offset + BymlContainer.SIZE + Entry.SIZE * count + i),
reversedOffsets
);
}
Expand Down
5 changes: 3 additions & 2 deletions src/BymlLibrary/Yaml/BymlYamlReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,10 +169,11 @@ private static Byml ParseArrayChangelog(ref YamlParser parser)
int indexKey = parser.ReadScalarAsInt32();

parser.SkipAfter(ParseEventType.MappingStart);
arrayChangelog[indexKey] = (
arrayChangelog.Add((
indexKey,
Enum.Parse<BymlChangeType>(parser.ReadScalarAsString() ?? string.Empty),
Parse(ref parser)
);
));
parser.SkipAfter(ParseEventType.MappingEnd);
}

Expand Down

0 comments on commit e7d2baa

Please sign in to comment.