|
Boost-Commit : |
From: chintanraoh_at_[hidden]
Date: 2008-07-03 14:02:35
Author: chintanraoh
Date: 2008-07-03 14:02:34 EDT (Thu, 03 Jul 2008)
New Revision: 47048
URL: http://svn.boost.org/trac/boost/changeset/47048
Log:
documented patricia class
Text files modified:
sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia.hpp | 319 ++++++++++++++++++++++-----------------
1 files changed, 183 insertions(+), 136 deletions(-)
Modified: sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia.hpp
==============================================================================
--- sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia.hpp (original)
+++ sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia.hpp 2008-07-03 14:02:34 EDT (Thu, 03 Jul 2008)
@@ -10,8 +10,12 @@
#include<boost/iterator/iterator_traits.hpp>
#include<boost/dsearch/patricia_iterator.hpp>
+
+//note //* has been used where there is an inline comment documenting the code.
+
+
#if 0
-/// when FORWARD is defined, the class uses sequetial access for the key.
+//* when FORWARD is defined, the class uses sequential access for the key.
#define FORWARD
#endif
@@ -24,8 +28,8 @@
\param Mapped can be any datatype which is supposed to be indexed using string
\warning Test waring
\todo
- replace all key assignement operations with key_copy.
- replace all key.size() with key_traits::size().
+ replace all key assignement operations with key_copy.\n
+ replace all key.size() with key_traits::size().\n
remove key.size() calculation where not needed.
*/
@@ -138,15 +142,15 @@
copy_patricia(other.root);
}
- ///
+ /// operator [ ] works similar to std::map
/** \returns returns a reference to the object that is associated with a particular key.
If the map does not already contain such an object, operator[] inserts the default object data_type()
\param k corresponding to the data_type's reference to retrieved.
*/
- data_type &operator [] (const key_type &k)
+ data_type &operator [ ] (const key_type &k)
{
#ifndef FORWARD
- ///call insert node with insert node category
+ //call insert node with insert node category
return insert_new_node(k,iterator_cat());
#else
return insert_new_node(k,0);
@@ -249,16 +253,16 @@
std::pair<std::size_t,int> common;
patricia_node *node;
#ifndef FORWARD
- ///call find_node with iterator_cat()
+ //*call find_node with iterator_cat()
node=find_node(root,k,iterator_cat());
#else
node=find_node(root,k,0);
#endif
if(node==0) return 0;
- ///get the common bits . equivalent to key compare.
+ //*get the common bits . equivalent to key compare.
common=get_common_bits(node->value.first,k);
- ///return true is the keys are equal.
+ //*return true is the keys are equal.
return (common.second==2);
}
@@ -270,17 +274,17 @@
{
std::pair<patricia_node*,patricia_node*> node_pair;
#ifndef FORWARD
- ///call find_node_prev with iterator_cat()
+ //*call find_node_prev with iterator_cat()
node_pair=find_node_prev(root,k,iterator_cat());
#else
node_pair=find_node_prev(root,k,0);
#endif
if ( node_pair.first==0) return end();
- ///return end() if the found keys are not equal.
+ //*return end() if the found keys are not equal.
if(get_common_bits(node_pair.first->value.first,k).second!=2)
return end();
- ///construct the iterator and then return it.
+ //*construct the iterator and then return it.
return iterator(node_pair.first,node_pair.second);
}
@@ -299,7 +303,7 @@
iterator upper_bound(const key_type &k)
{
#ifndef FORWARD
- ///call upper bound with iterator category.
+ //*call upper bound with iterator category.
return upper_bound(k,iterator_cat());
#else
return upper_bound(k,0);
@@ -320,7 +324,7 @@
iterator lower_bound(const key_type &k)
{
#ifndef FORWARD
- ///call upper bound with iterator_cat();
+ //*call upper bound with iterator_cat();
return lower_bound(k,iterator_cat());
#else
return lower_bound(k,0);
@@ -343,7 +347,7 @@
std::pair<iterator,iterator> prefix_range(const key_type &k)
{
#ifndef FORWARD
- ///call prefix_range with iterator category
+ //*call prefix_range with iterator category
return prefix_range(k,iterator_cat());
#else
return prefix_range(k,0);
@@ -400,17 +404,17 @@
root=0;
while(true)
{
- ///try going left if cur->left==0 try going right
+ //*try going left if cur->left==0 try going right
next=cur->left?cur->left:cur->right;
if(next==0)
{
- ///if cur->right is also 0 ==> next is 0.
- ///deallocate the node
+ //*if cur->right is also 0 ==> next is 0.
+ //*deallocate the node
next=cur->par;
deallocate_node(cur);
if(next==0) return;
- ///adjust the parent pointer ->left or pp-> right to 0
+ //*adjust the parent pointer ->left or pp-> right to 0
if(next->left==cur)
next->left=0;
else
@@ -420,7 +424,7 @@
else
if( next->par!=cur )
{
- ///entered an uplink. so mark the thing as zero.
+ //*entered an uplink. so mark the thing as zero.
if(cur->left==next)
cur->left=0;
else
@@ -428,7 +432,7 @@
}
else
{
- ///move forward to next
+ //*move forward to next
cur=next;
}
}
@@ -447,27 +451,27 @@
{
if(cur->left==prev && cur->left->par==cur)
{
- ///coming up from the left.
+ //*coming up from the left.
prev=cur;
- ///try go right other wise got to the parent
+ //*try go right other wise got to the parent
cur=(cur->right && cur->right->par==cur)?cur->right:cur->par;
}
else
if(cur->right==prev && cur->right->par==cur)
{
- ///coming up from the right
- ///goto the parent
+ //*coming up from the right
+ //*goto the parent
prev=cur;
cur=cur->par;
}
else
{
- ///going into a new node so increment size
+ //*going into a new node so increment size
ret_size++;
std::cout<<cur->value.first<<std::endl;
prev=cur;
- ///goto left otherwise goto right other go up.
+ //*goto left otherwise goto right other go up.
cur=(cur->left && cur->left->par==cur)? cur->left
: ( (cur->right && cur->right->par==cur)? cur->right
: cur->par );
@@ -515,17 +519,17 @@
const std::size_t key_size=Key_traits::size(key);
key_iterator it=Key_traits::begin(key);
- ///get the insert pair for the key.
+ //*get the insert pair for the key.
node_pair=find_node_prev(root,key,iterator_cat(),key_size);
next=node_pair.first;
common=get_common_bits(key,next->value.first );
- ///if everything is common return the data type
+ //*if everything is common return the data type
if ( common.second==2 )
return std::make_pair(node_pair, common);
- ///else search for the key again
+ //*else search for the key again
next=cur=root;
while (next->index < common.first) {
cur=next;
@@ -533,11 +537,11 @@
//if ( pos >= key_size ) break;
next=get_nth_bit ( Key_traits::get_element(it + pos), cur->index % (bit_width + 1) )?
cur->right: cur->left;
- ///is its an upward link break.
+ //*is its an upward link break.
if(cur->index >= next->index) break;
}
- ///return the node pair along with common pair.
+ //*return the node pair along with common pair.
return std::make_pair(std::make_pair(next,cur), common);
}
@@ -564,44 +568,44 @@
it=Key_traits::begin(key);
end_it=Key_traits::end(key);
- ///get the node pair between which the key is supposed to be inserted
+ //*get the node pair between which the key is supposed to be inserted
node_pair=find_node_prev(root,key,T());
next=node_pair.first;
cur =node_pair.second;
common=get_common_bits(key,next->value.first);
- ///key already exists
+ //*key already exists
if(common.second==2)
return std::make_pair(std::make_pair(next,cur),common);
- ///find the correct parent and child in between which this node needs to be added.
- ///find until the index
- ///note: parent can be equal to child
- ///cur=parent, next=child
+ //*find the correct parent and child in between which this node needs to be added.
+ //*find until the index
+ //*note: parent can be equal to child
+ //*cur=parent, next=child
it=Key_traits::begin(key);
cur=root;
while(it!=end_it)
{
if ( (cur->index)%(bit_width+1)==0 )
{
- ///simply got the right because. left not has a lesser length than the key.
+ //*simply got the right because. left not has a lesser length than the key.
next=cur->right;
}
else
{
- ///goto left or right appropriately
+ //*goto left or right appropriately
temp_element=Key_traits::get_element(it);
next=get_nth_bit(temp_element,(cur->index)%(bit_width+1))?
cur->right:cur->left;
}
- ///fortunately in this case; this should happen only when it==end_it occures.
+ //*fortunately in this case; this should happen only when it==end_it occures.
assert(next);
if ( next->index+1 > common.first ) break; //insert at cur using next->value->first
if ( next->index <= cur->index ) break;
- ///increment pos and it until the required pos matching index is reached
+ //*increment pos and it until the required pos matching index is reached
while( pos < (next->index)/(bit_width+1) && it!=end_it )
{
++pos;
@@ -635,9 +639,9 @@
it=Key_traits::begin(key);
end_it=Key_traits::end(key);
- ///do some jugglery to ensure that inserting "" first as root wont cause any problems
- ///move root to the right position while inserting the second
- ///that will take care of the assert(next) in find
+ //*do some jugglery to ensure that inserting "" first as root wont cause any problems
+ //*move root to the right position while inserting the second
+ //*that will take care of the assert(next) in find
old_root=0;
if(root!=0 && root->left==root)
{
@@ -654,7 +658,7 @@
new(root) patricia_node( key, 0, old_root, root, 0 );
if(old_root)
{
- ///reassign the old root the position.
+ //*reassign the old root the position.
old_root->par=root;
}
}
@@ -665,7 +669,7 @@
if(it==end_it)
{
- ///"" inserted
+ //*"" inserted
if(root->left==0)
{
@@ -675,23 +679,23 @@
return root->left->value.second;
}
- ///get the insert pair. the pair in between which the things should be inserted
+ //*get the insert pair. the pair in between which the things should be inserted
insert_pair=get_insert_pair(key,T());
common=insert_pair.second;
next=insert_pair.first.first;
cur=insert_pair.first.second;
- ///if the key already exists return
+ //*if the key already exists return
if(common.second==2)
{
std::cout<<"The key \""<<key<<"\" already exists"<<std::endl;
return next->value.second;
}
- ///allocate new node
+ //*allocate new node
temp_node=node_allocator.allocate(1);
- ///rewire the cur to temp_node
+ //*rewire the cur to temp_node
if(cur->left==next)
cur->left=temp_node;
else
@@ -702,16 +706,16 @@
if(common.second)
- ///temp_node should point to inself at 1 ie right
+ //*temp_node should point to inself at 1 ie right
new (temp_node) patricia_node(key,common.first,next,temp_node,cur);
else
- ///temp_node should point to inself at 0 ie right
+ //*temp_node should point to inself at 0 ie right
new (temp_node) patricia_node(key,common.first,temp_node,next,cur);
assert(root->par==0);
- ///if its not an upward link adjust the next->par
+ //*if its not an upward link adjust the next->par
if(cur->index < next->index) next->par=temp_node;
assert(root->par==0);
@@ -749,7 +753,7 @@
k1_end=k1.end();
k2_end=k2.end();
- ///check until the chars are unequal and increment pos accordingly
+ //*check until the chars are unequal and increment pos accordingly
while(k1_it!=k1_end && k2_it!=k2_end )
{
if ( Key_traits::get_element(k1_it) != Key_traits::get_element(k2_it) )
@@ -764,7 +768,7 @@
if(unequal)
{
- ///find the unequal bit
+ //*find the unequal bit
std::size_t bit_pos=0;
t1=Key_traits::get_element(k1_it);
t2=Key_traits::get_element(k2_it);
@@ -781,9 +785,9 @@
}
else
{
- ///assign uncommon_bit==2 if ( k1_it==k1_end && k2_it==k2_end )
- ///if k1_it==k1_end && k2_it!=k2_end assing 0
- ///otherwise 1
+ //*assign uncommon_bit==2 if ( k1_it==k1_end && k2_it==k2_end )
+ //*if k1_it==k1_end && k2_it!=k2_end assing 0
+ //*otherwise 1
uncommon_bit=(k1_it==k1_end)?((k2_it==k2_end)?2:0):1;
}
@@ -812,7 +816,7 @@
if(root==0) return 0;
if(it==end_it)
return root->left;
- ///adjust pos to the appropriate value
+ //*adjust pos to the appropriate value
while ( pos < (cur->index)/(bit_width+1) && it!=end_it )
{
++pos;
@@ -822,11 +826,11 @@
while(it!=end_it) {
if ( (cur->index)%(bit_width+1)==0 )
{
- ///always go right as length of the key on right is lesser.
+ //*always go right as length of the key on right is lesser.
next=cur->right;
}
else {
- ///go left or right appropriately.
+ //*go left or right appropriately.
temp_element=Key_traits::get_element(it);
//std::cout<<"getting "<<(cur->index)%(bit_width+1)<<"th bit of "<<temp_element<<std::endl;
next=get_nth_bit ( temp_element , (cur->index)%(bit_width+1) ) ?
@@ -836,7 +840,7 @@
//std::cout<<(cur->left==next?"going left":"going right")<<std::endl;
//std::cout<<"next: "<<next->value.first<<std::endl;
- ///if we are heading toward the parent stop
+ //*if we are heading toward the parent stop
if ( next->index <= cur->index ) break;
while ( pos < (next->index)/(bit_width+1) && it!=end_it ) {
@@ -847,7 +851,7 @@
}
if ( it == end_it && pos==(cur->index)/(bit_width+1) ) {
- ///just make the required connection
+ //*just make the required connection
next=cur->left;
}
return next;
@@ -876,22 +880,20 @@
while (true )
{
pos= cur->index / (bit_width + 1);
- ///make sure the key length is always lesser
+ //*make sure the key length is always lesser
if ( pos >= key_size ) break;
std::cout<<"getting "<<cur->index<<"th bit of "<<key<<std::endl;
next=get_nth_bit ( Key_traits::get_element(it + pos), cur->index % (bit_width + 1) )?
cur->right: cur->left;
if(next==0) return 0;
- //std::cout<<"In find of "<<key<<": cur="<<cur->value.first
- //<<" going to next \""<<next->value.first<<"\""<<std::endl;
- ///if we are heading toward the parent stop
+ //*if we are heading toward the parent stop
if(cur->index >= next->index) break;
cur=next;
}
if (pos == key_size )
{
- ///make the required correction if the add the last bit 0 to the node.
+ //*make the required correction if the add the last bit 0 to the node.
next=cur->left;
}
@@ -924,7 +926,7 @@
if(it==end_it)
{
- ///special cases for ""
+ //*special cases for ""
if ( cur==root || cur==root->left )
return std::make_pair(root->left,root);
else
@@ -932,7 +934,7 @@
}
- ///refer find()
+ //*refer find()
while (true ) {
pos= cur->index / (bit_width + 1);
if ( pos >= key_size ) break;
@@ -977,20 +979,20 @@
if(cur==0) return std::make_pair(cur,cur);
if(it==end_it)
{
- ///special cases for ""
+ //*special cases for ""
if ( cur==root || cur==root->left )
return std::make_pair(root->left,root);
else
return std::make_pair(static_cast<patricia_node*>(0),static_cast<patricia_node*>(0));
}
- ///adjust pos to match with cur->index
+ //*adjust pos to match with cur->index
while ( pos < (cur->index)/(bit_width+1) && it!=end_it ) {
++pos;
++it;
}
- ///ref find :)
+ //*ref find :)
while(it!=end_it) {
if ( (cur->index)%(bit_width+1)==0 )
{
@@ -1033,13 +1035,13 @@
std::cout<<"in erase: found "<<found->value.first<<" and prev "<<prev->value.first<<std::endl;
if ( found-> par == 0 ) {
- ///==> found=root node
+ //*==> found=root node
std::cout<<"par"<<std::endl;
assert(root==found);
if( (found->right==0 || found->left==0) && found==prev){
- ///only root or only ""
+ //*only root or only ""
deallocate_node(found);
root=0;
return;
@@ -1047,7 +1049,7 @@
//std::cout<<"wrong place"<<std::endl;
if(prev==found){
- ///also takes care of taking to "" to the root
+ //*also takes care of taking to "" to the root
root=(found->right==found)?found->left:found->right;
if(root) root->par=0;
deallocate_node(found);
@@ -1057,30 +1059,30 @@
else
if ( found->right==0 || found->left==0 )
prev=found;
- /// now prev contains the node from which found is wired with an uplink
+ //* now prev contains the node from which found is wired with an uplink
std::cout<<"here"<<std::endl;
- ///if a node is looping to itself
- ///deleting the leaf node.
- ///this case for root node is handled before
+ //*if a node is looping to itself
+ //*deleting the leaf node.
+ //*this case for root node is handled before
if ( prev == found ) {
- ///check how its liked to the par
- ///and found->par!=0 as root node has been handled before.
+ //*check how its liked to the par
+ //*and found->par!=0 as root node has been handled before.
if ( found->par->right == found )
{
- ///rewire the parent.
+ //*rewire the parent.
found->par->right = (found->right==found)?found->left:found->right;
- ///also take care rewiring the new childs parent
+ //*also take care rewiring the new childs parent
if( found->par->right && found==found->par->right->par ) found->par->right->par=found->par;
}
else
if ( found->par->left == found )
{
- ///rewire the parent.
+ //*rewire the parent.
found->par->left = (found->right==found)?found->left:found->right;
- ///also take care rewiring the new childs parent
+ //*also take care rewiring the new childs parent
if( found->par->left && found==found->par->left->par ) found->par->left->par=found->par;
}
else
@@ -1088,8 +1090,8 @@
//std::cout<<"prev==found with key="<<key<<std::endl;
if ( found->right==0 || found->left==0 )
{
- ///Probably erasing "" for lets be extra careful
- ///check whether the par is as expected proper.
+ //*Probably erasing "" for lets be extra careful
+ //*check whether the par is as expected proper.
assert(found->par==root);
std::cout<<"\"\" node to be erased"<<std::endl;
}
@@ -1097,28 +1099,28 @@
return;
}
- ///since we are moving prev to where found is we need to rewire the prev parents
- ///check how the prev->par is attached to prev
+ //*since we are moving prev to where found is we need to rewire the prev parents
+ //*check how the prev->par is attached to prev
if(prev->par->right==prev) {
- ///rewrite the prev->parent to the prev's other child
+ //*rewrite the prev->parent to the prev's other child
prev->par->right=(prev->right==found)?prev->left:prev->right;
- ///if prev->right == prev or prev->left == prev there is a self loop so we need to take for it too.
- ///and not re-adjust par.
+ //*if prev->right == prev or prev->left == prev there is a self loop so we need to take for it too.
+ //*and not re-adjust par.
if( prev->right!=prev && prev->left!=prev && prev->par->right ) prev->par->right->par=prev->par;
}
else {
//std::cout<<"far away here"<<std::endl;
- ///rewrite the prev->parent to the prev's other child
+ //*rewrite the prev->parent to the prev's other child
prev->par->left=(prev->right==found)?prev->left:prev->right;
- ///if prev->right == prev or prev->left == prev there is a self loop so we need to take for it too.
- ///and not re-adjust par.
+ //*if prev->right == prev or prev->left == prev there is a self loop so we need to take for it too.
+ //*and not re-adjust par.
if( prev->right!=prev && prev->left!=prev && prev->par->left) prev->par->left->par=prev->par;
}
- ///if we are deallocating the root
+ //*if we are deallocating the root
if(found->par==0)
root=prev;
- ///finally copy the pointers and index of found to prev node
+ //*finally copy the pointers and index of found to prev node
copy_node_ptr(prev,found);
deallocate_node(found);
}
@@ -1175,7 +1177,7 @@
void inline copy_node_ptr(patricia_node* to, patricia_node* found)
{
if(found->par!=0) {
- ///rewire found->par
+ //*rewire found->par
if(found->par->right==found)
found->par->right=to;
else
@@ -1184,18 +1186,18 @@
to->par=found->par;
if(found->right!=found)
- ///if found is not connected to itself
+ //*if found is not connected to itself
to->right=found->right;
else
to->right=to;
if(found->left!=found)
- ///if found is not connected to itself
+ //*if found is not connected to itself
to->left=found->left;
else
to->left=to;
- ///rewire the parents of left and right
+ //*rewire the parents of left and right
if ( found->left && found->left->par==found ) found->left->par=to;
if ( found->right && found->right->par==found ) found->right->par=to;
@@ -1223,7 +1225,7 @@
if(root==0) return end();
if ( Key_traits::begin(key)==Key_traits::end(key) )
{
- /// Special case for ""
+ //* Special case for ""
if(root->left==0) return end();
else
return begin();
@@ -1232,7 +1234,7 @@
/// Check whether there keys other that "" at all.
if(root->right==0)
{
- /// Lowerbound has to be ""
+ //* Lowerbound has to be ""
return begin();
}
@@ -1246,16 +1248,16 @@
switch(common.second)
{
case 2:
- ///case where key is found.
+ //*case where key is found.
return iterator(next,cur);
case 0:
- ///case where next->value.key > key. this ensures that all the nodes in the
- ///subtree also greater
+ //*case where next->value.key > key. this ensures that all the nodes in the
+ //*subtree also greater
return --iterator(next,cur);
case 1:
- ///case where the lower bound is in the subtree of next.
+ //*case where the lower bound is in the subtree of next.
it=iterator(next,cur);
- ///we just move to the highest value in the subtree.
+ //*we just move to the highest value in the subtree.
it.to_right_most();
return it;
}
@@ -1283,10 +1285,10 @@
if ( Key_traits::begin(key)==Key_traits::end(key) )
return begin();
- /// Check whether there keys other that "" at all.
+ //* Check whether there keys other that "" at all.
if ( root->right==0 )
{
- ///explicitly find the upper bound
+ //*explicitly find the upper bound
if(Key_traits::begin(key)!=Key_traits::end(key) )
return end();
else
@@ -1301,16 +1303,16 @@
switch ( common.second )
{
case 2:
- ///key aleardy exists
+ //*key aleardy exists
return iterator(next,cur);
case 1:
- ///upper bound is not in the subtree of next.its just greater than the subtree
+ //*upper bound is not in the subtree of next.its just greater than the subtree
return ++iterator(next,cur);
case 0:
- ///it is in the subtree
+ //*it is in the subtree
it=iterator(next,cur);
std::cout<<next->value.first<<"<-"<<cur->value.first<<std::endl;
- ///go to the least element in the subtree.
+ //*go to the least element in the subtree.
it.to_left_most();
return it;
}
@@ -1333,25 +1335,35 @@
if(root==0) return std::make_pair(end(),end());
+ //*if its "" then entire patricia is needed
if(Key_traits::begin(key)==Key_traits::end(key))
return std::make_pair(begin(),end());
- if(root->right==0) return std::make_pair(begin(),end());
+
+
+ //*now key!="" and there is no other key in the patricia
+ //*so only option is end(),end()
+ if(root->right==0) return std::make_pair(end(),end());
+ //*find node in between which the node was supposed to be inserted
node_pair=find_node_prev(root,key,iterator_cat(),key_size);
next=node_pair.first;
common=get_common_bits(key,next->value.first );
- if ( common.second==2 )
- {
+ if ( common.second==2 ) {
common.second=0;
+ //*if key is already found we will need to re adjust this thing
+ //*the bit index to be searched for
common.first=key_size*( bit_width + 1 );
std::cout<<"FOUND"<<std::endl;
}
+ //*if we did not find a key with entire string as prefix. then then
+ //*then we will need to ditch the procedure here.
if ( common.second!=0 || common.first % ( bit_width + 1 ) != 0)
return std::make_pair(end(),end());
std::cout<<"HERE with KEY="<<key<<std::endl;
+ //*we start searching for the until we get a key with index>common.first
next=cur=root;
while (next->index < common.first) {
cur=next;
@@ -1361,10 +1373,15 @@
cur->right: cur->left;
if(cur->index >= next->index) break;
}
+
iterator right=iterator(next,cur);
iterator left =iterator(next,cur);
+
+ //*find the smallest in the subtree of next
left.to_left_most();
+
+ //*find one greater than greatest in the subtree of next.
++right;
return std::make_pair(left,right);
}
@@ -1388,10 +1405,14 @@
it=Key_traits::begin(key);
end_it=Key_traits::end(key);
+ //*if its "" then entire patricia is needed
if(root==0) return std::make_pair(end(),end());
if(Key_traits::begin(key)==Key_traits::end(key))
return std::make_pair(begin(),end());
- if(root->right==0) return std::make_pair(begin(),end());
+
+ //*if we did not find a key with entire string as prefix. then then
+ //*then we will need to ditch the procedure here.
+ if(root->right==0) return std::make_pair(end(),end());
node_pair=find_node_prev(root,key,T());
@@ -1399,19 +1420,18 @@
assert(find_node_prev(root,key,iterator_cat()).first==next);
cur =node_pair.second;
assert(find_node_prev(root,key,iterator_cat()).second==cur);
- //find the largerst prefix matching the key and the found key
- //std::cout<<"After find"<<std::endl;
common=get_common_bits(key,next->value.first);
- //key already exists
if(common.second==2)
{
common.second=0;
+ //*no_check will indicate whether or not to check for next->index+1 > common.first
no_check=true;
}
if ( common.second!=0 || common.first % ( bit_width + 1 ) != 0)
return std::make_pair(end(),end());
+ //*we start searching for the until we get a key with index>common.first
it=Key_traits::begin(key);
cur=root;
while(it!=end_it)
@@ -1425,7 +1445,7 @@
cur->right:cur->left;
}
- //fortunately in this case; this should happen only when it==end_it occures.
+ //*fortunately in this case; this should happen only when it==end_it occures.
assert(next);
if ( no_check || next->index+1 > common.first ) break; //insert at cur using next->value->first
if ( next->index <= cur->index ) break;
@@ -1439,8 +1459,11 @@
}
iterator right=iterator(next,cur);
iterator left =iterator(next,cur);
+
+ //*find the smallest in the subtree of next
left.to_left_most();
- //right.to_right_most();
+
+ //*find one greater than greatest in the subtree of next.
++right;
return std::make_pair(left,right);
}
@@ -1475,7 +1498,11 @@
void copy_patricia(const patricia_node *other_root)
{
const patricia_node *const*other_cur,*other_temp,*other_prev;
+
+ //*cur is the pointer to the edge.
+ //*ie, most of the times, cur=&node->left or cur=&node->right
patricia_node **cur,*prev;
+
if(other_root==0)
{
this->root=0;
@@ -1483,57 +1510,74 @@
}
cur=&root;
- //std::cout<<"OTHER ROOT:"<<other_root<<std::endl;
other_cur=&other_root;
other_prev=0;
prev=0;
while(true)
{
//assert(prev!=other_root);
+ //*if the current edge in other patricia does not point to
+ //*null and is not the upward edge.
if( (*other_cur) && (*other_cur)->par==other_prev)
{
+ //*allocate a node in the current of edge of this node.
(*cur)=node_allocator.allocate(1);
+
+ //*copy index, data_type and key_type.
new(*cur) patricia_node(**other_cur);
- //assert((*cur)!=other_root);
- //assert(other_root);
- //assert((*cur)->right!=other_root);
(*cur)->par = prev;
- //std::cout<<(**cur).value.first<<" "<<(prev==0?"NULL":prev->value.first)<<std::endl;
+
+ //*get in to the next node and and move to the left edge.
other_prev=*other_cur;
other_cur=&(other_prev->left);
+
+ //*do the same for the this patricia too.
prev=*cur;
cur=&(prev->left);
//std::cout<<"copy:here1"<<std::endl;
continue;
}
std::cout<<"copy:here2"<<std::endl;
+
+ //*when we come here we know that the edge is iether null or point upwards
+ //*copy_patricia_find_par returns null is edge points to null.
+ //*otherwise it returns the corresponding parent
(*cur)=copy_patricia_find_par(prev,other_prev,*other_cur);
+
+ //*some random assert to check the pointers dont get interchaged by mistake
assert((*cur)!=other_root);
- //leaf node!!
+
+ //*if the edge is the left is the left edge
if((*other_cur)==other_prev->left)
{
- //assert(*cur!=other_root);
+ //*move towards the right egde
other_cur=&(other_prev->right);
//assert(other_prev!=prev);
cur=&(prev->right);
- std::cout<<prev->value.first<<std::endl;
- std::cout<<( (*other_cur)?(*other_cur)->value.first:"HOW NULL" )<<std::endl;
- //assert((*cur)!=other_root);
}
else
{
+ //*if already on the right edge one needs to move upward to traverse further.
other_temp=other_prev->right;
+ //*check whether we are on the right edge.
while(other_temp==other_prev->right)
{
other_temp=other_prev;
+ //*if right keep moving up
other_prev=other_prev->par;
+
+ //*do the same in other patricia too.
prev=prev->par;
if(other_prev==0)
{
- //std::cout<<"ROOT:"<<root<<std::endl;
+ //*Finished scanning through the entire patricia.
+ //*now return.
return;
}
}
+
+ //*finally its not right any more. :)
+ //*so adjust both edges towards the right
other_cur=&other_prev->right;
cur=&prev->right;
}
@@ -1546,6 +1590,7 @@
\returns true is equal false otherwise
\param p1 is the first patricia node
\param p2 is the second patricia node
+ \todo check whether are actually better ways.
*/
template<class Key,class Mapped,class Key_traits,class Alloc >
@@ -1558,6 +1603,8 @@
it_1=p1.begin();
it_2=p2.begin();
+ //* simply check whether all keys and values are equal when enumerated
+ //* in ascending order
while ( it_1 != p1.end() && it_2 != p2.end()
&& (*it_1).first == (*it_2).first && (*it_1).second == (*it_2).second )
{
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk