X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_sequence%2Fwt_node_internal.cpp;h=f5312db058ad0e55140b1cfde383e2b2c118e34f;hb=317fdc10a3d537fd87b855c4b8714b2472cde608;hp=d2d0fa8e771a3ffcf90e7fac745a1e06ef04e494;hpb=4bd816265ae88b4e1631634260384baa559f8967;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 d2d0fa8..f5312db 100644 --- a/libcds/src/static_sequence/wt_node_internal.cpp +++ b/libcds/src/static_sequence/wt_node_internal.cpp @@ -70,6 +70,7 @@ wt_node_internal::wt_node_internal(uint * symbols, uint n, uint l, wt_coder * c, delete [] right; } +// Deletes symbols array! wt_node_internal::wt_node_internal(uchar * symbols, uint n, uint l, wt_coder * c, static_bitsequence_builder * bmb) { uint * ibitmap = new uint[n/W+1]; for(uint i=0;i0) { if(match_left/* && c->done(left[0],l+1)*/) - left_child = new wt_node_leaf((uint)left[0], count_left); + { + left_child = new wt_node_leaf((uint)left[0], count_left); + delete [] left; + left = 0; + } else - left_child = new wt_node_internal(left, count_left, l+1, c, bmb); + { + left_child = new wt_node_internal(left, count_left, l+1, c, bmb); + left = 0; // Already deleted + } } else { left_child = NULL; } if(count_right>0) { if(match_right/* && c->done(right[0],l+1)*/) - right_child = new wt_node_leaf((uint)right[0], count_right); - else - right_child = new wt_node_internal(right, count_right, l+1, c, bmb); + { + right_child = new wt_node_leaf((uint)right[0], count_right); + delete [] right; + right = 0; + } + else + { + right_child = new wt_node_internal(right, count_right, l+1, c, bmb); + right = 0; // Already deleted + } } else { right_child = NULL; } - delete [] left; - delete [] right; +// delete [] left; // already deleted +// delete [] right; } @@ -142,19 +161,22 @@ uint wt_node_internal::rank(uint symbol, uint pos, uint l, wt_coder * c) { uint wt_node_internal::select(uint symbol, uint pos, uint l, wt_coder * c) { bool is_set = c->is_set(symbol, l); + uint ret = 0; if(!is_set) { if(left_child==NULL) return (uint)(-1); uint new_pos = left_child->select(symbol, pos, l+1,c); if(new_pos+1==0) return (uint)(-1); - return bitmap->select0(new_pos)+1; + ret = bitmap->select0(new_pos)+1; } else { if(right_child==NULL) return (uint)(-1); uint new_pos = right_child->select(symbol, pos, l+1,c); if(new_pos+1==0) return (uint)(-1); - return bitmap->select1(new_pos)+1; + ret = bitmap->select1(new_pos)+1; } + if(ret==0) return (uint)-1; + return ret; } uint wt_node_internal::access(uint pos) {