#include <ssi_qsegment.hpp>
Definition at line 17 of file ssi_qsegment.hpp.
lrnode< C, V > * alloc | ( | unsigned | size | ) | [inline, static] |
Definition at line 33 of file ssi_qsegment.hpp.
00034 { 00035 unsigned i, acc; 00036 i = size, acc =0; 00037 do { acc += i, i = i / 2 + i % 2; } while ( i > 1 ); 00038 return new lrnode<C,V>[acc+1]; 00039 };
Definition at line 42 of file ssi_qsegment.hpp.
References lrnode< C, V >::lmax, lrnode< C, V >::lmin, lrnode< C, V >::ls, Mmax, Mmin, mmx::ssi::right(), lrnode< C, V >::rmax, lrnode< C, V >::rmin, lrnode< C, V >::rs, lrnode< C, V >::umax, and lrnode< C, V >::umin.
00043 { 00044 #define Mmin(a,b) std::min(a,b) 00045 #define Mmax(a,b) std::max(a,b) 00046 00047 //std::cout<<"Enter lrnode make "<<size<< std::endl; 00048 unsigned bsize = size; 00049 bool right = true; 00050 lrnode<C,V> * built = data; 00051 lrnode<C,V> * curr = data + size; 00052 unsigned i,j; 00053 do 00054 { 00055 if ( right ) 00056 { 00057 for ( i = 0, j = 0; i < bsize-(bsize%2); i += 2, j++ ) 00058 { 00059 curr[j].umin = built[i].umin; 00060 curr[j].umax = built[i+1].umax; 00061 curr[j].lmin = Mmin(built[i].lmin, 00062 built[i+1].lmin); 00063 curr[j].lmax = Mmax(built[i].lmax, 00064 built[i+1].lmax); 00065 curr[j].rmin = Mmin(built[i].rmin, 00066 built[i+1].rmin); 00067 curr[j].rmax = Mmax(built[i].rmax, 00068 built[i+1].rmax); 00069 curr[j].ls = built + i; 00070 curr[j].rs = built + i + 1; 00071 }; 00072 00073 if ( bsize%2 ) { curr[j++] = built[bsize-1]; }; 00074 built = curr; 00075 curr += j; 00076 } 00077 else 00078 { 00079 unsigned next_size = bsize/2 + bsize % 2; 00080 //built += bsize-1; 00081 //curr += next_size-1; 00082 for ( i = 0, j = 0; i < bsize-(bsize%2); i += 2, j++ ) 00083 { 00084 curr[next_size-1-j].umin = built[bsize-1-i-1].umin; 00085 curr[next_size-1-j].umax = built[bsize-1-i].umax; 00086 curr[next_size-1-j].lmin = Mmin(built[bsize-1-i].lmin, built[bsize-1-i-1].lmin); 00087 curr[next_size-1-j].lmax = Mmax(built[bsize-1-i].lmax, built[bsize-1-i-1].lmax); 00088 curr[next_size-1-j].rmin = Mmin(built[bsize-1-i].rmin, built[bsize-1-i-1].rmin); 00089 curr[next_size-1-j].rmax = Mmax(built[bsize-1-i].rmax, built[bsize-1-i-1].rmax); 00090 curr[next_size-1-j].ls = built +(bsize-1- i - 1); 00091 curr[next_size-1-j].rs = built +(bsize-1- i); 00092 }; 00093 00094 if ( bsize%2 ) { curr[next_size-1-j] = built[bsize-1-bsize+1]; }; 00095 built = curr; //- next_size+1; 00096 curr += next_size-1; 00097 curr++; 00098 }; 00099 right = !right; 00100 bsize = bsize/2 + bsize%2; 00101 } 00102 while( bsize > 1 ); 00103 //std::cout<<"Exit lrnode make"<<std::endl; 00104 return --curr; 00105 };
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 20 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 20 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().
Definition at line 19 of file ssi_qsegment.hpp.
Referenced by qsegment< C, V >::make(), lrnode< C, V >::make(), and qsegment< C, V >::qsegment().