Index: cc/base/rtree.h |
diff --git a/cc/base/rtree.h b/cc/base/rtree.h |
index 260ae5fe859ab619d7cb9362c32c4f2d4f3c9e26..31250b2e8103c27e57fdcec93353069a6b8789e9 100644 |
--- a/cc/base/rtree.h |
+++ b/cc/base/rtree.h |
@@ -11,7 +11,6 @@ |
#include <vector> |
#include "cc/base/cc_export.h" |
-#include "cc/base/contiguous_container.h" |
#include "ui/gfx/geometry/rect.h" |
namespace cc { |
@@ -61,14 +60,33 @@ class CC_EXPORT RTree { |
num_data_elements_ = branches.size(); |
if (num_data_elements_ == 1u) { |
+ nodes_.reserve(1); |
Node* node = AllocateNodeAtLevel(0); |
node->num_children = 1; |
node->children[0] = branches[0]; |
root_.subtree = node; |
root_.bounds = branches[0].bounds; |
} else if (num_data_elements_ > 1u) { |
+ // Determine a reasonable upper bound on the number of nodes to prevent |
+ // reallocations. This is basically (n**d - 1) / (n - 1), which is the |
+ // number of nodes in a complete tree with n branches at each node. In the |
+ // code n = |branch_count|, d = |depth|. However, we normally would have |
+ // kMaxChildren branch factor, but that can be broken if some children |
+ // don't have enough nodes. That can happen for at most kMinChildren nodes |
+ // (since otherwise, we'd create a new node). |
+ size_t branch_count = kMaxChildren; |
+ double depth = log(branches.size()) / log(branch_count); |
+ size_t node_count = |
+ static_cast<size_t>((std::pow(branch_count, depth) - 1) / |
+ (branch_count - 1)) + |
+ kMinChildren; |
+ nodes_.reserve(node_count); |
+ |
root_ = BuildRecursive(&branches, 0); |
} |
+ // We should've wasted at most kMinChildren nodes. |
+ DCHECK_LE(nodes_.capacity() - nodes_.size(), |
+ static_cast<size_t>(kMinChildren)); |
} |
template <typename Container> |
@@ -83,7 +101,8 @@ class CC_EXPORT RTree { |
private: |
// These values were empirically determined to produce reasonable performance |
// in most cases. |
- enum { MIN_CHILDREN = 6, MAX_CHILDREN = 11 }; |
+ enum { kMinChildren = 6 }; |
+ enum { kMaxChildren = 11 }; |
struct Node; |
struct Branch { |
@@ -101,7 +120,7 @@ class CC_EXPORT RTree { |
struct Node { |
uint16_t num_children; |
uint16_t level; |
- Branch children[MAX_CHILDREN]; |
+ Branch children[kMaxChildren]; |
}; |
void SearchRecursive(Node* root, |
@@ -115,7 +134,7 @@ class CC_EXPORT RTree { |
// This is the count of data elements (rather than total nodes in the tree) |
size_t num_data_elements_; |
Branch root_; |
- ContiguousContainer<Node> nodes_; |
+ std::vector<Node> nodes_; |
}; |
} // namespace cc |