|
17 | 17 | using System.Collections; |
18 | 18 | using System.Threading; |
19 | 19 | using System.Collections.Generic; |
| 20 | +using System.Text; |
20 | 21 |
|
21 | 22 | namespace clojure.lang |
22 | 23 | { |
@@ -765,6 +766,9 @@ public interface INode |
765 | 766 |
|
766 | 767 | IEnumerator Iterator(KVMangleDel<Object> d); |
767 | 768 | IEnumerator<T> IteratorT<T>(KVMangleDel<T> d); |
| 769 | + |
| 770 | + // For debugging only |
| 771 | + void PrintContents(string prefix); |
768 | 772 | } |
769 | 773 |
|
770 | 774 | #endregion |
@@ -1004,6 +1008,30 @@ static object FoldTasks(List<Func<object>> tasks, IFn combinef, IFn fjtask, IFn |
1004 | 1008 | return combinef.invoke(FoldTasks(t1, combinef, fjtask, fjfork, fjjoin), fjjoin.invoke(forked)); |
1005 | 1009 | } |
1006 | 1010 |
|
| 1011 | + public void PrintContents(string prefix) |
| 1012 | + { |
| 1013 | + var sb = new StringBuilder(prefix); |
| 1014 | + |
| 1015 | + for (int i = 0; i < _array.Length; i++) |
| 1016 | + { |
| 1017 | + INode node = _array[i]; |
| 1018 | + if (node != null) |
| 1019 | + sb.AppendFormat(" {0}:{1}", i, PersistentHashMap.NodeTypeDesignator(node)); |
| 1020 | + } |
| 1021 | + |
| 1022 | + Console.WriteLine(sb.ToString()); |
| 1023 | + |
| 1024 | + for (int i = 0; i < _array.Length; i++) |
| 1025 | + { |
| 1026 | + INode node = _array[i]; |
| 1027 | + if (node != null) |
| 1028 | + { |
| 1029 | + var newPrefix = prefix + "-" + i.ToString() + ":" + PersistentHashMap.NodeTypeDesignator(node) + ":"; |
| 1030 | + node.PrintContents(newPrefix); |
| 1031 | + } |
| 1032 | + } |
| 1033 | + } |
| 1034 | + |
1007 | 1035 | #endregion |
1008 | 1036 |
|
1009 | 1037 | #region Implementation details |
@@ -1438,6 +1466,50 @@ public object Fold(IFn combinef, IFn reducef, IFn fjtask, IFn fjfork, IFn fjjoin |
1438 | 1466 | } |
1439 | 1467 |
|
1440 | 1468 |
|
| 1469 | + public void PrintContents(string prefix) |
| 1470 | + { |
| 1471 | + var sb = new StringBuilder(prefix); |
| 1472 | + |
| 1473 | + int j = 0; |
| 1474 | + |
| 1475 | + for (int i = 0; i < 32; i++) |
| 1476 | + { |
| 1477 | + if ((_bitmap & (1 << i)) != 0) |
| 1478 | + { |
| 1479 | + var keyOrNull = _array[j]; |
| 1480 | + var valOrNode = _array[j + 1]; |
| 1481 | + if (keyOrNull == null) |
| 1482 | + sb.AppendFormat(" {0}:{1}", i, PersistentHashMap.NodeTypeDesignator((INode)valOrNode)); |
| 1483 | + else |
| 1484 | + sb.AppendFormat(" {0} = Key {1}", i, keyOrNull); |
| 1485 | + |
| 1486 | + j += 2; |
| 1487 | + } |
| 1488 | + } |
| 1489 | + |
| 1490 | + Console.WriteLine(sb.ToString()); |
| 1491 | + |
| 1492 | + |
| 1493 | + j = 0; |
| 1494 | + |
| 1495 | + for (int i = 0; i < 32; i++) |
| 1496 | + { |
| 1497 | + if ((_bitmap & (1 << i)) != 0) |
| 1498 | + { |
| 1499 | + var keyOrNull = _array[j]; |
| 1500 | + var valOrNode = _array[j + 1]; |
| 1501 | + if (keyOrNull == null) |
| 1502 | + { |
| 1503 | + var newPrefix = prefix + "-" + i.ToString() + ":" + PersistentHashMap.NodeTypeDesignator((INode)valOrNode) + ":"; |
| 1504 | + ((INode)valOrNode).PrintContents(newPrefix); |
| 1505 | + } |
| 1506 | + |
| 1507 | + |
| 1508 | + j += 2; |
| 1509 | + } |
| 1510 | + } |
| 1511 | + } |
| 1512 | + |
1441 | 1513 | #endregion |
1442 | 1514 |
|
1443 | 1515 | #region Implementation |
@@ -1655,6 +1727,18 @@ public object Fold(IFn combinef, IFn reducef, IFn fjtask, IFn fjfork, IFn fjjoin |
1655 | 1727 | return NodeSeq.KvReduce(_array, reducef, combinef.invoke()); |
1656 | 1728 | } |
1657 | 1729 |
|
| 1730 | + public void PrintContents(string prefix) |
| 1731 | + { |
| 1732 | + var sb = new StringBuilder(prefix); |
| 1733 | + |
| 1734 | + for (int i = 0; i < _array.Length; i += 2) |
| 1735 | + { |
| 1736 | + sb.AppendFormat(" {0} = Key {1}", i, _array[i]); |
| 1737 | + } |
| 1738 | + |
| 1739 | + Console.WriteLine(sb.ToString()); |
| 1740 | + } |
| 1741 | + |
1658 | 1742 | #endregion |
1659 | 1743 |
|
1660 | 1744 | #region Implementation |
@@ -1863,6 +1947,29 @@ static public object KvReduce(object[] array, IFn f, object init) |
1863 | 1947 | #endregion |
1864 | 1948 | } |
1865 | 1949 |
|
| 1950 | + #endregion |
| 1951 | + |
| 1952 | + #region debugging |
| 1953 | + |
| 1954 | + public static string NodeTypeDesignator(INode node) |
| 1955 | + { |
| 1956 | + if (node is BitmapIndexedNode) |
| 1957 | + return "B"; |
| 1958 | + if (node is ArrayNode) |
| 1959 | + return "A"; |
| 1960 | + if (node is HashCollisionNode) |
| 1961 | + return "H"; |
| 1962 | + return "?"; |
| 1963 | + } |
| 1964 | + |
| 1965 | + public void PrintContents() |
| 1966 | + { |
| 1967 | + Console.WriteLine($"PersistentHashMap: count={_count}, hashNull={_hasNull}"); |
| 1968 | + if (_root != null) |
| 1969 | + _root.PrintContents("*" + NodeTypeDesignator(_root)); |
| 1970 | + } |
| 1971 | + |
| 1972 | + |
1866 | 1973 | #endregion |
1867 | 1974 | } |
1868 | 1975 | } |
0 commit comments