public boolean containsPrefix6Range( Prefix6Range prefix6Range, BitSet bits, int prefixLength, int depth) { for (Prefix6Range nodeRange : _prefix6Ranges) { if (nodeRange.includesPrefix6Range(prefix6Range)) { return true; } } if (prefixLength == depth) { return false; } else { boolean currentBit = bits.get(depth); if (currentBit) { if (_right == null) { return false; } else { return _right.containsPrefix6Range(prefix6Range, bits, prefixLength, depth + 1); } } else { if (_left == null) { return false; } else { return _left.containsPrefix6Range(prefix6Range, bits, prefixLength, depth + 1); } } } }
private void prune(Prefix6Range prefix6Range) { if (_left != null) { _left.prune(prefix6Range); if (_left.isEmpty()) { _left = null; } } if (_right != null) { _right.prune(prefix6Range); if (_right.isEmpty()) { _right = null; } } Set<Prefix6Range> oldPrefix6Ranges = new HashSet<>(); oldPrefix6Ranges.addAll(_prefix6Ranges); for (Prefix6Range oldPrefix6Range : oldPrefix6Ranges) { if (!prefix6Range.equals(oldPrefix6Range) && prefix6Range.includesPrefix6Range(oldPrefix6Range)) { _prefix6Ranges.remove(oldPrefix6Range); } } } }
public void addPrefix6Range( Prefix6Range prefix6Range, BitSet bits, int prefixLength, int depth) { for (Prefix6Range nodeRange : _prefix6Ranges) { if (nodeRange.includesPrefix6Range(prefix6Range)) { return; } } if (prefixLength == depth) { _prefix6Ranges.add(prefix6Range); prune(prefix6Range); } else { boolean currentBit = bits.get(depth); if (currentBit) { if (_right == null) { _right = new BitTrieNode(); } _right.addPrefix6Range(prefix6Range, bits, prefixLength, depth + 1); } else { if (_left == null) { _left = new BitTrieNode(); } _left.addPrefix6Range(prefix6Range, bits, prefixLength, depth + 1); } } }