fix: Removes broken OrderedHashSet and adds a simple OrderedSet (#1756)
> [!CAUTION] > **BREAKING CHANGE** > Removed `OrderdHashSet` and `PooledOrderedHashSet` due to bugs. > [!NOTE] > **Developer Note** > The OrderedSet is not a full data structure. It is not particularly efficient. Pull Requests are welcome for a better implementation, especially if it ends up supporting `ISet<T>` and `IReadOnlySet<T>` ## Summary The ordered hash set was buggy. It's kind of painful to implement, so for now, I added a simple `OrderedSet` to suffice for gumps. Please reach out if this causes disruption!
This commit is contained in:
parent
dc118d836f
commit
4ea1d79cad
30 changed files with 121 additions and 1258 deletions
|
|
@ -36,7 +36,7 @@ public class GumpAlphaRegion : GumpEntry
|
|||
|
||||
public int Height { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ checkertrans {X} {Y} {Width} {Height} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class GumpBackground : GumpEntry
|
|||
|
||||
public int GumpID { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ resizepic {X} {Y} {GumpID} {Width} {Height} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ public class GumpButton : GumpEntry
|
|||
|
||||
public int Param { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ button {X} {Y} {NormalID} {PressedID} {(int)Type} {Param} {ButtonID} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public class GumpCheck : GumpEntry
|
|||
|
||||
public int SwitchID { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var initialState = InitialState ? "1" : "0";
|
||||
writer.WriteAscii($"{{ checkbox {X} {Y} {InactiveID} {ActiveID} {initialState} {SwitchID} }}");
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ namespace Server.Gumps;
|
|||
|
||||
public class GumpECHandleInput : GumpEntry
|
||||
{
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.Write("{ echandleinput }"u8);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,5 @@ public abstract class GumpEntry
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Replace OrderedHashSet with InsertOnlyHashSet, a copy of HashSet that is ReadOnly compatible, but includes
|
||||
// a public AddIfNotPresent function that returns the index of the element
|
||||
public abstract void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches);
|
||||
public abstract void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public class GumpGroup : GumpEntry
|
|||
|
||||
public int Group { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
if (Group == 1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -45,9 +45,9 @@ public class GumpHtml : GumpEntry
|
|||
|
||||
public bool Scrollbar { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var textIndex = strings.GetOrAdd(Text ?? "");
|
||||
var textIndex = strings.Add(Text ?? "");
|
||||
var background = Background ? "1" : "0";
|
||||
var scrollbar = Scrollbar ? "1" : "0";
|
||||
writer.WriteAscii($"{{ htmlgump {X} {Y} {Width} {Height} {textIndex} {background} {scrollbar} }}");
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ public class GumpHtmlLocalized : GumpEntry
|
|||
public GumpHtmlLocalizedType Type { get; set; }
|
||||
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var background = Background ? "1" : "0";
|
||||
var scrollbar = Scrollbar ? "1" : "0";
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class GumpImage : GumpEntry
|
|||
|
||||
public string Class { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var hasHue = Hue != 0;
|
||||
var hasClass = !string.IsNullOrEmpty(Class);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ public class GumpImageTileButton : GumpEntry
|
|||
|
||||
public int Height { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii(
|
||||
$"{{ buttontileart {X} {Y} {NormalID} {PressedID} {(int)Type} {Param} {ButtonID} {ItemID} {Hue} {Width} {Height} }}"
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class GumpImageTiled : GumpEntry
|
|||
|
||||
public int GumpID { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ gumppictiled {X} {Y} {Width} {Height} {GumpID} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ public class GumpItem : GumpEntry
|
|||
|
||||
public int Hue { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii(Hue == 0 ? $"{{ tilepic {X} {Y} {ItemID} }}" : $"{{ tilepichue {X} {Y} {ItemID} {Hue} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public class GumpItemProperty : GumpEntry
|
|||
|
||||
public Serial Serial { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ itemproperty {Serial.Value} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,9 +36,9 @@ public class GumpLabel : GumpEntry
|
|||
|
||||
public string Text { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var textIndex = strings.GetOrAdd(Text ?? "");
|
||||
var textIndex = strings.Add(Text ?? "");
|
||||
writer.WriteAscii($"{{ text {X} {Y} {Hue} {textIndex} }}");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,9 +42,9 @@ public class GumpLabelCropped : GumpEntry
|
|||
|
||||
public string Text { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var textIndex = strings.GetOrAdd(Text ?? "");
|
||||
var textIndex = strings.Add(Text ?? "");
|
||||
writer.WriteAscii($"{{ croppedtext {X} {Y} {Width} {Height} {Hue} {textIndex} }}");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public class GumpMasterGump : GumpEntry
|
|||
|
||||
public int GumpID { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ mastergump {GumpID} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public class GumpPage : GumpEntry
|
|||
|
||||
public int Page { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
if (Page == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public class GumpRadio : GumpEntry
|
|||
|
||||
public int SwitchID { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var initialState = InitialState ? "1" : "0";
|
||||
writer.WriteAscii($"{{ radio {X} {Y} {InactiveID} {ActiveID} {initialState} {SwitchID} }}");
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ public class GumpSpriteImage : GumpEntry
|
|||
|
||||
public int SY { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii($"{{ picinpic {X} {Y} {GumpID} {Width} {Height} {SX} {SY} }}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,9 +45,9 @@ public class GumpTextEntry : GumpEntry
|
|||
|
||||
public string InitialText { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var textIndex = strings.GetOrAdd(InitialText ?? "");
|
||||
var textIndex = strings.Add(InitialText ?? "");
|
||||
writer.WriteAscii($"{{ textentry {X} {Y} {Width} {Height} {Hue} {EntryID} {textIndex} }}");
|
||||
entries++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,9 +50,9 @@ public class GumpTextEntryLimited : GumpEntry
|
|||
|
||||
public int Size { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
var textIndex = strings.GetOrAdd(InitialText ?? "");
|
||||
var textIndex = strings.Add(InitialText ?? "");
|
||||
writer.WriteAscii($"{{ textentrylimited {X} {Y} {Width} {Height} {Hue} {EntryID} {textIndex} {Size} }}");
|
||||
entries++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ public class GumpTooltip : GumpEntry
|
|||
|
||||
public string Args { get; set; }
|
||||
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedHashSet<string> strings, ref int entries, ref int switches)
|
||||
public override void AppendTo(ref SpanWriter writer, OrderedSet<string> strings, ref int entries, ref int switches)
|
||||
{
|
||||
writer.WriteAscii(string.IsNullOrEmpty(Args) ? $"{{ tooltip {Number} }}" : $"{{ tooltip {Number} @{Args}@ }}");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue