mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-11 19:14:51 +00:00
* method change_weight to change the weight of a entry.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23240 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
22d8e780f4
commit
f496c8cdd6
@ -412,6 +412,8 @@ public:
|
|||||||
typedef iterator self;
|
typedef iterator self;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend class weighted_btree;
|
||||||
|
|
||||||
// *** Members
|
// *** Members
|
||||||
|
|
||||||
/// The currently referenced leaf node of the tree
|
/// The currently referenced leaf node of the tree
|
||||||
@ -436,7 +438,7 @@ public:
|
|||||||
// *** Methods
|
// *** Methods
|
||||||
|
|
||||||
/// Constructor of a mutable iterator
|
/// Constructor of a mutable iterator
|
||||||
inline iterator(typename weighted_btree::leaf_node *l, unsigned short s)
|
inline iterator(typename weighted_btree::leaf_node *l, unsigned short s)
|
||||||
: currnode(l), currslot(s)
|
: currnode(l), currslot(s)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -601,6 +603,8 @@ public:
|
|||||||
typedef const_iterator self;
|
typedef const_iterator self;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend class weighted_btree;
|
||||||
|
|
||||||
// *** Members
|
// *** Members
|
||||||
|
|
||||||
/// The currently referenced leaf node of the tree
|
/// The currently referenced leaf node of the tree
|
||||||
@ -657,6 +661,12 @@ public:
|
|||||||
return currnode->slotkey[currslot];
|
return currnode->slotkey[currslot];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Weight of the current slot
|
||||||
|
inline weight_type weight() const
|
||||||
|
{
|
||||||
|
return currnode->weights[currslot];
|
||||||
|
}
|
||||||
|
|
||||||
/// Read-only reference to the current data object
|
/// Read-only reference to the current data object
|
||||||
inline const data_type& data() const
|
inline const data_type& data() const
|
||||||
{
|
{
|
||||||
@ -1318,8 +1328,36 @@ public:
|
|||||||
? iterator(leaf, slot) : end();
|
? iterator(leaf, slot) : end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Changes the weight of the first node with the given key to the
|
||||||
|
/// new weight.
|
||||||
|
void change_weight(iterator & it, weight_type w)
|
||||||
|
{
|
||||||
|
node *n = root;
|
||||||
|
if (!n) return;
|
||||||
|
if (it.weight() == w)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while(!n->isleafnode())
|
||||||
|
{
|
||||||
|
const inner_node *inner = static_cast<const inner_node*>(n);
|
||||||
|
int slot = find_lower(inner, it.key());
|
||||||
|
|
||||||
|
// two step because weight_type might be unsigned
|
||||||
|
n->weight -= it.weight();
|
||||||
|
n->weight += w;
|
||||||
|
|
||||||
|
n = inner->childid[slot];
|
||||||
|
}
|
||||||
|
|
||||||
|
BTREE_ASSERT(n == it.curnode);
|
||||||
|
n->weight -= it.weight();
|
||||||
|
n->weight += w;
|
||||||
|
it.currnode->weights[it.currslot] = w;
|
||||||
|
}
|
||||||
|
|
||||||
/// Tries to locate a summed weight in the B+ tree and returns an iterator to the
|
/// Tries to locate a summed weight in the B+ tree and returns an iterator to the
|
||||||
/// key/data slot if found. If unsuccessful it returns end().
|
/// key/data slot if found. If unsuccessful it returns end(). It is
|
||||||
|
/// ignoring zero-weight nodes during this.
|
||||||
iterator find_summed_weight(weight_type weight)
|
iterator find_summed_weight(weight_type weight)
|
||||||
{
|
{
|
||||||
node *n = root;
|
node *n = root;
|
||||||
@ -1330,10 +1368,10 @@ public:
|
|||||||
const inner_node *inner = static_cast<const inner_node*>(n);
|
const inner_node *inner = static_cast<const inner_node*>(n);
|
||||||
int slot = find_summed_weight_lower(inner, weight);
|
int slot = find_summed_weight_lower(inner, weight);
|
||||||
|
|
||||||
for (unsigned short s = 0; s < slot; ++s)
|
for (unsigned short s = 0; s < slot; ++s)
|
||||||
weight -= inner->childid[s]->weight;
|
weight -= inner->childid[s]->weight;
|
||||||
|
|
||||||
n = inner->childid[slot];
|
n = inner->childid[slot];
|
||||||
}
|
}
|
||||||
|
|
||||||
leaf_node *leaf = static_cast<leaf_node*>(n);
|
leaf_node *leaf = static_cast<leaf_node*>(n);
|
||||||
@ -1346,6 +1384,7 @@ public:
|
|||||||
? iterator(leaf, slot) : end();
|
? iterator(leaf, slot) : end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
weight_type summed_weight(const key_type &key)
|
weight_type summed_weight(const key_type &key)
|
||||||
{
|
{
|
||||||
@ -1397,7 +1436,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to locate a summed weight in the B+ tree and returns an iterator to the
|
/// Tries to locate a summed weight in the B+ tree and returns an iterator to the
|
||||||
/// key/data slot if found. If unsuccessful it returns end().
|
/// key/data slot if found. If unsuccessful it returns end(). It is
|
||||||
|
/// ignoring zero-weight nodes during this.
|
||||||
const_iterator find_summed_weight(weight_type weight) const
|
const_iterator find_summed_weight(weight_type weight) const
|
||||||
{
|
{
|
||||||
node *n = root;
|
node *n = root;
|
||||||
|
Loading…
Reference in New Issue
Block a user