| 249 | } |
| 250 | |
| 251 | private Node pushTail(int level, Node parent, Node tailnode){ |
| 252 | //if parent is leaf, insert node, |
| 253 | // else does it map to an existing child? -> nodeToInsert = pushNode one more level |
| 254 | // else alloc new path |
| 255 | //return nodeToInsert placed in copy of parent |
| 256 | int subidx = ((cnt - 1) >>> level) & 0x01f; |
| 257 | Node ret = new Node(parent.edit, parent.array.clone()); |
| 258 | Node nodeToInsert; |
| 259 | if(level == 5) |
| 260 | { |
| 261 | nodeToInsert = tailnode; |
| 262 | } |
| 263 | else |
| 264 | { |
| 265 | Node child = (Node) parent.array[subidx]; |
| 266 | nodeToInsert = (child != null)? |
| 267 | pushTail(level-5,child, tailnode) |
| 268 | :newPath(root.edit,level-5, tailnode); |
| 269 | } |
| 270 | ret.array[subidx] = nodeToInsert; |
| 271 | return ret; |
| 272 | } |
| 273 | |
| 274 | private static Node newPath(AtomicReference<Thread> edit,int level, Node node){ |
| 275 | if(level == 0) |