ROOT logo
// @(#)root/tree:$Id: TEntryListBlock.cxx 23466 2008-04-23 13:52:45Z brun $
// Author: Anna Kreshuk 27/10/2006

/*************************************************************************
 * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//______________________________________________________________________________
/* Begin_Html
<center><h2>TEntryListBlock: Used by TEntryList to store the entry numbers</h2></center>
 There are 2 ways to represent entry numbers in a TEntryListBlock:
<ol>
 <li> as bits, where passing entry numbers are assigned 1, not passing - 0
 <li> as a simple array of entry numbers
<ul>
<li> storing the numbers of entries that pass
<li> storing the numbers of entries that don't pass
</ul>
 </ol>
 In both cases, a UShort_t* is used. The second option is better in case
 less than 1/16 or more than 15/16 of entries pass the selection, and the representation can be
 changed by calling OptimizeStorage() function. 
 When the block is being filled, it's always stored as bits, and the OptimizeStorage()
 function is called by TEntryList when it starts filling the next block. If
 Enter() or Remove() is called after OptimizeStorage(), representation is 
 again changed to 1). 
End_Html
Begin_Macro(source)
entrylistblock_figure1.C
End_Macro

Begin_Html
 <h4>Operations on blocks (see also function comments)</h4>
<ul>
 <li> <b>Merge</b>() - adds all entries from one block to the other. If the first block 
             uses array representation, it's changed to bits representation only
             if the total number of passing entries is still less than kBlockSize
 <li> <b>GetEntry(n)</b> - returns n-th non-zero entry.
 <li> <b>Next</b>()      - return next non-zero entry. In case of representation 1), Next()
                 is faster than GetEntry()
</ul>
End_Html */


#include "TEntryListBlock.h"
#include "TString.h"

ClassImp(TEntryListBlock)

//______________________________________________________________________________
TEntryListBlock::TEntryListBlock()
{
   //default c-tor

   fIndices = 0;
   fN = kBlockSize;
   fNPassed = 0;
   fType = -1;
   fPassing = 1;
   fCurrent = 0;
   fLastIndexReturned = -1;
   fLastIndexQueried = -1;
}

//______________________________________________________________________________
TEntryListBlock::TEntryListBlock(const TEntryListBlock &eblock) : TObject(eblock)
{
   //copy c-tor

   Int_t i;
   fN = eblock.fN;
   if (eblock.fIndices){
      fIndices = new UShort_t[fN];
      for (i=0; i<fN; i++)
         fIndices[i] = eblock.fIndices[i];
   }
   fNPassed = eblock.fNPassed;
   fType = eblock.fType;
   fPassing = eblock.fPassing;
   fCurrent = eblock.fCurrent;
   fLastIndexReturned = -1;
   fLastIndexQueried = -1;
}


//______________________________________________________________________________
TEntryListBlock::~TEntryListBlock()
{
   //destructor

   if (fIndices)
      delete [] fIndices;
   fIndices = 0;
}

//______________________________________________________________________________
Bool_t TEntryListBlock::Enter(Int_t entry)
{
   //If the block has already been optimized and the entries
   //are stored as a list and not as bits, trying to enter a new entry
   //will make the block switch to bits representation

   if (entry > kBlockSize*16) {
      Error("Enter", "illegal entry value!");
      return 0;
   }
   if (!fIndices){
      fIndices = new UShort_t[kBlockSize] ;
      for (Int_t i=0; i<kBlockSize; i++)
         fIndices[i] = 0;
      fType = 0; //start in bits
   }
   if (fType==0){
      //bits
      Int_t i = entry>>4;
      Int_t j = entry & 15;
      if ((fIndices[i] & (1<<j))==0){
         fIndices[i] |= 1<<j;
         fNPassed++;
         return 1;
      } else {
         return 0;
      }
   }
   //list
   //change to bits
   UShort_t *bits = new UShort_t[kBlockSize];
   Transform(1, bits);
   Enter(entry);
   return 0;
}

//______________________________________________________________________________
Bool_t TEntryListBlock::Remove(Int_t entry)
{
//Remove entry #entry
//If the block has already been optimized and the entries
//are stored as a list and not as bits, trying to remove a new entry
//will make the block switch to bits representation

   if (entry > kBlockSize*16) {
      Error("Remove", "Illegal entry value!\n");
      return 0;
   }
   if (fType==0){
      Int_t i = entry>>4;
      Int_t j = entry & 15;
      if ((fIndices[i] & (1<<j))!=0){
         fIndices[i] &= (0xFFFF^(1<<j));
         fNPassed--;
         return 1;
      } else { 
         return 0;
      }
   }
   //list
   //change to bits
   UShort_t *bits = new UShort_t[kBlockSize];
   Transform(1, bits);
   return Remove(entry);
   //return 0;
}
//______________________________________________________________________________
Int_t TEntryListBlock::Contains(Int_t entry)
{
//true if the block contains entry #entry

   if (entry > kBlockSize*16) {
      Error("Contains", "Illegal entry value!\n");
      return 0;
   }
   if (!fIndices && fPassing)
      return 0;
   if (fType==0){
      //bits
      Int_t i = entry>>4;
      Int_t j = entry & 15;
      Bool_t result = (fIndices[i] & (1<<j))!=0;
      return result;
   }
   //list
   if (entry < fCurrent) fCurrent = 0;
   if (fPassing){
      for (Int_t i = fCurrent; i<fNPassed; i++){
         if (fIndices[i]==entry){
            fCurrent = i;
            return kTRUE;
         }
      }
   } else {
      if (!fIndices || fNPassed==0){
         //all entries pass
         return kTRUE;
      } 
      if (entry > fIndices[fNPassed-1])
         return kTRUE;
      for (Int_t i= fCurrent; i<fNPassed; i++){
         if (fIndices[i]==entry){
            fCurrent = i;
            return kFALSE;
         } 
         if (fIndices[i]>entry){
            fCurrent = i;
            return kTRUE;
         }
      }
   }
   return 0;
}

