cpp-btree: Update to match upstream

minor optimization: minimize calls to end()

Minor optimization: increase the chances that the compiler will inline calls to end().
Has been observed to make a difference with gcc 4.9.3.

Fix build and warnings on MSVC (2017)
Uses static_assert, a C++11 feature. Also adds some explicit uses of
static_cast in order to suppress warnings about lossy type conversion.
This commit is contained in:
Jonathan G Rennison
2018-11-01 18:54:24 +00:00
parent 133ccabf42
commit 7690fe8572

View File

@@ -510,11 +510,11 @@ class btree_node {
// Getter for the position of this node in its parent. // Getter for the position of this node in its parent.
int position() const { return fields_.position; } int position() const { return fields_.position; }
void set_position(int v) { fields_.position = v; } void set_position(int v) { fields_.position = static_cast<typename Params::node_count_type>(v); }
// Getter/setter for the number of values stored in this node. // Getter/setter for the number of values stored in this node.
int count() const { return fields_.count; } int count() const { return fields_.count; }
void set_count(int v) { fields_.count = v; } void set_count(int v) { fields_.count = static_cast<typename Params::node_count_type>(v); }
int max_count() const { return fields_.max_count; } int max_count() const { return fields_.max_count; }
// Getter for the parent of this node. // Getter for the parent of this node.
@@ -561,7 +561,7 @@ class btree_node {
void set_child(int i, btree_node *c) { void set_child(int i, btree_node *c) {
*mutable_child(i) = c; *mutable_child(i) = c;
c->fields_.parent = this; c->fields_.parent = this;
c->fields_.position = i; c->fields_.position = static_cast<typename Params::node_count_type>(i);
} }
// Returns the position of the first value whose key is not less than k. // Returns the position of the first value whose key is not less than k.
@@ -674,7 +674,7 @@ class btree_node {
btree_node *n = reinterpret_cast<btree_node*>(f); btree_node *n = reinterpret_cast<btree_node*>(f);
f->leaf = 1; f->leaf = 1;
f->position = 0; f->position = 0;
f->max_count = max_count; f->max_count = static_cast<typename base_fields::field_type>(max_count);
f->count = 0; f->count = 0;
f->parent = parent; f->parent = parent;
#ifdef BTREE_DEBUG #ifdef BTREE_DEBUG
@@ -935,10 +935,12 @@ class btree : public Params::key_compare {
return const_iterator(leftmost(), 0); return const_iterator(leftmost(), 0);
} }
iterator end() { iterator end() {
return iterator(rightmost(), rightmost() ? rightmost()->count() : 0); node_type* const right = rightmost();
return iterator(right, right ? right->count() : 0);
} }
const_iterator end() const { const_iterator end() const {
return const_iterator(rightmost(), rightmost() ? rightmost()->count() : 0); const node_type* const right = rightmost();
return const_iterator(right, right ? right->count() : 0);
} }
reverse_iterator rbegin() { reverse_iterator rbegin() {
return reverse_iterator(end()); return reverse_iterator(end());
@@ -1752,7 +1754,8 @@ inline typename btree<P>::iterator
btree<P>::insert_unique(iterator position, const value_type &v) { btree<P>::insert_unique(iterator position, const value_type &v) {
if (!empty()) { if (!empty()) {
const key_type &key = params_type::key(v); const key_type &key = params_type::key(v);
if (position == end() || compare_keys(key, position.key())) { const iterator end = this->end();
if (position == end || compare_keys(key, position.key())) {
iterator prev = position; iterator prev = position;
if (position == begin() || compare_keys((--prev).key(), key)) { if (position == begin() || compare_keys((--prev).key(), key)) {
// prev.key() < key < position.key() // prev.key() < key < position.key()
@@ -1761,7 +1764,7 @@ btree<P>::insert_unique(iterator position, const value_type &v) {
} else if (compare_keys(position.key(), key)) { } else if (compare_keys(position.key(), key)) {
iterator next = position; iterator next = position;
++next; ++next;
if (next == end() || compare_keys(key, next.key())) { if (next == end || compare_keys(key, next.key())) {
// position.key() < key < next.key() // position.key() < key < next.key()
return internal_insert(next, v); return internal_insert(next, v);
} }
@@ -1799,7 +1802,8 @@ typename btree<P>::iterator
btree<P>::insert_multi(iterator position, const value_type &v) { btree<P>::insert_multi(iterator position, const value_type &v) {
if (!empty()) { if (!empty()) {
const key_type &key = params_type::key(v); const key_type &key = params_type::key(v);
if (position == end() || !compare_keys(position.key(), key)) { const iterator end = this->end();
if (position == end || !compare_keys(position.key(), key)) {
iterator prev = position; iterator prev = position;
if (position == begin() || !compare_keys(key, (--prev).key())) { if (position == begin() || !compare_keys(key, (--prev).key())) {
// prev.key() <= key <= position.key() // prev.key() <= key <= position.key()
@@ -1808,7 +1812,7 @@ btree<P>::insert_multi(iterator position, const value_type &v) {
} else { } else {
iterator next = position; iterator next = position;
++next; ++next;
if (next == end() || !compare_keys(next.key(), key)) { if (next == end || !compare_keys(next.key(), key)) {
// position.key() < key <= next.key() // position.key() < key <= next.key()
return internal_insert(next, v); return internal_insert(next, v);
} }
@@ -1833,7 +1837,7 @@ void btree<P>::assign(const self_type &x) {
// Assignment can avoid key comparisons because we know the order of the // Assignment can avoid key comparisons because we know the order of the
// values is the same order we'll store them in. // values is the same order we'll store them in.
for (const_iterator iter = x.begin(); iter != x.end(); ++iter) { for (const_iterator iter = x.begin(), xend = x.end(); iter != xend; ++iter) {
if (empty()) { if (empty()) {
insert_multi(*iter); insert_multi(*iter);
} else { } else {