Deletes nodes in the specified range (p .. p + s - 1) and updates the following PRE values. @param p PRE value @param s number of nodes to be deleted, or actually the size of the pre value which is to be deleted
(final int p, final int s)
| 174 | * value which is to be deleted |
| 175 | */ |
| 176 | void delete(final int p, final int s) { |
| 177 | final int sz = size; |
| 178 | // find the node to deleted |
| 179 | int i = find(p); |
| 180 | // if the node is not directly contained as a child, either start at array index 0 or |
| 181 | // proceed with the next node in the child array to search for descendants of pre |
| 182 | if(i == -1 || nodes[i].pre != p) ++i; |
| 183 | // first PRE value which is not deleted |
| 184 | final int upper = p + s; |
| 185 | // number of nodes to be deleted |
| 186 | int num = 0; |
| 187 | // determine number of nodes to be deleted |
| 188 | for(int n = i; n < sz && nodes[n].pre < upper; ++n, ++num); |
| 189 | // new size of child array |
| 190 | size -= num; |
| 191 | |
| 192 | if(size == 0) { |
| 193 | // if all nodes are deleted, just create an empty array |
| 194 | nodes = new NSNode[0]; |
| 195 | } else if(num > 0) { |
| 196 | // otherwise remove nodes from the child array |
| 197 | Array.remove(nodes, i, num, sz); |
| 198 | for(int n = size; n < sz; n++) nodes[n] = null; |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | /** |
| 203 | * Adds the specified node into the child array, which is sorted by PRE values. |