Skip to content

Commit 5f56b2f

Browse files
committed
Improves BtreeNodeBuilder.
1 parent 53cf579 commit 5f56b2f

File tree

1 file changed

+16
-24
lines changed

1 file changed

+16
-24
lines changed

src/main/java/org/javimmutable/collections/btree_list/BtreeNodeBuilder.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ void add(T value)
6161

6262
BtreeNode<T> build()
6363
{
64-
return leafBuilder.snapshot().build();
64+
return leafBuilder.build().compress();
6565
}
6666

6767
private static class BranchBuilder<T>
6868
{
69-
private BtreeNode<T>[] buffer;
69+
private final BtreeNode<T>[] buffer;
7070
private int count;
7171
private BranchBuilder<T> parent;
7272

@@ -87,26 +87,23 @@ private BranchBuilder(BtreeNode<T>[] buffer,
8787

8888
private void add(@Nonnull BtreeNode<T> node)
8989
{
90+
assert count < BtreeNode.MAX_CHILDREN;
91+
buffer[count] = node;
92+
count += 1;
9093
if (count == BtreeNode.MAX_CHILDREN) {
9194
push(BtreeNode.MIN_CHILDREN);
9295
}
93-
buffer[count] = node;
94-
count += 1;
9596
}
9697

97-
private BranchBuilder<T> snapshot()
98-
{
99-
return new BranchBuilder<>(buffer.clone(), count, (parent == null) ? null : parent.snapshot());
100-
}
101-
102-
private BtreeNode<T> build()
98+
private BtreeNode<T> build(@Nonnull BtreeNode<T> extraNode)
10399
{
104-
assert count > 1;
100+
assert count < BtreeNode.MAX_CHILDREN;
101+
buffer[count] = extraNode;
102+
final BtreeNode<T> node = BtreeBranchNode.of(IndexedArray.retained(buffer), 0, count + 1);
105103
if (parent == null) {
106-
return BtreeBranchNode.of(IndexedArray.retained(buffer), 0, count);
104+
return node;
107105
} else {
108-
push(count);
109-
return parent.build();
106+
return parent.build(node);
110107
}
111108
}
112109

@@ -125,7 +122,7 @@ private void push(int howMany)
125122

126123
private static class LeafBuilder<T>
127124
{
128-
private T[] buffer;
125+
private final T[] buffer;
129126
private int count;
130127
private BranchBuilder<T> parent;
131128

@@ -146,16 +143,12 @@ private LeafBuilder(T[] buffer,
146143

147144
private void add(@Nonnull T value)
148145
{
146+
assert count < BtreeNode.MAX_CHILDREN;
147+
buffer[count] = value;
148+
count += 1;
149149
if (count == BtreeNode.MAX_CHILDREN) {
150150
push(BtreeNode.MIN_CHILDREN);
151151
}
152-
buffer[count] = value;
153-
count += 1;
154-
}
155-
156-
private LeafBuilder<T> snapshot()
157-
{
158-
return new LeafBuilder<>(buffer.clone(), count, (parent == null) ? null : parent.snapshot());
159152
}
160153

161154
private BtreeNode<T> build()
@@ -168,8 +161,7 @@ private BtreeNode<T> build()
168161
}
169162
} else {
170163
assert count >= BtreeNode.MIN_CHILDREN;
171-
push(count);
172-
return parent.build();
164+
return parent.build(BtreeLeafNode.of(IndexedArray.retained(buffer), 0, count));
173165
}
174166
}
175167

0 commit comments

Comments
 (0)