in src/main/java/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java [2384:2434]
TrieEntry<K, V> subtree(final K prefix, final int offsetInBits, final int lengthInBits) {
TrieEntry<K, V> current = root.left;
TrieEntry<K, V> path = root;
while (true) {
if (current.bitIndex <= path.bitIndex || lengthInBits <= current.bitIndex) {
break;
}
path = current;
if (!isBitSet(prefix, offsetInBits + current.bitIndex, offsetInBits + lengthInBits)) {
current = current.left;
} else {
current = current.right;
}
}
// Make sure the entry is valid for a subtree.
final TrieEntry<K, V> entry = current.isEmpty() ? path : current;
// If entry is root, it can't be empty.
if (entry.isEmpty()) {
return null;
}
final int endIndexInBits = offsetInBits + lengthInBits;
// if root && length of root is less than length of lookup,
// there's nothing.
// (this prevents returning the whole subtree if root has an empty
// string and we want to lookup things with "\0")
if (entry == root && lengthInBits(entry.getKey()) < endIndexInBits) {
return null;
}
// Found key's length-th bit differs from our key
// which means it cannot be the prefix...
if (isBitSet(prefix, endIndexInBits - 1, endIndexInBits)
!= isBitSet(entry.key, lengthInBits - 1, lengthInBits(entry.key))) {
return null;
}
// ... or there are less than 'length' equal bits
final int bitIndex = getKeyAnalyzer().bitIndex(prefix, offsetInBits, lengthInBits,
entry.key, 0, lengthInBits(entry.getKey()));
if (bitIndex >= 0 && bitIndex < lengthInBits) {
return null;
}
return entry;
}