lrnode< C, V > Struct Template Reference

#include <ssi_qsegment.hpp>

List of all members.

Static Public Member Functions

Public Attributes


Detailed Description

template<class C, class V>
struct mmx::ssi::lrnode< C, V >

Definition at line 17 of file ssi_qsegment.hpp.


Member Function Documentation

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   };

lrnode< C, V > * make ( lrnode< C, V > *  data,
unsigned  size 
) [inline, static]

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 };


Member Data Documentation

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().

lrnode<C,V> * ls
lrnode<C,V>* rs

The documentation for this struct was generated from the following file:

Generated on 6 Dec 2012 for shape by  doxygen 1.6.1