00001
00002
00003
00004
00005
00006
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
00022
00023 _root = 1;
00024
00025 init_node( _root, 0 );
00026
00027
00028
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
00092
00093
00094
00095
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
00105
00106 CdbRooRoBtreeNodeR<K,ORDER> nodeValue = readNode( node );
00107 { nodeValue.child[0] = 0; }
00108 updateNode( node, nodeValue );
00109
00110
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
00121