# include "hdebug.h"
#include "hmdccaltable.h"
ClassImp(HMdcCalLinkList)
HMdcCalLinkList::~HMdcCalLinkList(){
clear();
}
void HMdcCalLinkList::add(HMdcCal3 *hit){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::add");
#endif
if (!hit) return;
if (!fFirst) {
fFirst = newLink(hit);
fLast = fFirst;
} else
fLast = newLink(hit, fLast);
Int_t cell = hit->getCell();
if(cell< fCapacity) fCells[cell].setHit(fLast,fCells[cell].getNHits());
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::add");
#endif
}
void HMdcCalLinkList::addHits(HMdcCal3 *hit1, HMdcCal3* hit2){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::addHits");
#endif
if (!hit1 || !hit2) return;
HMdcCalLink* temp;
add(hit1);
temp = fLast;
fLast = newLink(hit2,fLast);
fLast->setPartner(temp);
temp->setPartner(fLast);
Int_t cell = hit2->getCell();
if(cell < fCapacity)
fCells[cell].setHit(fLast,fCells[cell].getNHits());
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::addHits");
#endif
}
void HMdcCalLinkList::swap(HMdcCalLink* link1, HMdcCalLink* link2){
HMdcCal3* temp , *temp2;
HMdcCalLink *partner1, *partner2;
temp = link1->getData();
temp2 = link2->getData();
partner1 = link1->getPartner();
partner2 = link2->getPartner();
link1->setData(temp2);
link2->setData(temp);
link1->getData()->setLink(link1);
link2->getData()->setLink(link2);
if(partner1!=link2){
link1->setPartner(partner2);
link2->setPartner(partner1);
partner2->setPartner(link1);
partner1->setPartner(link2);
}
}
void HMdcCalLinkList::clear(Option_t* option){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::clear");
#endif
while (fFirst) {
HMdcCalLink *tlk = fFirst;
fFirst = fFirst->getNext();
tlk->getData()->setLink(NULL);
delete tlk;
}
fFirst = fLast = 0;
if(fCells) delete [] fCells;
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::clear");
#endif
}
void HMdcCalLinkList::deleteList(){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::deleteList");
#endif
while (fFirst) {
HMdcCalLink *tlk = fFirst;
fFirst = fFirst->getNext();
tlk->getData()->setLink(NULL);
deleteLink(tlk);
}
fFirst = fLast = 0;
for(Int_t i=0; i<fCapacity; i++) fCells[i].removeHits();
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::deleteList");
#endif
}
void HMdcCalLinkList::deleteLink(HMdcCalLink *lnk){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::deleteLink");
#endif
Int_t cell = lnk->getData()->getCell();
fCells[cell].removeHit(lnk);
lnk->getData()->setLink(NULL);
lnk->fNext = lnk->fPrev = lnk->fPartner = 0;
lnk->fData = 0;
delete lnk;
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::deleteLink");
#endif
}
HMdcCalLinkListIter *HMdcCalLinkList::MakeIterator(Bool_t dir) const{
return new HMdcCalLinkListIter(this, dir);
}
HMdcCalLink *HMdcCalLinkList::newLink(HMdcCal3 *hit, HMdcCalLink *prev){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::newLink");
#endif
if (prev)
return new HMdcCalLink(hit, prev);
else
return new HMdcCalLink(hit);
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::newLink");
#endif
}
void HMdcCalLinkList::remove(HMdcCal3 *hit){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::remove(HMdcCal3*)");
#endif
if (!hit) return;
HMdcCalLink *lnk = hit->getLink();
if(!lnk) return;
HMdcCalLink *partner = lnk->getPartner();
remove(lnk);
if (partner) remove(partner);
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::remove(HMdcCal3*)");
#endif
}
void HMdcCalLinkList::remove(HMdcCalLink *lnk){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLinkList::removeLink");
#endif
if (!lnk) return;
if (lnk == fFirst) {
fFirst = lnk->getNext();
if (lnk == fLast) fLast = fFirst;
else fFirst->fPrev = 0;
deleteLink(lnk);
} else if (lnk == fLast) {
fLast = lnk->getPrevious();
fLast->fNext = 0;
deleteLink(lnk);
} else {
lnk->getPrevious()->fNext = lnk->getNext();
lnk->getNext()->fPrev = lnk->getPrevious();
deleteLink(lnk);
}
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLinkList::remove(HMdcCal3*)");
#endif
}
ClassImp(HMdcCalLink)
HMdcCalLink::HMdcCalLink(HMdcCal3 *hit, HMdcCalLink *prev)
: fNext(prev->fNext), fPrev(prev), fPartner(0), fData(hit){
#if DEBUG_LEVEL > 2
gDebuger->enterFunc("HMdcCalLink::HMdcCalLink(HMdcCal3*, HMdcCalLink*)");
#endif
fPrev->fNext = this;
if (fNext) fNext->fPrev = this;
fData->setLink(this);
#if DEBUG_LEVEL > 2
gDebuger->leaveFunc("HMdcCalLink::HMdcCalLink(HMdcCal3*, HMdcCalLink*)");
#endif
}
ClassImp(HMdcCalLinkListIter)
HMdcCalLinkListIter::HMdcCalLinkListIter(const HMdcCalLinkList *l, Bool_t dir)
: fList(l), fCurCursor(0), fCursor(0), fDirection(dir), fStarted(kFALSE)
{
}
HMdcCal3* HMdcCalLinkListIter::Next(){
if (!fList) return 0;
if (fDirection == kIterForward) {
if (!fStarted) {
fCursor = fList->fFirst;
fStarted = kTRUE;
}
fCurCursor = fCursor;
if (fCursor) fCursor = fCursor->getNext();
} else {
if (!fStarted) {
fCursor = fList->fLast;
fStarted = kTRUE;
}
fCurCursor = fCursor;
if (fCursor) fCursor = fCursor->getPrevious();
}
if (fCurCursor) return fCurCursor->getData();
return 0;
}
HMdcCalLink* HMdcCell :: getHit(Int_t idx){
#if DEBUG_LEVEL>2
gDebuger->enterFunc("HMdcCell::getHit");
#endif
if (idx < fNHits) return fHits[idx];
return NULL;
}
void HMdcCell :: setHit(HMdcCalLink* link, Int_t idx){
#if DEBUG_LEVEL>2
gDebuger->enterFunc("HMdcCell::setHit");
#endif
if (fHits[idx] == NULL) fNHits++;
fHits[idx] = link;
}
void HMdcCell :: removeHit(HMdcCalLink* link){
#if DEBUG_LEVEL>2
gDebuger->enterFunc("HMdcCell::removeHit");
#endif
if(!link) return;
for(Int_t i=0; i<fNHits; i++){
if(fHits[i]==link){
for(Int_t j=i; j<fNHits-1; j++) fHits[j] = fHits[j+1];
fHits[fNHits-1] = NULL;
fNHits--;
return;
}
}
}
void HMdcCell :: removeHits(void){
#if DEBUG_LEVEL>2
gDebuger->enterFunc("HMdcCell::removeHits");
#endif
for(Int_t i=0; i<fNHits; i++) fHits[i] = NULL;
fNHits = 0;
#if DEBUG_LEVEL>2
gDebuger->leaveFunc("HMdcCell::removeHits");
#endif
}
Last change: Sat May 22 12:59:58 2010
Last generated: 2010-05-22 12:59
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.