Fixed construction space
authornvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Mon, 20 Apr 2009 11:25:47 +0000 (11:25 +0000)
committernvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Mon, 20 Apr 2009 11:25:47 +0000 (11:25 +0000)
git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/XMLTree@330 3cdefd35-fc62-479d-8e8d-bae585ffb9ca

libcds/src/static_sequence/static_sequence_wvtree_noptrs.cpp
libcds/src/static_sequence/static_sequence_wvtree_noptrs.h

index c1c114b..daa5433 100644 (file)
@@ -21,7 +21,7 @@
  
 #include <static_sequence_wvtree_noptrs.h>
 
-static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uint n, static_bitsequence_builder * bmb, alphabet_mapper * am) {
+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 +39,13 @@ static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uin
   uint * new_symb = new uint[n+to_add];
   for(uint i=0;i<n;i++)
     new_symb[i] = symbols[i];
+
+  if (deleteSymbols)
+  {
+      delete [] symbols;
+      symbols = 0;
+  }
+
   to_add = 0;
   for(uint i=0;i<max_v;i++)
     if(occurrences[i]==0) {
@@ -71,10 +78,13 @@ static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs(uint * symbols, uin
     delete [] _bm[i];
   }
   delete [] _bm;
-  for(uint i=0;i<n;i++)
-    symbols[i] = am->unmap(symbols[i]);
-       delete [] new_symb;
-       delete [] oc;
+  
+  if (!deleteSymbols)
+      for(uint i=0;i<n;i++)
+          symbols[i] = am->unmap(symbols[i]);
+
+// delete [] new_symb; // already deleted in build_level()!
+  delete [] oc;
 }
 
 static_sequence_wvtree_noptrs::static_sequence_wvtree_noptrs() {
@@ -398,10 +408,16 @@ void static_sequence_wvtree_noptrs::build_level(uint **bm, uint *symbols, uint l
     right[cright++]=symbols[i];
     bitset(bm[level],offset+i);
   }
+  
+  delete [] symbols;
+  symbols = 0;
+  
   build_level(bm,left,level+1,cleft,offset);
+  left = 0; // Gets deleted in recursion.
   build_level(bm,right,level+1,cright,offset+cleft);
-  delete [] left;
-  delete [] right;
+  right = 0; // Gets deleted in recursion.
+  //delete [] left;
+  //delete [] right;
 }
 
 uint static_sequence_wvtree_noptrs::max_value(uint *symbols, uint n) {
index a293965..3f7a977 100644 (file)
@@ -38,7 +38,7 @@ class static_sequence_wvtree_noptrs : public static_sequence {
     /** Builds a Wavelet Tree for the string
      * pointed by symbols assuming its length
      * equals n and uses bmb to build the bitsequence */
-     static_sequence_wvtree_noptrs(uint * symbols, uint n, static_bitsequence_builder * bmb, alphabet_mapper * am);
+    static_sequence_wvtree_noptrs(uint * symbols, uint n, static_bitsequence_builder * bmb, alphabet_mapper * am, bool deleteSymbols = false);
 
     /** Destroys the Wavelet Tree */
     virtual ~static_sequence_wvtree_noptrs();