in include/PatriciaTreeSet.h [540:580]
inline bool equals(
const boost::intrusive_ptr<PatriciaTree<IntegerType>>& tree1,
const boost::intrusive_ptr<PatriciaTree<IntegerType>>& tree2) {
if (tree1 == tree2) {
// This conditions allows the equality test to run in sublinear time
// when comparing Patricia trees that share some structure.
return true;
}
if (tree1 == nullptr) {
return tree2 == nullptr;
}
if (tree2 == nullptr) {
return false;
}
// Since the hash codes are readily available (they're computed when the trees
// are constructed), we can use them to cut short the equality test.
if (tree1->hash() != tree2->hash()) {
return false;
}
if (tree1->is_leaf()) {
if (tree2->is_branch()) {
return false;
}
const auto& leaf1 =
boost::static_pointer_cast<PatriciaTreeLeaf<IntegerType>>(tree1);
const auto& leaf2 =
boost::static_pointer_cast<PatriciaTreeLeaf<IntegerType>>(tree2);
return leaf1->key() == leaf2->key();
}
if (tree2->is_leaf()) {
return false;
}
const auto& branch1 =
boost::static_pointer_cast<PatriciaTreeBranch<IntegerType>>(tree1);
const auto& branch2 =
boost::static_pointer_cast<PatriciaTreeBranch<IntegerType>>(tree2);
return branch1->prefix() == branch2->prefix() &&
branch1->branching_bit() == branch2->branching_bit() &&
equals(branch1->left_tree(), branch2->left_tree()) &&
equals(branch1->right_tree(), branch2->right_tree());
}