@@ -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