public boolean containsPrefixRange( PrefixRange prefixRange, BitSet bits, int prefixLength, int depth) { for (PrefixRange nodeRange : _prefixRanges) { if (nodeRange.includesPrefixRange(prefixRange)) { return true; } } if (prefixLength == depth) { return false; } else { boolean currentBit = bits.get(depth); if (currentBit) { if (_right == null) { return false; } else { return _right.containsPrefixRange(prefixRange, bits, prefixLength, depth + 1); } } else { if (_left == null) { return false; } else { return _left.containsPrefixRange(prefixRange, bits, prefixLength, depth + 1); } } } }
private void prune(PrefixRange prefixRange) { if (_left != null) { _left.prune(prefixRange); if (_left.isEmpty()) { _left = null; } } if (_right != null) { _right.prune(prefixRange); if (_right.isEmpty()) { _right = null; } } if (_prefixRanges.stream().anyMatch(prefixRange::includesPrefixRange)) { _prefixRanges = _prefixRanges.stream() .filter(pr -> !prefixRange.includesPrefixRange(pr)) .collect(ImmutableSet.toImmutableSet()); } } }
public void addPrefixRange(PrefixRange prefixRange, BitSet bits, int prefixLength, int depth) { if (_prefixRanges.stream().anyMatch(nr -> nr.includesPrefixRange(prefixRange))) { return; } if (prefixLength == depth) { prune(prefixRange); _prefixRanges = ImmutableSet.<PrefixRange>builderWithExpectedSize(_prefixRanges.size() + 1) .addAll(_prefixRanges) .add(prefixRange) .build(); } else { boolean currentBit = bits.get(depth); if (currentBit) { if (_right == null) { _right = new BitTrieNode(); } _right.addPrefixRange(prefixRange, bits, prefixLength, depth + 1); } else { if (_left == null) { _left = new BitTrieNode(); } _left.addPrefixRange(prefixRange, bits, prefixLength, depth + 1); } } }
/** * Tests that getting a range more specific than a /32 does not crash and is empty -- or at least * does not contain the initial /32. */ @Test public void testEmptyRange() { Prefix slash32 = Prefix.parse("1.2.3.4/32"); PrefixRange empty = PrefixRange.moreSpecificThan(slash32); assertFalse(empty.includesPrefixRange(PrefixRange.fromPrefix(slash32))); } }