Skip to content

Commit 0255a1d

Browse files
committed
fix: when enumerating, the negative ones came after the positive ones
1 parent b4478db commit 0255a1d

File tree

1 file changed

+49
-38
lines changed

1 file changed

+49
-38
lines changed

src/IntSet/IntSet.cs

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using System.Runtime.CompilerServices;
77
using System.Security;
8+
using System.Xml.Linq;
89

910
namespace Kibnet
1011
{
@@ -508,56 +509,66 @@ public static void GetMask(Span<char> span, Card arg)
508509

509510
public IEnumerator<int> GetEnumerator()
510511
{
511-
foreach (var i0 in (IEnumerable<int>)root)
512+
foreach (var i0 in TraverseRootCards(root))
512513
{
513-
var cards1 = root.Full ? root : root.Cards[i0];
514-
if (cards1 != null)
514+
foreach (var i1 in TraverseCards(root, i0))
515515
{
516-
foreach (var i1 in (IEnumerable<int>)cards1)
516+
foreach (var i2 in TraverseCards(root, i0, i1))
517517
{
518-
var cards2 = cards1.Full ? cards1 : cards1.Cards[i1];
519-
if (cards2 != null)
518+
foreach (var i3 in TraverseCards(root, i0, i1, i2))
520519
{
521-
foreach (var i2 in (IEnumerable<int>)cards2)
520+
foreach (var value in ProcessBytes(root, i0, i1, i2, i3))
522521
{
523-
var cards3 = cards2.Full ? cards2 : cards2.Cards[i2];
524-
if (cards3 != null)
525-
{
526-
foreach (var i3 in (IEnumerable<int>)cards3)
527-
{
528-
var bytes = cards3.Full ? cards3 : cards3.Cards[i3];
529-
if (bytes != null)
530-
{
531-
var bytecount = 0;
532-
foreach (var i4 in (IEnumerable<byte>)bytes)
533-
{
534-
for (int j = 0; j < 8; j++)
535-
{
536-
var tail = i4 & (1 << j);
537-
if (tail != 0)
538-
{
539-
var value = i0 << 26;
540-
value |= i1 << 20;
541-
value |= i2 << 14;
542-
value |= i3 << 8;
543-
value |= bytecount << 3;
544-
value |= j;
545-
yield return value;
546-
}
547-
}
548-
549-
bytecount++;
550-
}
551-
}
552-
}
553-
}
522+
yield return value;
554523
}
555524
}
556525
}
557526
}
558527
}
559528
}
560529

530+
private IEnumerable<int> TraverseRootCards(Card root)
531+
{
532+
for (int i0 = 32; i0 < 64; i0++)
533+
{
534+
if (root.Cards[i0] != null)
535+
{
536+
yield return i0;
537+
}
538+
}
539+
for (int i0 = 0; i0 < 32; i0++)
540+
{
541+
if (root.Cards[i0] != null)
542+
{
543+
yield return i0;
544+
}
545+
}
546+
}
547+
548+
private IEnumerable<int> TraverseCards(Card node, params int[] indices)
549+
{
550+
var current = indices.Aggregate(node, (n, index) => n.Full ? n : n.Cards[index]);
551+
return current != null ? (IEnumerable<int>)current : [];
552+
}
553+
554+
private IEnumerable<int> ProcessBytes(Card root, int i0, int i1, int i2, int i3)
555+
{
556+
var bytes = TraverseCards(root, i0, i1, i2, i3);
557+
int byteCount = 0;
558+
559+
foreach (var i4 in bytes.Cast<byte>())
560+
{
561+
for (int j = 0; j < 8; j++)
562+
{
563+
if ((i4 & (1 << j)) != 0)
564+
{
565+
yield return (i0 << 26) | (i1 << 20) | (i2 << 14) | (i3 << 8) | (byteCount << 3) | j;
566+
}
567+
}
568+
byteCount++;
569+
}
570+
}
571+
561572
#endregion
562573

563574
#region ICollection<T>

0 commit comments

Comments
 (0)