//______________________________________________________________________________
Int_t TEntryListBlock::Merge(TEntryListBlock *block)
{
   //Merge with the other block
   //Returns the resulting number of entries in the block

   Int_t i, j;
   if (block->GetNPassed() == 0) return GetNPassed();
   if (GetNPassed() == 0){
      //this block is empty
      fN = block->fN;
      fIndices = new UShort_t[fN];
      for (i=0; i<fN; i++)
         fIndices[i] = block->fIndices[i];
      fNPassed = block->fNPassed;
      fType = block->fType;
      fPassing = block->fPassing;
      fCurrent = block->fCurrent;
      fLastIndexReturned = -1;
      fLastIndexQueried = -1;
      return fNPassed;
   }
   if (fType==0){
      //stored as bits
      if (block->fType == 0){
         for (i=0; i<kBlockSize*16; i++){
            if (block->Contains(i))
               Enter(i);
         }
      } else {
         if (block->fPassing){
            //the other block stores entries that pass
            for (i=0; i<block->fNPassed; i++){
               Enter(block->fIndices[i]);
            }
         } else {
            //the other block stores entries that don't pass
            if (block->fNPassed==0){
               for (i=0; i<kBlockSize*16; i++){
                  Enter(i);
               }
            }
            for (j=0; j<block->fIndices[0]; j++)
               Enter(j);
            for (i=0; i<block->fNPassed-1; i++){
               for (j=block->fIndices[i]+1; j<block->fIndices[i+1]; j++){
                  Enter(j);
               }
            }
            for (j=block->fIndices[block->fNPassed-1]+1; j<kBlockSize*16; j++)
               Enter(j);
         }
      }
   } else {
      //stored as a list
      if (GetNPassed() + block->GetNPassed() > kBlockSize){
         //change to bits
         UShort_t *bits = new UShort_t[kBlockSize];
         Transform(1, bits);
         Merge(block);
      } else {
         //this is only possible if fPassing=1 in both blocks
         if (block->fType==1){
            //second block stored as a list
            //make a bigger list
            Int_t en = block->fNPassed;
            Int_t newsize = fNPassed + en;
            UShort_t *newlist = new UShort_t[newsize];
            UShort_t *elst = block->fIndices;
            Int_t newpos, elpos;
            newpos = elpos = 0;
            for (i=0; i<fNPassed; i++) {
               while (elpos < en && fIndices[i] > elst[elpos]) {
                  newlist[newpos] = elst[elpos];
                  newpos++;
                  elpos++;
               }
               if (fIndices[i] == elst[elpos]) elpos++;
               newlist[newpos] = fIndices[i];
               newpos++;
            }
            while (elpos < en) {
               newlist[newpos] = elst[elpos];
               newpos++;
               elpos++;
            }
            delete [] fIndices;
            fIndices = newlist;
            fNPassed = newpos;
            fN = fNPassed;
         } else {
            //second block is stored as bits

            Int_t en = block->fNPassed;
            Int_t newsize = fNPassed + en;
            UShort_t *newlist = new UShort_t[newsize];
            Int_t newpos, current;
            newpos = current = 0;
            for (i=0; i<kBlockSize*16; i++){
               if (!block->Contains(i)) continue;
               while(current < fNPassed && fIndices[current]<i){
                  newlist[newpos] = fIndices[current];
                  current++;
                  newpos++;
               }
               if (fIndices[current]==i) current++;
               newlist[newpos] = i;
               newpos++;
            }
            while(current<fNPassed){
               newlist[newpos] = fIndices[current];
               newpos++;
               current++;
            }
            delete [] fIndices;
            fIndices = newlist;
            fNPassed = newpos;
            fN = fNPassed;
         }
      }
   }
   fLastIndexQueried = -1;
   fLastIndexReturned = -1;
   OptimizeStorage();
   return GetNPassed();
}

//______________________________________________________________________________
Int_t TEntryListBlock::GetNPassed()
{
//Returns the number of entries, passing the selection.
//In case, when the block stores entries that pass (fPassing=1) returns fNPassed

   if (fPassing)
      return fNPassed;
   else
      return kBlockSize*16-fNPassed;
}

