* 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:
Stefan Schimanski 2008-02-26 00:38:55 +00:00
parent 22d8e780f4
commit f496c8cdd6

View File

@ -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;