|
5 | 5 | using System.Linq; |
6 | 6 | using System.Runtime.CompilerServices; |
7 | 7 | using System.Security; |
| 8 | +using System.Xml.Linq; |
8 | 9 |
|
9 | 10 | namespace Kibnet |
10 | 11 | { |
@@ -508,56 +509,66 @@ public static void GetMask(Span<char> span, Card arg) |
508 | 509 |
|
509 | 510 | public IEnumerator<int> GetEnumerator() |
510 | 511 | { |
511 | | - foreach (var i0 in (IEnumerable<int>)root) |
| 512 | + foreach (var i0 in TraverseRootCards(root)) |
512 | 513 | { |
513 | | - var cards1 = root.Full ? root : root.Cards[i0]; |
514 | | - if (cards1 != null) |
| 514 | + foreach (var i1 in TraverseCards(root, i0)) |
515 | 515 | { |
516 | | - foreach (var i1 in (IEnumerable<int>)cards1) |
| 516 | + foreach (var i2 in TraverseCards(root, i0, i1)) |
517 | 517 | { |
518 | | - var cards2 = cards1.Full ? cards1 : cards1.Cards[i1]; |
519 | | - if (cards2 != null) |
| 518 | + foreach (var i3 in TraverseCards(root, i0, i1, i2)) |
520 | 519 | { |
521 | | - foreach (var i2 in (IEnumerable<int>)cards2) |
| 520 | + foreach (var value in ProcessBytes(root, i0, i1, i2, i3)) |
522 | 521 | { |
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; |
554 | 523 | } |
555 | 524 | } |
556 | 525 | } |
557 | 526 | } |
558 | 527 | } |
559 | 528 | } |
560 | 529 |
|
| 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 | + |
561 | 572 | #endregion |
562 | 573 |
|
563 | 574 | #region ICollection<T> |
|
0 commit comments