//______________________________________________________________________________
Int_t TEntryListBlock::GetEntry(Int_t entry)
{
//Return entry #entry
//See also Next()

   if (entry > kBlockSize*16) return -1;
   if (entry > GetNPassed()) return -1;
   if (entry == fLastIndexQueried+1) return Next();
   else {
      Int_t i=0; Int_t j=0; Int_t entries_found=0;
      if (fType==0){
         if ((fIndices[i] & (1<<j))!=0)
            entries_found++;
         while (entries_found<entry+1){
            if (j==15){i++; j=0;}
            else j++;
            if ((fIndices[i] & (1<<j))!=0)
               entries_found++;
         }
         fLastIndexQueried = entry;
         fLastIndexReturned = i*16+j;
         return fLastIndexReturned;
      }
      if (fType==1){
         if (fPassing){
            fLastIndexQueried = entry;
            fLastIndexReturned = fIndices[entry];
            return fIndices[entry];
         } else {
            fLastIndexQueried = entry;
            if (!fIndices || fNPassed==0){
               //all entries pass
               fLastIndexReturned = entry;
               return fLastIndexReturned;
            } 
            for (i=0; i<fIndices[0]; i++){               
               entries_found++;
               if (entries_found==entry+1){
                  fLastIndexReturned = i;
                  return fLastIndexReturned;
               }
            }
            for (i=0; i<fNPassed-1; i++){
               for (j=fIndices[i]+1; j<fIndices[i+1]; j++){
                  entries_found++;
                  if (entries_found==entry+1){
                     fLastIndexReturned = j;
                     return fLastIndexReturned;
                  }
               }
            }
            for (j=fIndices[fNPassed-1]+1; j<kBlockSize*16; j++){
               entries_found++;
               if (entries_found==entry+1){
                  fLastIndexReturned = j;
                  return fLastIndexReturned;
               }
            }
         }   
      }
      return -1;
   }
}

//______________________________________________________________________________
Int_t TEntryListBlock::Next()
{
//Return the next non-zero entry
//Faster than GetEntry() function

   if (fLastIndexQueried==GetNPassed()-1){
      fLastIndexQueried=-1;
      fLastIndexReturned = -1;
      return -1;
   }

   if (fType==0) {
      //bits
      Int_t i=0;
      Int_t j=0;
      fLastIndexReturned++;
      i = fLastIndexReturned>>4;
      j = fLastIndexReturned & 15;
      Bool_t result=(fIndices[i] & (1<<j))!=0;
      while (result==0){
         if (j==15) {j=0; i++;}
         else j++;
         result = (fIndices[i] & (1<<j))!=0;
      }
      fLastIndexReturned = i*16+j;
      fLastIndexQueried++;
      return fLastIndexReturned;

   } 
   if (fType==1) {
      fLastIndexQueried++;
      if (fPassing){
         fLastIndexReturned = fIndices[fLastIndexQueried];
         return fIndices[fLastIndexQueried];
      } else {
         fLastIndexReturned++;
         while (!Contains(fLastIndexReturned)){
            fLastIndexReturned++;
            }
         return fLastIndexReturned;
      }
      
   }
   return -1;
}

//______________________________________________________________________________
void TEntryListBlock::Print(const Option_t *option) const
{
   //Print the entries in this block

   TString opt = option;
   opt.ToUpper();
   if (opt.Contains("A")) PrintWithShift(0);
}

//______________________________________________________________________________
void TEntryListBlock::PrintWithShift(Int_t shift) const
{
   //print the indices of this block + shift (used from TEntryList::Print()) to 
   //print the corrent values

   Int_t i;
   if (fType==0){
      Int_t ibit, ibite;
      Bool_t result;
      for (i=0; i<kBlockSize*16; i++){
         ibite = i>>4;
         ibit = i & 15;
         result = (fIndices[ibite] & (1<<ibit))!=0;
         if (result)
            printf("%d\n", i+shift);
      }
   } else {
      if (fPassing){
         for (i=0; i<fNPassed; i++){
            printf("%d\n", fIndices[i]+shift);
         }
      } else {
         if (fNPassed==0){
            for (i=0; i<kBlockSize*16; i++)
               printf("%d\n", i+shift);
            return;
         }
         for (i=0; i<fIndices[0]; i++){
            printf("%d\n", i+shift);
         }
         for (i=0; i<fNPassed-1; i++){
            for (Int_t j=fIndices[i]+1; j<fIndices[i+1]; j++){
               printf("%d\n", j+shift);
            }
         }
         for (Int_t j=fIndices[fNPassed-1]+1; j<kBlockSize*16; j++){
            printf("%d\n", j+shift);
         }
      }
   }
}


//______________________________________________________________________________
void TEntryListBlock::OptimizeStorage()
{
   //if there are < kBlockSize or >kBlockSize*15 entries, change to an array representation

   if (fType!=0) return;
   if (fNPassed > kBlockSize*15)
      fPassing = 0;
   if (fNPassed<kBlockSize || !fPassing){
      //less than 4000 entries passing, makes sense to change from bits to list
      UShort_t *indexnew = new UShort_t[fNPassed];
      Transform(0, indexnew);
   }
}


