Start work on BTree::erase_tuple().
Continue work on BTree::erase_tuple().
Factor some common code into BTree::left_child_of().
Add BTree::add_index_entry() and BTree::erase_index_entry(), and use them to fix a couple of bugs.
Implement redistribution for BTree::erase_tuple().
Start implementing merging for BTree::erase_tuple().
Continue implementing BTree::erase_tuple().
Get branch merging working for BTree::erase_tuple(), although it will need tidying up.
Fix a bug in BTree::find_index_entry().
Implement BTree::redistribute_from_left_branch().
Implement BTree::redistribute_from_right_branch().
Start improving the B+-tree tests.
Add a more convenient constructor to ValueKey.
Add tests for BTree::equal_range(const ValueKey&).
Add an operator<< that takes a BTree.
Fix a bug in BTree::equal_range(const RangeKey&) and add tests - a similar bug may need fixing in InMemorySortedPage::equal_range(const RangeKey&).
Fix a similar bug in InMemorySortedPage::equal_range(const RangeKey&).
Merge RangeKey::is_open_singleton() into RangeKey::is_valid().
Get rid of the old test for BTree::equal_range(const RangeKey&) - it has been superseded.
Perform an obvious optimisation.