![]() |
|
|
Bdb packages | Design docs | Source docs | Guidelines | Recent releases |
|
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