//______________________________________________________________________________
void TEntryListBlock::Transform(Bool_t dir, UShort_t *indexnew)
{
   //Transform the existing fIndices
   //dir=0 - transform from bits to a list
   //dir=1 - tranform from a list to bits

   Int_t i=0;
   Int_t ilist = 0;
   Int_t ibite, ibit;
   if (!dir) {
         for (i=0; i<kBlockSize*16; i++){
            ibite = i >> 4;
            ibit = i & 15;
            Bool_t result = (fIndices[ibite] & (1<<ibit))!=0;
            if (result && fPassing){
               //fill with the entries that pass
               indexnew[ilist] = i;
               ilist++;
            }
            else if (!result && !fPassing){
               //fill with the entries that don't pass
               indexnew[ilist] = i;
               ilist++;
            }
         }
      if (fIndices)
         delete [] fIndices;
      fIndices = indexnew;
      fType = 1;
      if (!fPassing)
         fNPassed = kBlockSize*16-fNPassed;
      fN = fNPassed;
      return;
   }


   if (fPassing){
      for (i=0; i<kBlockSize; i++)
         indexnew[i] = 0;
      for (i=0; i<fNPassed; i++){
         ibite = fIndices[i]>>4;
         ibit = fIndices[i] & 15;
         indexnew[ibite] |= 1<<ibit;
      }
   } else {
      for (i=0; i<kBlockSize; i++)
         indexnew[i] = 65535;
      for (i=0; i<fNPassed; i++){
         ibite = fIndices[i]>>4;
         ibit = fIndices[i] & 15;
         indexnew[ibite] ^= 1<<ibit;
      }
      fNPassed = kBlockSize*16-fNPassed;
   } 
   if (fIndices)
      delete [] fIndices;
   fIndices = indexnew;
   fType = 0;
   fN = kBlockSize;
   fPassing = 1;
   return;
}
 TEntryListBlock.cxx:1
 TEntryListBlock.cxx:2
 TEntryListBlock.cxx:3
 TEntryListBlock.cxx:4
 TEntryListBlock.cxx:5
 TEntryListBlock.cxx:6
 TEntryListBlock.cxx:7
 TEntryListBlock.cxx:8
 TEntryListBlock.cxx:9
 TEntryListBlock.cxx:10
 TEntryListBlock.cxx:11
 TEntryListBlock.cxx:12
 TEntryListBlock.cxx:13
 TEntryListBlock.cxx:14
 TEntryListBlock.cxx:15
 TEntryListBlock.cxx:16
 TEntryListBlock.cxx:17
 TEntryListBlock.cxx:18
 TEntryListBlock.cxx:19
 TEntryListBlock.cxx:20
 TEntryListBlock.cxx:21
 TEntryListBlock.cxx:22
 TEntryListBlock.cxx:23
 TEntryListBlock.cxx:24
 TEntryListBlock.cxx:25
 TEntryListBlock.cxx:26
 TEntryListBlock.cxx:27
 TEntryListBlock.cxx:28
 TEntryListBlock.cxx:29
 TEntryListBlock.cxx:30
 TEntryListBlock.cxx:31
 TEntryListBlock.cxx:32
 TEntryListBlock.cxx:33
 TEntryListBlock.cxx:34
 TEntryListBlock.cxx:35
 TEntryListBlock.cxx:36
 TEntryListBlock.cxx:37
 TEntryListBlock.cxx:38
 TEntryListBlock.cxx:39
 TEntryListBlock.cxx:40
 TEntryListBlock.cxx:41
 TEntryListBlock.cxx:42
 TEntryListBlock.cxx:43
 TEntryListBlock.cxx:44
 TEntryListBlock.cxx:45
 TEntryListBlock.cxx:46
 TEntryListBlock.cxx:47
 TEntryListBlock.cxx:48
 TEntryListBlock.cxx:49
 TEntryListBlock.cxx:50
 TEntryListBlock.cxx:51
 TEntryListBlock.cxx:52
 TEntryListBlock.cxx:53
 TEntryListBlock.cxx:54
 TEntryListBlock.cxx:55
 TEntryListBlock.cxx:56
 TEntryListBlock.cxx:57
 TEntryListBlock.cxx:58
 TEntryListBlock.cxx:59
 TEntryListBlock.cxx:60
 TEntryListBlock.cxx:61
 TEntryListBlock.cxx:62
 TEntryListBlock.cxx:63
 TEntryListBlock.cxx:64
 TEntryListBlock.cxx:65
 TEntryListBlock.cxx:66
 TEntryListBlock.cxx:67
 TEntryListBlock.cxx:68
 TEntryListBlock.cxx:69
 TEntryListBlock.cxx:70
 TEntryListBlock.cxx:71
 TEntryListBlock.cxx:72
 TEntryListBlock.cxx:73
 TEntryListBlock.cxx:74
 TEntryListBlock.cxx:75
 TEntryListBlock.cxx:76
 TEntryListBlock.cxx:77
 TEntryListBlock.cxx:78
 TEntryListBlock.cxx:79
 TEntryListBlock.cxx:80
 TEntryListBlock.cxx:81
 TEntryListBlock.cxx:82
 TEntryListBlock.cxx:83
 TEntryListBlock.cxx:84
 TEntryListBlock.cxx:85
 TEntryListBlock.cxx:86
 TEntryListBlock.cxx:87
 TEntryListBlock.cxx:88
 TEntryListBlock.cxx:89
 TEntryListBlock.cxx:90
 TEntryListBlock.cxx:91
 TEntryListBlock.cxx:92
 TEntryListBlock.cxx:93
 TEntryListBlock.cxx:94
 TEntryListBlock.cxx:95
 TEntryListBlock.cxx:96
 TEntryListBlock.cxx:97
 TEntryListBlock.cxx:98
 TEntryListBlock.cxx:99
 TEntryListBlock.cxx:100
 TEntryListBlock.cxx:101
 TEntryListBlock.cxx:102
 TEntryListBlock.cxx:103
 TEntryListBlock.cxx:104
 TEntryListBlock.cxx:105
 TEntryListBlock.cxx:106
 TEntryListBlock.cxx:107
 TEntryListBlock.cxx:108
 TEntryListBlock.cxx:109
 TEntryListBlock.cxx:110
 TEntryListBlock.cxx:111
 TEntryListBlock.cxx:112
 TEntryListBlock.cxx:113
 TEntryListBlock.cxx:114
 TEntryListBlock.cxx:115
 TEntryListBlock.cxx:116
 TEntryListBlock.cxx:117
 TEntryListBlock.cxx:118
 TEntryListBlock.cxx:119
 TEntryListBlock.cxx:120
 TEntryListBlock.cxx:121
 TEntryListBlock.cxx:122
 TEntryListBlock.cxx:123
 TEntryListBlock.cxx:124
 TEntryListBlock.cxx:125
 TEntryListBlock.cxx:126
 TEntryListBlock.cxx:127
 TEntryListBlock.cxx:128
 TEntryListBlock.cxx:129
 TEntryListBlock.cxx:130
 TEntryListBlock.cxx:131
 TEntryListBlock.cxx:132
 TEntryListBlock.cxx:133
 TEntryListBlock.cxx:134
 TEntryListBlock.cxx:135
 TEntryListBlock.cxx:136
 TEntryListBlock.cxx:137
 TEntryListBlock.cxx:138
 TEntryListBlock.cxx:139
 TEntryListBlock.cxx:140
 TEntryListBlock.cxx:141
 TEntryListBlock.cxx:142
 TEntryListBlock.cxx:143
 TEntryListBlock.cxx:144
 TEntryListBlock.cxx:145
 TEntryListBlock.cxx:146
 TEntryListBlock.cxx:147
 TEntryListBlock.cxx:148
 TEntryListBlock.cxx:149
 TEntryListBlock.cxx:150
 TEntryListBlock.cxx:151
 TEntryListBlock.cxx:152
 TEntryListBlock.cxx:153
 TEntryListBlock.cxx:154
 TEntryListBlock.cxx:155
 TEntryListBlock.cxx:156
 TEntryListBlock.cxx:157
 TEntryListBlock.cxx:158
 TEntryListBlock.cxx:159
 TEntryListBlock.cxx:160
 TEntryListBlock.cxx:161
 TEntryListBlock.cxx:162
 TEntryListBlock.cxx:163
 TEntryListBlock.cxx:164
 TEntryListBlock.cxx:165
 TEntryListBlock.cxx:166
 TEntryListBlock.cxx:167
 TEntryListBlock.cxx:168
 TEntryListBlock.cxx:169
 TEntryListBlock.cxx:170
 TEntryListBlock.cxx:171
 TEntryListBlock.cxx:172
 TEntryListBlock.cxx:173
 TEntryListBlock.cxx:174
 TEntryListBlock.cxx:175
 TEntryListBlock.cxx:176
 TEntryListBlock.cxx:177
 TEntryListBlock.cxx:178
 TEntryListBlock.cxx:179
 TEntryListBlock.cxx:180
 TEntryListBlock.cxx:181
 TEntryListBlock.cxx:182
 TEntryListBlock.cxx:183
 TEntryListBlock.cxx:184
 TEntryListBlock.cxx:185
 TEntryListBlock.cxx:186
 TEntryListBlock.cxx:187
 TEntryListBlock.cxx:188
 TEntryListBlock.cxx:189
 TEntryListBlock.cxx:190
 TEntryListBlock.cxx:191
 TEntryListBlock.cxx:192
 TEntryListBlock.cxx:193
 TEntryListBlock.cxx:194
 TEntryListBlock.cxx:195
 TEntryListBlock.cxx:196
 TEntryListBlock.cxx:197
 TEntryListBlock.cxx:198
 TEntryListBlock.cxx:199
 TEntryListBlock.cxx:200
 TEntryListBlock.cxx:201
 TEntryListBlock.cxx:202
 TEntryListBlock.cxx:203
 TEntryListBlock.cxx:204
 TEntryListBlock.cxx:205
 TEntryListBlock.cxx:206
 TEntryListBlock.cxx:207
 TEntryListBlock.cxx:208
 TEntryListBlock.cxx:209
 TEntryListBlock.cxx:210
 TEntryListBlock.cxx:211
 TEntryListBlock.cxx:212
 TEntryListBlock.cxx:213
 TEntryListBlock.cxx:214
 TEntryListBlock.cxx:215
 TEntryListBlock.cxx:216
 TEntryListBlock.cxx:217
 TEntryListBlock.cxx:218
 TEntryListBlock.cxx:219
 TEntryListBlock.cxx:220
 TEntryListBlock.cxx:221
 TEntryListBlock.cxx:222
 TEntryListBlock.cxx:223
 TEntryListBlock.cxx:224
 TEntryListBlock.cxx:225
 TEntryListBlock.cxx:226
 TEntryListBlock.cxx:227
 TEntryListBlock.cxx:228
 TEntryListBlock.cxx:229
 TEntryListBlock.cxx:230
 TEntryListBlock.cxx:231
 TEntryListBlock.cxx:232
 TEntryListBlock.cxx:233
 TEntryListBlock.cxx:234
 TEntryListBlock.cxx:235
 TEntryListBlock.cxx:236
 TEntryListBlock.cxx:237
 TEntryListBlock.cxx:238
 TEntryListBlock.cxx:239
 TEntryListBlock.cxx:240
 TEntryListBlock.cxx:241
 TEntryListBlock.cxx:242
 TEntryListBlock.cxx:243
 TEntryListBlock.cxx:244
 TEntryListBlock.cxx:245
 TEntryListBlock.cxx:246
 TEntryListBlock.cxx:247
 TEntryListBlock.cxx:248
 TEntryListBlock.cxx:249
 TEntryListBlock.cxx:250
 TEntryListBlock.cxx:251
 TEntryListBlock.cxx:252
 TEntryListBlock.cxx:253
 TEntryListBlock.cxx:254
 TEntryListBlock.cxx:255
 TEntryListBlock.cxx:256
 TEntryListBlock.cxx:257
 TEntryListBlock.cxx:258
 TEntryListBlock.cxx:259
 TEntryListBlock.cxx:260
 TEntryListBlock.cxx:261
 TEntryListBlock.cxx:262
 TEntryListBlock.cxx:263
 TEntryListBlock.cxx:264
 TEntryListBlock.cxx:265
 TEntryListBlock.cxx:266
 TEntryListBlock.cxx:267
 TEntryListBlock.cxx:268
 TEntryListBlock.cxx:269
 TEntryListBlock.cxx:270
 TEntryListBlock.cxx:271
 TEntryListBlock.cxx:272
 TEntryListBlock.cxx:273
 TEntryListBlock.cxx:274
 TEntryListBlock.cxx:275
 TEntryListBlock.cxx:276
 TEntryListBlock.cxx:277
 TEntryListBlock.cxx:278
 TEntryListBlock.cxx:279
 TEntryListBlock.cxx:280
 TEntryListBlock.cxx:281
 TEntryListBlock.cxx:282
 TEntryListBlock.cxx:283
 TEntryListBlock.cxx:284
 TEntryListBlock.cxx:285
 TEntryListBlock.cxx:286
 TEntryListBlock.cxx:287
 TEntryListBlock.cxx:288
 TEntryListBlock.cxx:289
 TEntryListBlock.cxx:290
 TEntryListBlock.cxx:291
 TEntryListBlock.cxx:292
 TEntryListBlock.cxx:293
 TEntryListBlock.cxx:294
 TEntryListBlock.cxx:295
 TEntryListBlock.cxx:296
 TEntryListBlock.cxx:297
 TEntryListBlock.cxx:298
 TEntryListBlock.cxx:299
 TEntryListBlock.cxx:300
 TEntryListBlock.cxx:301
 TEntryListBlock.cxx:302
 TEntryListBlock.cxx:303
 TEntryListBlock.cxx:304
 TEntryListBlock.cxx:305
 TEntryListBlock.cxx:306
 TEntryListBlock.cxx:307
 TEntryListBlock.cxx:308
 TEntryListBlock.cxx:309
 TEntryListBlock.cxx:310
 TEntryListBlock.cxx:311
 TEntryListBlock.cxx:312
 TEntryListBlock.cxx:313
 TEntryListBlock.cxx:314
 TEntryListBlock.cxx:315
 TEntryListBlock.cxx:316
 TEntryListBlock.cxx:317
 TEntryListBlock.cxx:318
 TEntryListBlock.cxx:319
 TEntryListBlock.cxx:320
 TEntryListBlock.cxx:321
 TEntryListBlock.cxx:322
 TEntryListBlock.cxx:323
 TEntryListBlock.cxx:324
 TEntryListBlock.cxx:325
 TEntryListBlock.cxx:326
 TEntryListBlock.cxx:327
 TEntryListBlock.cxx:328
 TEntryListBlock.cxx:329
 TEntryListBlock.cxx:330
 TEntryListBlock.cxx:331
 TEntryListBlock.cxx:332
 TEntryListBlock.cxx:333
 TEntryListBlock.cxx:334
 TEntryListBlock.cxx:335
 TEntryListBlock.cxx:336
 TEntryListBlock.cxx:337
 TEntryListBlock.cxx:338
 TEntryListBlock.cxx:339
 TEntryListBlock.cxx:340
 TEntryListBlock.cxx:341
 TEntryListBlock.cxx:342
 TEntryListBlock.cxx:343
 TEntryListBlock.cxx:344
 TEntryListBlock.cxx:345
 TEntryListBlock.cxx:346
 TEntryListBlock.cxx:347
 TEntryListBlock.cxx:348
 TEntryListBlock.cxx:349
 TEntryListBlock.cxx:350
 TEntryListBlock.cxx:351
 TEntryListBlock.cxx:352
 TEntryListBlock.cxx:353
 TEntryListBlock.cxx:354
 TEntryListBlock.cxx:355
 TEntryListBlock.cxx:356
 TEntryListBlock.cxx:357
 TEntryListBlock.cxx:358
 TEntryListBlock.cxx:359
 TEntryListBlock.cxx:360
 TEntryListBlock.cxx:361
 TEntryListBlock.cxx:362
 TEntryListBlock.cxx:363
 TEntryListBlock.cxx:364
 TEntryListBlock.cxx:365
 TEntryListBlock.cxx:366
 TEntryListBlock.cxx:367
 TEntryListBlock.cxx:368
 TEntryListBlock.cxx:369
 TEntryListBlock.cxx:370
 TEntryListBlock.cxx:371
 TEntryListBlock.cxx:372
 TEntryListBlock.cxx:373
 TEntryListBlock.cxx:374
 TEntryListBlock.cxx:375
 TEntryListBlock.cxx:376
 TEntryListBlock.cxx:377
 TEntryListBlock.cxx:378
 TEntryListBlock.cxx:379
 TEntryListBlock.cxx:380
 TEntryListBlock.cxx:381
 TEntryListBlock.cxx:382
 TEntryListBlock.cxx:383
 TEntryListBlock.cxx:384
 TEntryListBlock.cxx:385
 TEntryListBlock.cxx:386
 TEntryListBlock.cxx:387
 TEntryListBlock.cxx:388
 TEntryListBlock.cxx:389
 TEntryListBlock.cxx:390
 TEntryListBlock.cxx:391
 TEntryListBlock.cxx:392
 TEntryListBlock.cxx:393
 TEntryListBlock.cxx:394
 TEntryListBlock.cxx:395
 TEntryListBlock.cxx:396
 TEntryListBlock.cxx:397
 TEntryListBlock.cxx:398
 TEntryListBlock.cxx:399
 TEntryListBlock.cxx:400
 TEntryListBlock.cxx:401
 TEntryListBlock.cxx:402
 TEntryListBlock.cxx:403
 TEntryListBlock.cxx:404
 TEntryListBlock.cxx:405
 TEntryListBlock.cxx:406
 TEntryListBlock.cxx:407
 TEntryListBlock.cxx:408
 TEntryListBlock.cxx:409
 TEntryListBlock.cxx:410
 TEntryListBlock.cxx:411
 TEntryListBlock.cxx:412
 TEntryListBlock.cxx:413
 TEntryListBlock.cxx:414
 TEntryListBlock.cxx:415
 TEntryListBlock.cxx:416
 TEntryListBlock.cxx:417
 TEntryListBlock.cxx:418
 TEntryListBlock.cxx:419
 TEntryListBlock.cxx:420
 TEntryListBlock.cxx:421
 TEntryListBlock.cxx:422
 TEntryListBlock.cxx:423
 TEntryListBlock.cxx:424
 TEntryListBlock.cxx:425
 TEntryListBlock.cxx:426
 TEntryListBlock.cxx:427
 TEntryListBlock.cxx:428
 TEntryListBlock.cxx:429
 TEntryListBlock.cxx:430
 TEntryListBlock.cxx:431
 TEntryListBlock.cxx:432
 TEntryListBlock.cxx:433
 TEntryListBlock.cxx:434
 TEntryListBlock.cxx:435
 TEntryListBlock.cxx:436
 TEntryListBlock.cxx:437
 TEntryListBlock.cxx:438
 TEntryListBlock.cxx:439
 TEntryListBlock.cxx:440
 TEntryListBlock.cxx:441
 TEntryListBlock.cxx:442
 TEntryListBlock.cxx:443
 TEntryListBlock.cxx:444
 TEntryListBlock.cxx:445
 TEntryListBlock.cxx:446
 TEntryListBlock.cxx:447
 TEntryListBlock.cxx:448
 TEntryListBlock.cxx:449
 TEntryListBlock.cxx:450
 TEntryListBlock.cxx:451
 TEntryListBlock.cxx:452
 TEntryListBlock.cxx:453
 TEntryListBlock.cxx:454
 TEntryListBlock.cxx:455
 TEntryListBlock.cxx:456
 TEntryListBlock.cxx:457
 TEntryListBlock.cxx:458
 TEntryListBlock.cxx:459
 TEntryListBlock.cxx:460
 TEntryListBlock.cxx:461
 TEntryListBlock.cxx:462
 TEntryListBlock.cxx:463
 TEntryListBlock.cxx:464
 TEntryListBlock.cxx:465
 TEntryListBlock.cxx:466
 TEntryListBlock.cxx:467
 TEntryListBlock.cxx:468
 TEntryListBlock.cxx:469
 TEntryListBlock.cxx:470
 TEntryListBlock.cxx:471
 TEntryListBlock.cxx:472
 TEntryListBlock.cxx:473
 TEntryListBlock.cxx:474
 TEntryListBlock.cxx:475
 TEntryListBlock.cxx:476
 TEntryListBlock.cxx:477
 TEntryListBlock.cxx:478
 TEntryListBlock.cxx:479
 TEntryListBlock.cxx:480
 TEntryListBlock.cxx:481
 TEntryListBlock.cxx:482
 TEntryListBlock.cxx:483
 TEntryListBlock.cxx:484
 TEntryListBlock.cxx:485
 TEntryListBlock.cxx:486
 TEntryListBlock.cxx:487
 TEntryListBlock.cxx:488
 TEntryListBlock.cxx:489
 TEntryListBlock.cxx:490
 TEntryListBlock.cxx:491
 TEntryListBlock.cxx:492
 TEntryListBlock.cxx:493
 TEntryListBlock.cxx:494
 TEntryListBlock.cxx:495
 TEntryListBlock.cxx:496
 TEntryListBlock.cxx:497
 TEntryListBlock.cxx:498
 TEntryListBlock.cxx:499
 TEntryListBlock.cxx:500
 TEntryListBlock.cxx:501
 TEntryListBlock.cxx:502
 TEntryListBlock.cxx:503
 TEntryListBlock.cxx:504
 TEntryListBlock.cxx:505
 TEntryListBlock.cxx:506
 TEntryListBlock.cxx:507
 TEntryListBlock.cxx:508
 TEntryListBlock.cxx:509
 TEntryListBlock.cxx:510
 TEntryListBlock.cxx:511
 TEntryListBlock.cxx:512
 TEntryListBlock.cxx:513
 TEntryListBlock.cxx:514
 TEntryListBlock.cxx:515
 TEntryListBlock.cxx:516
 TEntryListBlock.cxx:517
 TEntryListBlock.cxx:518
 TEntryListBlock.cxx:519
 TEntryListBlock.cxx:520
 TEntryListBlock.cxx:521
 TEntryListBlock.cxx:522
 TEntryListBlock.cxx:523
 TEntryListBlock.cxx:524
 TEntryListBlock.cxx:525
 TEntryListBlock.cxx:526
 TEntryListBlock.cxx:527
 TEntryListBlock.cxx:528
 TEntryListBlock.cxx:529
 TEntryListBlock.cxx:530
 TEntryListBlock.cxx:531
 TEntryListBlock.cxx:532
 TEntryListBlock.cxx:533
 TEntryListBlock.cxx:534
 TEntryListBlock.cxx:535
 TEntryListBlock.cxx:536
 TEntryListBlock.cxx:537
 TEntryListBlock.cxx:538
 TEntryListBlock.cxx:539
 TEntryListBlock.cxx:540
 TEntryListBlock.cxx:541
 TEntryListBlock.cxx:542
 TEntryListBlock.cxx:543
 TEntryListBlock.cxx:544
 TEntryListBlock.cxx:545
 TEntryListBlock.cxx:546
 TEntryListBlock.cxx:547
 TEntryListBlock.cxx:548
 TEntryListBlock.cxx:549
 TEntryListBlock.cxx:550
 TEntryListBlock.cxx:551
 TEntryListBlock.cxx:552
 TEntryListBlock.cxx:553
 TEntryListBlock.cxx:554
 TEntryListBlock.cxx:555
 TEntryListBlock.cxx:556
 TEntryListBlock.cxx:557
 TEntryListBlock.cxx:558
 TEntryListBlock.cxx:559
 TEntryListBlock.cxx:560
 TEntryListBlock.cxx:561
 TEntryListBlock.cxx:562
 TEntryListBlock.cxx:563
 TEntryListBlock.cxx:564
 TEntryListBlock.cxx:565
 TEntryListBlock.cxx:566
 TEntryListBlock.cxx:567
 TEntryListBlock.cxx:568
 TEntryListBlock.cxx:569
 TEntryListBlock.cxx:570
 TEntryListBlock.cxx:571
 TEntryListBlock.cxx:572
 TEntryListBlock.cxx:573
 TEntryListBlock.cxx:574
 TEntryListBlock.cxx:575
 TEntryListBlock.cxx:576
 TEntryListBlock.cxx:577
 TEntryListBlock.cxx:578
 TEntryListBlock.cxx:579
 TEntryListBlock.cxx:580
 TEntryListBlock.cxx:581
 TEntryListBlock.cxx:582
 TEntryListBlock.cxx:583
 TEntryListBlock.cxx:584
 TEntryListBlock.cxx:585
 TEntryListBlock.cxx:586
 TEntryListBlock.cxx:587
 TEntryListBlock.cxx:588
 TEntryListBlock.cxx:589
 TEntryListBlock.cxx:590
 TEntryListBlock.cxx:591
 TEntryListBlock.cxx:592
 TEntryListBlock.cxx:593
 TEntryListBlock.cxx:594
 TEntryListBlock.cxx:595
 TEntryListBlock.cxx:596
 TEntryListBlock.cxx:597
 TEntryListBlock.cxx:598