X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_sequence%2Fwt_node_internal.cpp;h=0232a73e01f6baa08a674c032ac73e7b7956109a;hb=890b1368035b2723944894e2b0ec51139c8b2e91;hp=ca21c73d7e825c673f05ac27bd1d20e04856c06a;hpb=ff7c37ba64ceaec0a0eee8af7230edf1df302939;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_sequence/wt_node_internal.cpp b/libcds/src/static_sequence/wt_node_internal.cpp index ca21c73..0232a73 100644 --- a/libcds/src/static_sequence/wt_node_internal.cpp +++ b/libcds/src/static_sequence/wt_node_internal.cpp @@ -207,42 +207,22 @@ uint wt_node_internal::access(uint pos) { // Returns the value at given position and its rank uint wt_node_internal::access(uint pos, uint &rank) { - // p is the internal node we are pointing our finger at each step - wt_node_internal *p = this; - - while(1) + bool is_set = bitmap->access(pos); + if(!is_set) { - bool is_set = p->bitmap->access(pos); -// cout << "is_set = " << is_set << ", pos = " << pos << ", rank0 = " << bitmap->rank0(pos) << ", rank1 = " << bitmap->rank1(pos) << endl; - if(!is_set) - { - // recurse left - pos = p->bitmap->rank0(pos)-1; - wt_node_internal *tmp = dynamic_cast(p->left_child); - if (tmp == NULL) - { - // it's a leaf - rank = pos+1; - return p->left_child->access(0); - } - p = tmp; // new internal node - } - else - { - // recurse right - pos = p->bitmap->rank1(pos)-1; - wt_node_internal *tmp = dynamic_cast(p->right_child); - if (tmp == NULL) - { - // it's a leaf - rank = pos+1; - return p->right_child->access(0); - } - p = tmp; // new internal node - } + // recurse left + pos = bitmap->rank0(pos)-1; + return left_child->access(pos, rank); + } + else + { + // recurse right + pos = bitmap->rank1(pos)-1; + return right_child->access(pos, rank); } } + void wt_node_internal::access(vector &result, uint i, uint j, uint min, uint max, uint l, uint pivot) { uint symbol = pivot | (1 << l);