Bdb packages | Design docs | Source docs | Guidelines | Recent releases

Search | Site Map .

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

/CdbBdbShared/CdbBdbSTimeLineP.cc

Go to the documentation of this file.
00001 /// Implementation file for the CdbBdbSTimeLineP class
00002 /**
00003   * @see CdbBdbSTimeLineP
00004   */
00005 
00006 #include "BaBar/BaBar.hh"
00007 
00008 #if !defined(OO_DDL_TRANSLATION)
00009 #include "CdbBdbShared/CdbBdbSTimeLineP.hh"
00010 #endif // OO_DDL_TRANSLATION
00011 
00012 #include "CdbBdbShared/CdbBdbSTimeLineNodeItr.hh"
00013 
00014 template< class V >
00015 CdbBdbSTimeLineP<V>::CdbBdbSTimeLineP( )
00016 {
00017   // Initialize with the value built using the default
00018   // value's class constructor
00019 
00020     initialize( V( ));
00021 }
00022 
00023 template< class V >
00024 CdbBdbSTimeLineP<V>::CdbBdbSTimeLineP( const V& theInitialValue )
00025 {
00026   // Initialize with specified value
00027 
00028     initialize( theInitialValue );
00029 }
00030 
00031 template< class V >
00032 CdbBdbSTimeLineP<V>::~CdbBdbSTimeLineP( ) 
00033 {
00034     BdbDelete( _indexRef );
00035     BdbDelete( _bufRef );
00036 }
00037 
00038 template< class V >
00039 CdbStatus
00040 CdbBdbSTimeLineP<V>::insert( const BdbTime& theBeginTime,
00041                              const BdbTime& theEndTime,
00042                              const V&       theValue )
00043 {
00044     const char* errorMsg = "CdbBdbSTimeLineP<V>::insert() -- ERROR";
00045 
00046     ooUpdate( );
00047 
00048     CdbStatus result = CdbStatus::Error;
00049     do {
00050 
00051       // Verify parameters.
00052 
00053         if( theBeginTime >= theEndTime ) {
00054             cout << errorMsg << endl << "    Illegal interval passed to the procedure." << endl;
00055             break;
00056         }
00057 
00058       // Determine the range of "timeline intervals" indexes to be affected
00059       // by this insertion.
00060       //
00061       // NOTE: Intervals have the following semantics: [begin,end)
00062 
00063         d_ULong begin = 0;
00064         {
00065             BTreeEntry e;
00066             if( _indexRef->fuzzySearch( BTreeEntry( theBeginTime ), e )) begin = e.value;
00067         }
00068         d_ULong end = 0;
00069         {
00070             BTreeEntry e;
00071             if( _indexRef->fuzzySearch( BTreeEntry( theEndTime ), e )) end = e.value;
00072             if( 0 == end ) end = _last;
00073         }
00074         if(( 0 == begin ) || ( 0 == end )) {
00075             cout << errorMsg << endl << "    Failed to find existing interval in the B-tree index." << endl;
00076             break;
00077         }
00078         
00079       // Choose among two major scenarious:
00080       //
00081       // A: the new interval only affects just one interval
00082       // B: there are 2 or more intervals affected
00083 
00084         if( begin == end ) {
00085 
00086             insertAndRemoveOne( begin,
00087                                 theBeginTime,
00088                                 theEndTime,
00089                                 theValue );
00090         } else {
00091 
00092             insertAndRemoveMany( begin,
00093                                  end,
00094                                  theBeginTime,
00095                                  theEndTime,
00096                                  theValue );
00097         }
00098 
00099       // Done.
00100 
00101         result = CdbStatus::Success;
00102 
00103     } while( false );
00104 
00105     return result;
00106 }
00107 
00108 template< class V >
00109 CdbStatus
00110 CdbBdbSTimeLineP<V>::insert( const CdbBdbSTimeLineInterval< V >& theInterval )
00111 {
00112     return insert( theInterval.begin,
00113                    theInterval.end,
00114                    theInterval.value );
00115 }
00116 
00117 template< class V >
00118 bool
00119 CdbBdbSTimeLineP<V>::findAtBegin( CdbBdbSTimeLineInterval< V >& theInterval,
00120                                   const BdbTime&                theTime ) const
00121 {
00122     BTreeEntry e;
00123 
00124     if( _indexRef->search( BTreeEntry( theTime ), e )) {
00125         theInterval = (_bufRef->elementAt( e.value )).interval( );
00126         return true;
00127     }
00128     return false;
00129 }
00130 
00131 template< class V >
00132 bool
00133 CdbBdbSTimeLineP<V>::find( CdbBdbSTimeLineInterval< V >& theInterval,
00134                            const BdbTime&                theTime ) const
00135 {
00136     BTreeEntry e;
00137 
00138     if( _indexRef->fuzzySearch( BTreeEntry( theTime ), e )) {
00139         theInterval = (_bufRef->elementAt( e.value )).interval( );
00140         return true;
00141     }
00142     return false;
00143 }
00144 
00145 template< class V >
00146 CdbStatus
00147 CdbBdbSTimeLineP<V>::first( CdbBdbSTimeLineInterval< V >& theInterval ) const
00148 {
00149     theInterval = (_bufRef->elementAt( _first )).interval( );
00150     return CdbStatus::Success;
00151 }
00152 
00153 template< class V >
00154 CdbStatus
00155 CdbBdbSTimeLineP<V>::last( CdbBdbSTimeLineInterval< V >& theInterval ) const
00156 {
00157     theInterval = (_bufRef->elementAt( _last )).interval( );
00158     return CdbStatus::Success;
00159 }
00160 
00161 template< class V >
00162 CdbBdbSTimeLineP<V>::IteratorOfIntervals
00163 CdbBdbSTimeLineP<V>::iterator( const BdbTime& theBeginTime ) const
00164 {
00165   // Find out the very first element to begin iteration with.
00166 
00167     d_ULong firstIndex = _first;
00168     if( theBeginTime > BdbTime::minusInfinity ) {
00169 
00170       // Zero index means an empty collection. See the implementation
00171       // of the iterator.
00172 
00173         firstIndex = 0;
00174         if( theBeginTime < BdbTime::plusInfinity ) {
00175 
00176             BTreeEntry e;
00177             if( _indexRef->fuzzySearch( BTreeEntry( theBeginTime ), e )) {
00178                 firstIndex = e.value;
00179             }
00180         }
00181     }
00182 
00183   // ATTENTION: This is not a memory leak - the created object
00184   //            will be destroyed by the iterator.
00185 
00186     return IteratorOfIntervals( new CdbBdbSTimeLineNodeItr<V>( _bufRef, firstIndex ));
00187 }
00188 
00189 template< class V >
00190 void
00191 CdbBdbSTimeLineP<V>::dump( ostream&       o,
00192                            const BdbTime& theBeginTime,
00193                            const BdbTime& theEndTime )
00194 {
00195     const char* errorMsg = "CdbBdbSTimeLineP<V>::dump() -- ERROR";
00196 
00197     do {
00198 
00199       // Verify parameters.
00200 
00201         if( theBeginTime >= theEndTime ) {
00202             cout << errorMsg << endl << "    Illegal interval passed to the procedure." << endl;
00203             break;
00204         }
00205 
00206       // Determine the range of interval indexes to be included
00207       // into this operation.
00208       //
00209       // NOTE: Intervals have the following semantics: [begin,end)
00210 
00211         d_ULong begin = 0;
00212         {
00213             BTreeEntry e;
00214             if( _indexRef->fuzzySearch( BTreeEntry( theBeginTime ), e )) begin = e.value;
00215         }
00216         d_ULong end = 0;
00217         {
00218             BTreeEntry e;
00219             if( _indexRef->fuzzySearch( BTreeEntry( theEndTime ), e )) end = e.value;
00220             if( 0 == end ) end = _last;
00221         }
00222         if(( 0 == begin ) || ( 0 == end )) {
00223             cout << errorMsg << endl << "    Failed to find an interval in the B-tree index." << endl;
00224             break;
00225         }
00226 
00227       // Do the dump
00228 
00229         d_ULong next = begin;
00230         do {
00231 
00232             Node n = _bufRef->elementAt( next );
00233 
00234             o << next << " : [ " << n.begin.getGmtSec( ) << "." << n.begin.getGmtNsec( ) << " , "
00235               <<                    n.end.getGmtSec( )   << "." << n.end.getGmtNsec( )   << " ) "
00236               << n.prev << "< >" << n.next << " : " << n.value  << endl;
00237 
00238             if( next == end ) break;
00239             else              next = n.next;
00240 
00241         } while( 0 != next );
00242 
00243     } while( false );
00244 }
00245 
00246 template< class V >
00247 CdbStatus
00248 CdbBdbSTimeLineP<V>::clone( BdbRef(CdbBdbSTimeLineP<V>)& theRef,
00249                             const BdbRefAny&             theHint ) const
00250 {
00251     const char* errorMsg = "CdbBdbSTimeLineP<V>::clone() -- ERROR";
00252 
00253   // Calculate the hint
00254 
00255     BdbRefAny hint = theHint;
00256     if( BdbIsNull(hint)) hint = ooThis( );
00257 
00258   // Create an empty object
00259 
00260     theRef = new( hint ) CdbBdbSTimeLineP<V>( );
00261 
00262   // Just copy the "timeline" intervals from the current object into
00263   // the new one.
00264 
00265     d_ULong next = _first;
00266     do {
00267         Node n = _bufRef->elementAt( next );
00268 
00269         CdbStatus status = theRef->insert( n.begin,
00270                                            n.end,
00271                                            n.value );
00272         if( CdbStatus::Success != status ) {
00273             cout << errorMsg << endl
00274                  << "    Failed to insert new interval: " << n.interval( ) << endl
00275                  << "    from input object into the output one." << endl;
00276             return status;
00277         }
00278         next = n.next;
00279 
00280     } while( 0 != next );
00281 
00282     return CdbStatus::Success;
00283 }
00284 
00285 template< class V >
00286 void
00287 CdbBdbSTimeLineP<V>::initialize( const V& theInitialValue )
00288 {
00289   // Element 0 is never used.
00290 
00291     _bufRef   = new( ooThis( )) CdbBdbSPagedVarrayP< Node >( 1 );
00292     _indexRef = new( ooThis( )) CdbBdbSBtreeP< BTreeEntry, BTreeEntryFCP >( );
00293 
00294   // Initialize a list of free elements as the empty one.
00295   // The elements will be added as required.
00296 
00297     _free = 0;
00298 
00299   // Initialize a list by inserting specifying interval covering the whole range
00300   // of the timeline.
00301 
00302     _first = allocate( );
00303     {
00304         BdbTime beginTime = BdbTime::minusInfinity;
00305         BdbTime endTime   = BdbTime::plusInfinity;
00306 
00307         _bufRef->setElementAt( _first, Node( theInitialValue, beginTime, endTime ));
00308         _indexRef->insert( BTreeEntry( beginTime, endTime, _first ));
00309     }
00310     _last = _first;
00311 }
00312 
00313 template< class V >
00314 void
00315 CdbBdbSTimeLineP<V>::insertAndRemoveOne( d_ULong        begin,
00316                                          const BdbTime& beginTime,
00317                                          const BdbTime& endTime,
00318                                          const V&       value )
00319 {
00320   // (A) Here we have four further scenarious:
00321   //
00322   // A.1: the new interval completelly replaces the old on
00323   // A.2: the new interval starts with the begining of the old one
00324   // A.3: the new interval ends up at the end of the old one
00325   // A.4: the new interval falls in the middle of the old one
00326 
00327     Node beginN = _bufRef->elementAt( begin );
00328 
00329     if(( beginTime == beginN.begin ) && ( endTime == beginN.end )) {
00330 
00331       // (A.1) Just update the value stored in this interval
00332 
00333         beginN.value = value;
00334         _bufRef->setElementAt( begin, beginN );
00335 
00336     } else {
00337         
00338       // Remove old interval out of the list and the B-tree.
00339       //
00340       // REMEMBER: That we still have a copy of the value of this element
00341       //           obtained above. So the removal operation would not affect
00342       //           this copy.
00343 
00344         _indexRef->remove( BTreeEntry( beginN.begin ));
00345         release( begin );
00346 
00347         if( beginTime == beginN.begin ) {
00348 
00349           // (A.2) Replace the old interval with two new ones.
00350 
00351             d_ULong first  = allocate( );
00352             d_ULong second = allocate( );
00353 
00354             Node firstN( value,
00355                          beginTime,
00356                          endTime,
00357                          beginN.prev,
00358                          second );
00359             _bufRef->setElementAt( first, firstN );
00360 
00361             Node secondN( beginN.value,
00362                           endTime,
00363                           beginN.end,
00364                           first,
00365                           beginN.next );
00366             _bufRef->setElementAt( second, secondN );
00367 
00368           // Update links to point onto new elements instead the old one.
00369 
00370             if( 0 == firstN.prev ) {
00371                 _first = first;
00372             } else {
00373                 Node prevN = _bufRef->elementAt( firstN.prev );
00374                 { prevN.next  = first; }
00375                 _bufRef->setElementAt( firstN.prev, prevN );
00376             }
00377             if( 0 == secondN.next ) {
00378                 _last = second;
00379             } else {
00380                 Node nextN = _bufRef->elementAt( secondN.next );
00381                 { nextN.prev  = second; }
00382                 _bufRef->setElementAt( secondN.next, nextN );
00383             }
00384 
00385           // Update the B-tree index
00386 
00387             _indexRef->insert( BTreeEntry( firstN.begin,
00388                                            firstN.end,
00389                                            first ));
00390             _indexRef->insert( BTreeEntry( secondN.begin,
00391                                            secondN.end,
00392                                            second ));
00393 
00394         } else if( endTime == beginN.end ) {
00395 
00396           // (A.3) Replace the old interval with two new ones.
00397 
00398             d_ULong first  = allocate( );
00399             d_ULong second = allocate( );
00400 
00401             Node firstN( beginN.value,
00402                          beginN.begin,
00403                          beginTime,
00404                          beginN.prev,
00405                          second );
00406             _bufRef->setElementAt( first, firstN );
00407 
00408             Node secondN( value,
00409                           beginTime,
00410                           endTime,
00411                           first,
00412                           beginN.next );
00413             _bufRef->setElementAt( second, secondN );
00414 
00415           // Update links to point onto new elements instead the old one.
00416 
00417             if( 0 == firstN.prev ) {
00418                 _first = first;
00419             } else {
00420                 Node prevN = _bufRef->elementAt( firstN.prev );
00421                 { prevN.next  = first; }
00422                 _bufRef->setElementAt( firstN.prev, prevN );
00423             }
00424             if( 0 == secondN.next ) {
00425                 _last = second;
00426             } else {
00427                 Node nextN = _bufRef->elementAt( secondN.next );
00428                 { nextN.prev  = second; }
00429                 _bufRef->setElementAt( secondN.next, nextN );
00430             }
00431 
00432           // Update the B-tree index
00433 
00434             _indexRef->insert( BTreeEntry( firstN.begin,
00435                                            firstN.end,
00436                                            first ));
00437             _indexRef->insert( BTreeEntry( secondN.begin,
00438                                            secondN.end,
00439                                            second ));
00440         } else {
00441 
00442           // (A.4) Replace the old interval with three new ones.
00443 
00444             d_ULong first  = allocate( );
00445             d_ULong second = allocate( );
00446             d_ULong third  = allocate( );
00447 
00448             Node firstN( beginN.value,
00449                          beginN.begin,
00450                          beginTime,
00451                          beginN.prev,
00452                          second );
00453             _bufRef->setElementAt( first, firstN );
00454 
00455             Node secondN( value,
00456                           beginTime,
00457                           endTime,
00458                           first,
00459                           third );
00460             _bufRef->setElementAt( second, secondN );
00461 
00462             Node thirdN( beginN.value,
00463                          endTime,
00464                          beginN.end,
00465                          second,
00466                          beginN.next );
00467             _bufRef->setElementAt( third, thirdN );
00468 
00469           // Update links to point onto new elements instead the old one.
00470 
00471             if( 0 == firstN.prev ) {
00472                 _first = first;
00473             } else {
00474                 Node prevN = _bufRef->elementAt( firstN.prev );
00475                 { prevN.next  = first; }
00476                 _bufRef->setElementAt( firstN.prev, prevN );
00477             }
00478             if( 0 == thirdN.next ) {
00479                 _last = third;
00480             } else {
00481                 Node nextN = _bufRef->elementAt( thirdN.next );
00482                 { nextN.prev  = third; }
00483                 _bufRef->setElementAt( thirdN.next, nextN );
00484             }
00485 
00486           // Update the B-tree index
00487 
00488             _indexRef->insert( BTreeEntry( firstN.begin,
00489                                            firstN.end,
00490                                            first ));
00491             _indexRef->insert( BTreeEntry( secondN.begin,
00492                                            secondN.end,
00493                                            second ));
00494             _indexRef->insert( BTreeEntry( thirdN.begin,
00495                                            thirdN.end,
00496                                            third ));
00497         }
00498     }
00499 }
00500 
00501 template< class V >
00502 void
00503 CdbBdbSTimeLineP<V>::insertAndRemoveMany( d_ULong        begin,
00504                                           d_ULong        end,
00505                                           const BdbTime& beginTime,
00506                                           const BdbTime& endTime,
00507                                           const V&       value )
00508 {
00509   // (B) Remove two or more old intervals and replace them with:
00510   //
00511   // B.1: Just one interval if it covers everything
00512   // B.2: Two intervals, if the new one begins where the old begin begins
00513   // B.3: Two intervals, if the new one ends where the old end ends
00514   // B.4: Three intervals otherwise
00515 
00516     Node beginN = _bufRef->elementAt( begin );
00517     Node endN   = _bufRef->elementAt( end );
00518 
00519   // Remove all intervals in between (if any)
00520 
00521     if( beginN.next != end ) {
00522 
00523         d_ULong next = beginN.next;
00524         while(( 0 != next ) && ( next != end )) {
00525             Node nextN = _bufRef->elementAt( next );
00526             _indexRef->remove( BTreeEntry( nextN.begin ));
00527             release( next );
00528             next = nextN.next;
00529         }
00530     }
00531 
00532   // Then we're going to remove old begin and old end intervals
00533 
00534     _indexRef->remove( BTreeEntry( beginN.begin ));
00535     release( begin );
00536 
00537     _indexRef->remove( BTreeEntry( endN.begin ));
00538     release( end );
00539 
00540     if(( beginTime == beginN.begin ) && ( endTime == endN.end )) {
00541 
00542       // (B.1) Replace with one interval
00543 
00544         d_ULong first = allocate( );
00545 
00546         Node firstN( value,
00547                      beginTime,
00548                      endTime,
00549                      beginN.prev,
00550                      endN.next );
00551         _bufRef->setElementAt( first, firstN );
00552 
00553       // Update links to point onto new element instead the old ones.
00554 
00555         if( 0 == firstN.prev ) {
00556             _first = first;
00557         } else {
00558             Node prevN = _bufRef->elementAt( firstN.prev );
00559             { prevN.next  = first; }
00560             _bufRef->setElementAt( firstN.prev, prevN );
00561         }
00562         if( 0 == firstN.next ) {
00563             _last = first;
00564         } else {
00565             Node nextN = _bufRef->elementAt( firstN.next );
00566             { nextN.prev  = first; }
00567             _bufRef->setElementAt( firstN.next, nextN );
00568         }
00569 
00570       // Update the B-tree index
00571 
00572         _indexRef->insert( BTreeEntry( firstN.begin,
00573                                        firstN.end,
00574                                        first ));
00575     } else if( beginTime == beginN.begin ) {
00576 
00577       // (B.2) Replace with two intervals with new "original interval" index
00578       //       at the begining.
00579 
00580         d_ULong first  = allocate( );
00581         d_ULong second = allocate( );
00582 
00583         Node firstN( value,
00584                      beginTime,
00585                      endTime,
00586                      beginN.prev,
00587                      second );
00588         _bufRef->setElementAt( first, firstN );
00589 
00590         Node secondN( endN.value,
00591                       endTime,
00592                       endN.end,
00593                       first,
00594                       endN.next );
00595         _bufRef->setElementAt( second, secondN );
00596 
00597       // Update links to point onto new elements instead the old one.
00598 
00599         if( 0 == firstN.prev ) {
00600             _first = first;
00601         } else {
00602             Node prevN = _bufRef->elementAt( firstN.prev );
00603             { prevN.next  = first; }
00604             _bufRef->setElementAt( firstN.prev, prevN );
00605         }
00606         if( 0 == secondN.next ) {
00607             _last = second;
00608         } else {
00609             Node nextN = _bufRef->elementAt( secondN.next );
00610             { nextN.prev  = second; }
00611             _bufRef->setElementAt( secondN.next, nextN );
00612         }
00613 
00614       // Update the B-tree index
00615 
00616         _indexRef->insert( BTreeEntry( firstN.begin,
00617                                        firstN.end,
00618                                        first ));
00619         _indexRef->insert( BTreeEntry( secondN.begin,
00620                                        secondN.end,
00621                                        second ));
00622 
00623     } else if( endTime == endN.end ) {
00624 
00625       // (B.3) Replace with two intervals with new "original interval" index
00626       //       at the end.
00627 
00628         d_ULong first  = allocate( );
00629         d_ULong second = allocate( );
00630 
00631         Node firstN( beginN.value,
00632                      beginN.begin,
00633                      beginTime,
00634                      beginN.prev,
00635                      second );
00636         _bufRef->setElementAt( first, firstN );
00637 
00638         Node secondN( value,
00639                       beginTime,
00640                       endTime,
00641                       first,
00642                       endN.next );
00643         _bufRef->setElementAt( second, secondN );
00644 
00645       // Update links to point onto new elements instead the old one.
00646 
00647         if( 0 == firstN.prev ) {
00648             _first = first;
00649         } else {
00650             Node prevN = _bufRef->elementAt( firstN.prev );
00651             { prevN.next  = first; }
00652             _bufRef->setElementAt( firstN.prev, prevN );
00653         }
00654         if( 0 == secondN.next ) {
00655             _last = second;
00656         } else {
00657             Node nextN = _bufRef->elementAt( secondN.next );
00658             { nextN.prev  = second; }
00659             _bufRef->setElementAt( secondN.next, nextN );
00660         }
00661 
00662       // Update the B-tree index
00663 
00664         _indexRef->insert( BTreeEntry( firstN.begin,
00665                                        firstN.end,
00666                                        first ));
00667         _indexRef->insert( BTreeEntry( secondN.begin,
00668                                        secondN.end,
00669                                        second ));
00670 
00671     } else {
00672 
00673       // (B.4) Replace with three intervals with new "original interval" index
00674       //       in the middle.
00675 
00676         d_ULong first  = allocate( );
00677         d_ULong second = allocate( );
00678         d_ULong third  = allocate( );
00679 
00680         Node firstN( beginN.value,
00681                      beginN.begin,
00682                      beginTime,
00683                      beginN.prev,
00684                      second );
00685         _bufRef->setElementAt( first, firstN );
00686 
00687         Node secondN( value,
00688                       beginTime,
00689                       endTime,
00690                       first,
00691                       third );
00692         _bufRef->setElementAt( second, secondN );
00693 
00694         Node thirdN( endN.value,
00695                      endTime,
00696                      endN.end,
00697                      second,
00698                      endN.next );
00699         _bufRef->setElementAt( third, thirdN );
00700 
00701       // Update links to point onto new elements instead the old one.
00702 
00703         if( 0 == firstN.prev ) {
00704             _first = first;
00705         } else {
00706             Node prevN = _bufRef->elementAt( firstN.prev );
00707             { prevN.next  = first; }
00708             _bufRef->setElementAt( firstN.prev, prevN );
00709         }
00710         if( 0 == thirdN.next ) {
00711             _last = third;
00712         } else {
00713             Node nextN = _bufRef->elementAt( thirdN.next );
00714             { nextN.prev  = third; }
00715             _bufRef->setElementAt( thirdN.next, nextN );
00716         }
00717 
00718       // Update the B-tree index
00719 
00720         _indexRef->insert( BTreeEntry( firstN.begin,
00721                                        firstN.end,
00722                                        first ));
00723         _indexRef->insert( BTreeEntry( secondN.begin,
00724                                        secondN.end,
00725                                        second ));
00726         _indexRef->insert( BTreeEntry( thirdN.begin,
00727                                        thirdN.end,
00728                                        third ));
00729     }
00730 }
00731 
00732 template< class V >
00733 d_ULong
00734 CdbBdbSTimeLineP<V>::allocate( d_ULong next )
00735 {
00736     if( _free == 0 ) extend_free_list( );
00737 
00738     d_ULong result = _free;
00739     {
00740         _free = _bufRef->elementAt( result ).next;
00741     }
00742     return result;
00743 }
00744 
00745 template< class V >
00746 void
00747 CdbBdbSTimeLineP<V>::release( d_ULong element )
00748 {
00749     if( element ) {
00750 
00751         Node n = _bufRef->elementAt( element );
00752         { n.next = _free; }
00753         _bufRef->setElementAt( element, n );
00754 
00755         _free = element;
00756     }
00757 }
00758 
00759 template< class V >
00760 void
00761 CdbBdbSTimeLineP<V>::extend_free_list( )
00762 {
00763     if( _free == 0 ) {
00764 
00765         const d_ULong sizeIncrement = 1000;
00766 
00767         _free = _bufRef->size( );
00768         _bufRef->resize( _free + sizeIncrement );
00769 
00770         for( d_ULong element = _free + 1; element < _free + sizeIncrement; ++element ) {
00771 
00772           // End Of the List
00773 
00774             Node endN = _bufRef->elementAt( element );
00775             { endN.next = 0; }
00776             _bufRef->setElementAt( element, endN );
00777 
00778           // Previous node points to the current one
00779 
00780             Node previousN = _bufRef->elementAt( element - 1 );
00781             { previousN.next = element; }
00782             _bufRef->setElementAt( element - 1, previousN );
00783         }
00784     }
00785 }
00786 
00787 /////////////////
00788 // End Of File //
00789 /////////////////

 


BaBar Public Site | SLAC | News | Links | Who's Who | Contact Us

Page Owner: Jacek Becla
Last Update: October 04, 2002