Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

CdbRooRoBtreeR.cc

Go to the documentation of this file.
00001 // File and Version Information:
00002 //      $Id: CdbRooRoBtreeR.cc,v 1.1 2004/11/09 20:33:04 gapon Exp $
00003 
00004 /// Implementation file for the CdbRooRoBtreeR class
00005 /**
00006   * @see CdbRooRoBtreeR
00007   */
00008 
00009 #include "BaBar/BaBar.hh"
00010 
00011 #include "CdbRooReadonly/CdbRooRoBtreeR.hh"
00012 
00013 template< class  K,
00014           class  FCP,
00015           UInt_t ORDER >
00016 CdbRooRoBtreeR<K,FCP,ORDER>::CdbRooRoBtreeR( ) :
00017     CdbRooRoAbsBtreeR<K,FCP,ORDER>( )
00018 {
00019     _nodes.resize( 2 );
00020 
00021   // Initialize the root node.
00022 
00023     _root = 1;
00024 
00025     init_node( _root, 0 );
00026 
00027   // Initialize a list of free elements as the empty one.
00028   // The elements will be added as required.
00029 
00030     _free = 0;
00031 }
00032 
00033 template< class  K,
00034           class  FCP,
00035           UInt_t ORDER >
00036 UInt_t
00037 CdbRooRoBtreeR<K,FCP,ORDER>::allocate( UInt_t parent )
00038 {
00039     if( _free == 0 ) extend_free_list( );
00040 
00041     UInt_t result = _free;
00042     {
00043         _free = readNode( result ).child[0];
00044 
00045         init_node( result, parent );
00046     }
00047     return result;
00048 }
00049 
00050 template< class  K,
00051           class  FCP,
00052           UInt_t ORDER >
00053 void
00054 CdbRooRoBtreeR<K,FCP,ORDER>::release( UInt_t node )
00055 {
00056     if( node ) {
00057 
00058         CdbRooRoBtreeNodeR<K,ORDER> nodeValue = readNode( node );
00059         { nodeValue.child[0] = _free; }
00060         updateNode( node, nodeValue );
00061 
00062         _free = node;
00063     }
00064 }
00065 
00066 template< class  K,
00067           class  FCP,
00068           UInt_t ORDER >
00069 void
00070 CdbRooRoBtreeR<K,FCP,ORDER>::init_node( UInt_t node,
00071                                         UInt_t parent )
00072 {
00073     CdbRooRoBtreeNodeR<K,ORDER> nodeValue = readNode( node );
00074     {
00075         nodeValue.isLeaf = true;
00076         nodeValue.n      = 0;
00077         nodeValue.parent = parent;
00078     }
00079     updateNode( node, nodeValue );
00080 }
00081 
00082 template< class  K,
00083           class  FCP,
00084           UInt_t ORDER >
00085 void
00086 CdbRooRoBtreeR<K,FCP,ORDER>::extend_free_list( )
00087 {
00088     if( _free == 0 ) {
00089         _free = _nodes.size( );
00090 
00091       // Double the number of elements before the number of elements reaches 1000. Then plainly
00092       // add a fixed number of elements.
00093       //
00094       // NOTES: (1) This policy may change in the future
00095       //        (2) The policy allows to avoid inefficient use of the persistent space for small B-trees.
00096 
00097         UInt_t sizeIncrement = 1000;
00098         if(( 0 < _free ) && ( _free < sizeIncrement )) sizeIncrement = _free;
00099 
00100         _nodes.resize( _free + sizeIncrement );
00101 
00102         for( UInt_t node = _free + 1; node < _free + sizeIncrement; ++node ) {
00103 
00104           // End Of the List
00105 
00106             CdbRooRoBtreeNodeR<K,ORDER> nodeValue = readNode( node );
00107             { nodeValue.child[0] = 0; }
00108             updateNode( node, nodeValue );
00109 
00110           // Previous node points to the current one
00111 
00112             CdbRooRoBtreeNodeR<K,ORDER> previousNodeValue = readNode( node-1 );
00113             { previousNodeValue.child[0] = node; }
00114             updateNode( node-1, previousNodeValue );
00115         }
00116     }
00117 }
00118 
00119 /////////////////
00120 // End Of File //
00121 /////////////////

Generated on Mon Dec 5 18:22:09 2005 for CDB by doxygen1.3-rc3