Simplify btree_base_field_type<>
parent
9fe3bb3b33
commit
89a0af9086
51
btree.h
51
btree.h
|
@ -316,38 +316,6 @@ static bool btree_compare_keys(
|
||||||
return key_comparer::bool_compare(comp, x, y);
|
return key_comparer::bool_compare(comp, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// btree_is_node_big<> is a recursive template to determine whether a
|
|
||||||
// node of TargetNodeSize bytes needs a larger base_fields type
|
|
||||||
// (uint16, instead of uint8) to accomodate >= 256 values per node.
|
|
||||||
template <int TargetNodeSize, int ValueSize>
|
|
||||||
struct btree_is_node_big :
|
|
||||||
btree_is_node_big<(TargetNodeSize / 2), (ValueSize / 2)> {
|
|
||||||
};
|
|
||||||
template <int TargetNodeSize>
|
|
||||||
struct btree_is_node_big<TargetNodeSize, 1> {
|
|
||||||
enum {
|
|
||||||
// In the base case, TargetNodeSize corresponds to single-byte
|
|
||||||
// entries and is the maximum number of values.
|
|
||||||
is_big = base::integral_constant<bool, (TargetNodeSize >= 256)>::value,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// A helper for sizing the btree node's base_fields. The "type"
|
|
||||||
// typedef in this struct is an integral type large enough to hold as
|
|
||||||
// many ValueSize-values as will fit a node of TargetNodeSize bytes.
|
|
||||||
template <int TargetNodeSize, int ValueSize>
|
|
||||||
struct btree_base_field_type {
|
|
||||||
enum {
|
|
||||||
// "value_space" is the maximum leaf node count. leaf nodes have
|
|
||||||
// a greatest maximum of the node types.
|
|
||||||
value_space = TargetNodeSize - 2 * sizeof(void*),
|
|
||||||
};
|
|
||||||
typedef typename base::if_<
|
|
||||||
btree_is_node_big<value_space, ValueSize>::is_big,
|
|
||||||
uint16,
|
|
||||||
uint8>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Compare,
|
template <typename Key, typename Compare,
|
||||||
typename Alloc, int TargetNodeSize, int ValueSize>
|
typename Alloc, int TargetNodeSize, int ValueSize>
|
||||||
struct btree_common_params {
|
struct btree_common_params {
|
||||||
|
@ -365,12 +333,21 @@ struct btree_common_params {
|
||||||
typedef Key key_type;
|
typedef Key key_type;
|
||||||
typedef ssize_t size_type;
|
typedef ssize_t size_type;
|
||||||
typedef ptrdiff_t difference_type;
|
typedef ptrdiff_t difference_type;
|
||||||
typedef typename btree_base_field_type<TargetNodeSize, ValueSize>::type
|
|
||||||
base_field_type;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kTargetNodeSize = TargetNodeSize,
|
kTargetNodeSize = TargetNodeSize,
|
||||||
|
|
||||||
|
// Available space for values. This is largest for leaf nodes,
|
||||||
|
// which has overhead no fewer than two pointers.
|
||||||
|
kNodeValueSpace = TargetNodeSize - 2 * sizeof(void*),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is an integral type large enough to hold as many
|
||||||
|
// ValueSize-values as will fit a node of TargetNodeSize bytes.
|
||||||
|
typedef typename base::if_<
|
||||||
|
(kNodeValueSpace / ValueSize) >= 256,
|
||||||
|
uint16,
|
||||||
|
uint8>::type node_count_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A parameters structure for holding the type parameters for a btree_map.
|
// A parameters structure for holding the type parameters for a btree_map.
|
||||||
|
@ -541,7 +518,7 @@ class btree_node {
|
||||||
linear_search_type, binary_search_type>::type search_type;
|
linear_search_type, binary_search_type>::type search_type;
|
||||||
|
|
||||||
struct base_fields {
|
struct base_fields {
|
||||||
typedef typename Params::base_field_type field_type;
|
typedef typename Params::node_count_type field_type;
|
||||||
|
|
||||||
// A boolean indicating whether the node is a leaf or not.
|
// A boolean indicating whether the node is a leaf or not.
|
||||||
bool leaf;
|
bool leaf;
|
||||||
|
@ -1479,6 +1456,10 @@ class btree : public Params::key_compare {
|
||||||
COMPILE_ASSERT(kNodeValues <
|
COMPILE_ASSERT(kNodeValues <
|
||||||
(1 << (8 * sizeof(typename base_fields::field_type))),
|
(1 << (8 * sizeof(typename base_fields::field_type))),
|
||||||
target_node_size_too_large);
|
target_node_size_too_large);
|
||||||
|
|
||||||
|
// Test the assumption made in setting kNodeValueSpace.
|
||||||
|
COMPILE_ASSERT(sizeof(base_fields) >= 2 * sizeof(void*),
|
||||||
|
node_space_assumption_incorrect);
|
||||||
};
|
};
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
Loading…
Reference in New Issue