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); } } }
public void collectPrefix6Ranges(Set<Prefix6Range> prefix6Ranges) { prefix6Ranges.addAll(_prefix6Ranges); if (_left != null) { _left.collectPrefix6Ranges(prefix6Ranges); } if (_right != null) { _right.collectPrefix6Ranges(prefix6Ranges); } }
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 BitTrie() { _root = new BitTrieNode(); }
public Set<Prefix6Range> getPrefix6Ranges() { Set<Prefix6Range> prefix6Ranges = new HashSet<>(); _root.collectPrefix6Ranges(prefix6Ranges); return prefix6Ranges; } }
public boolean containsPrefix6Range(Prefix6Range prefix6Range) { Prefix6 prefix6 = prefix6Range.getPrefix6(); int prefixLength = prefix6.getPrefixLength(); BitSet bits = getAddressBits(prefix6.getAddress()); return _root.containsPrefix6Range(prefix6Range, bits, prefixLength, 0); }
public void addPrefix6Range(Prefix6Range prefix6Range) { Prefix6 prefix6 = prefix6Range.getPrefix6(); int prefixLength = prefix6.getPrefixLength(); BitSet bits = getAddressBits(prefix6.getAddress()); _root.addPrefix6Range(prefix6Range, bits, prefixLength, 0); }