Skip to content

Commit af069c9

Browse files
committed
Extend BitmapIndexedMapNode with Sequence protocol
Further adds `count`to the node implementation for checking invariants.
1 parent 339ce13 commit af069c9

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

Sources/Capsule/_BitmapIndexedMapNode.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ final class BitmapIndexedMapNode<Key, Value>: MapNode where Key: Hashable {
2626
self.bitmap1 = dataMap ^ collMap
2727
self.bitmap2 = nodeMap ^ collMap
2828
self.content = content
29+
30+
assert(count - payloadArity >= 2 * nodeArity)
2931
}
3032

3133
convenience init(dataMap: Bitmap = 0, nodeMap: Bitmap = 0, collMap: Bitmap = 0, arrayLiteral content: Any...) {
@@ -47,6 +49,10 @@ final class BitmapIndexedMapNode<Key, Value>: MapNode where Key: Hashable {
4749
self.init(0, 0, collMap, elements)
4850
}
4951

52+
var count: Int {
53+
self.reduce(0, { count, _ in count + 1 })
54+
}
55+
5056
func get(_ key: Key, _ keyHash: Int, _ shift: Int) -> Value? {
5157
let mask = maskFrom(keyHash, shift)
5258
let bitpos = bitposFrom(mask)
@@ -521,3 +527,9 @@ extension BitmapIndexedMapNode: Equatable where Value: Equatable {
521527
return true
522528
}
523529
}
530+
531+
extension BitmapIndexedMapNode: Sequence {
532+
public __consuming func makeIterator() -> MapKeyValueTupleIterator<Key, Value> {
533+
return MapKeyValueTupleIterator(rootNode: self)
534+
}
535+
}

0 commit comments

Comments
 (0)