X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_sequence%2Fstatic_sequence_wvtree_noptrs.cpp;h=18ddcbd2c6670d8fb6edbb6c86df1d24f39b80a8;hb=a75155efc2ed07c1907ef017360bd719a47f9c06;hp=99e0c6a78e639198088f58bfa879f477265a6c64;hpb=27a8f46b4d66ba249e5ecf8fbfa954e15d582509;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_sequence/static_sequence_wvtree_noptrs.cpp b/libcds/src/static_sequence/static_sequence_wvtree_noptrs.cpp index 99e0c6a..18ddcbd 100644 --- a/libcds/src/static_sequence/static_sequence_wvtree_noptrs.cpp +++ b/libcds/src/static_sequence/static_sequence_wvtree_noptrs.cpp @@ -20,8 +20,9 @@ */ #include - -static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uint n, static_bitsequence_builder * bmb, alphabet_mapper * am) { +using std::min; +using std::max; +static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uint n, static_bitsequence_builder * bmb, alphabet_mapper * am, bool deleteSymbols) { this->n=n; this->am=am; am->use(); @@ -39,6 +40,13 @@ static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uin uint * new_symb = new uint[n+to_add]; for(uint i=0;iunmap(symbols[i]); + +// delete [] new_symb; // already deleted in build_level()! + delete [] oc; +} + +// symbols is an array of elements of "width" bits +static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uint n, unsigned width, static_bitsequence_builder * bmb, alphabet_mapper * am, bool deleteSymbols) { + this->n=n; + this->am=am; + am->use(); + for(uint i=0;imap(get_field(symbols, width, i))); + max_v=max_value(symbols, width, n); + height=bits(max_v); + uint *occurrences=new uint[max_v+1]; + for(uint i=0;i<=max_v;i++) occurrences[i]=0; + for(uint i=0;iunmap(symbols[i]); - delete [] new_symb; - delete [] oc; + set_field(new_symb, width, i, get_field(symbols, width, i)); + + if (deleteSymbols) + { + delete [] symbols; + symbols = 0; + } + + to_add = 0; + for(uint i=0;ibuild(oc,new_n+1); + delete [] occurrences; + this->n = new_n; + uint ** _bm=new uint*[height]; + for(uint i=0;ibuild(_bm[i],new_n); + delete [] _bm[i]; + } + delete [] _bm; + + if (!deleteSymbols) + for(uint i=0;iunmap(get_field(symbols, width, i))); + +// delete [] new_symb; // already deleted in build_level()! + delete [] oc; } static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs() { @@ -241,7 +319,7 @@ void static_sequence_wvtree_noptrs::access(vector &result, uint i, uint j, vector static_sequence_wvtree_noptrs::accessAll(uint i, uint j) { vector resultSet; - if (j > i) + if (j < i) return resultSet; resultSet.reserve(j-i+1); @@ -381,7 +459,11 @@ uint static_sequence_wvtree_noptrs::size() { } void static_sequence_wvtree_noptrs::build_level(uint **bm, uint *symbols, uint level, uint length, uint offset) { - if(level==height) return; + if(level==height) + { + delete [] symbols; + return; + } uint cleft=0; for(uint i=0;i