Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CandBase.tpl

Go to the documentation of this file.
00001 #ifndef CANDBASE_TPL
00002 #define CANDBASE_TPL
00003 
00004 // Templates for CandBase objects.
00005 // You must #include this file in CandThing.cxx files after any CVSID()
00006 // definition.  Separated from CandBase.h by NJT 02/04
00007 
00008 // Test methods called from IsEquivalent methods of CandBase derived
00009 // classes.  Implementations incorporated in CandBase.tpl file to
00010 // enable concrete Candidates to instantiate templated method calls.
00011 // For Candidate Validation suite by Paul Echevarria,  October 2003.
00012 
00013 #include "MessageService/MsgService.h"
00014 
00015 //......................................................................
00016 template<class mType>
00017 Bool_t CandBase::TestArrayEquality(const char* mbrName, int arrLen,
00018                                    const mType& thisMbr,
00019                                    const mType& rhsMbr) const
00020 {                                                                  
00021 
00022 // Tests the equality of a member array
00023   Bool_t isEquivalent = true;                                         
00024   for (int i=0; i < arrLen; i++) {                         
00025     if (!(thisMbr[i] == rhsMbr[i])) {           
00026       isEquivalent = false;                                           
00027     }                                                              
00028   }                                                                
00029   if (isEquivalent) {                                                  
00030     MSG("VCand", Msg::kDebug) << mbrName << "  \t[ok]\n";        
00031   }                                                                
00032   else {                                                           
00033     MSG("VCand", Msg::kDebug) << mbrName << "  \t[not ok]\n";    
00034     return false;                      
00035   }
00036   return true;
00037 }
00038 
00039 //......................................................................
00040 template<class chType>
00041 Bool_t CandBase::TestCandHandleDup(const char* chName,
00042                                    const chType* thisCH,
00043                                    const chType* rCndCH ) const
00044 {
00045 
00046 // Tests if the CandHandle pointer was DupHandle()
00047   if (!thisCH && !rCndCH) {
00048     MSG("VCand", Msg::kDebug) << chName << "  \t[ok]\n";
00049     return true;
00050   }
00051   else {
00052     if (thisCH == rCndCH) {
00053       MSG("VCand", Msg::kDebug) << chName << "  \t[is a shallow copy]\n";
00054       return false;
00055     }
00056     else {
00057       if ( *thisCH == *rCndCH) {
00058         MSG("VCand", Msg::kDebug) << chName << "  \t[ok]\n";
00059       }
00060       else {
00061         MSG("VCand", Msg::kDebug) << chName << "  \t[not ok]\n";
00062         return false;
00063       }
00064     }
00065   }
00066   return true;
00067 }                                                                
00068 
00069 //......................................................................
00070 template<class _char>
00071 void CandBase::TestDisplayCandBanner(_char* mName) const
00072 {
00073 
00074 // Displays a debugging banner
00075   MSG("VCand", Msg::kDebug) << "\n____________"
00076      << mName << "::IsEquivalent "
00077      << "______________________________\n";
00078 }
00079 
00080 //......................................................................
00081 template<class mType>
00082 Bool_t CandBase::TestEquality(const char* mbrName,
00083                               const mType& thisMbr,
00084                               const mType& rhsMbr) const
00085 {
00086 
00087 // Tests the equality of a simple member
00088   if (thisMbr == rhsMbr){
00089     MSG("VCand", Msg::kDebug) << mbrName << "  \t[ok]\n";
00090   }
00091   else {
00092     MSG("VCand", Msg::kDebug) << mbrName << "  \t[not ok]\n";
00093     return false;
00094   }
00095   return true;
00096 }
00097 
00098 //......................................................................
00099 template<class mType>
00100 Bool_t CandBase::TestEquivalence(const char* mName,
00101                                  const mType& thisMbr,
00102                                  const mType& rhsMbr) const
00103 {
00104 
00105 // Tests the equivalence of two objects
00106 // (uses the IsEquivalent method)
00107   if (&thisMbr == &rhsMbr) {
00108     MSG("VCand", Msg::kDebug) << mName << "  \t[is a shallow copy]\n";
00109     return false;
00110   }
00111   else {
00112     if (thisMbr.IsEquivalent(&rhsMbr)) {
00113       MSG("VCand", Msg::kDebug) << mName << "  \t[ok]\n";
00114     }
00115     else {
00116       MSG("VCand", Msg::kDebug) << mName << "  \t[not ok]\n";
00117       return false;
00118     }
00119   }
00120   return true;
00121 }
00122 
00123 //......................................................................
00124 template<class elemType>
00125 Bool_t CandBase::TestGenericElemPtrTObjArrayPtrEquality(
00126                                          const char* arrName,
00127                                          const TObjArray* thisTOA,
00128                                          const TObjArray* rCndTOA) const
00129 {
00130 
00131 // Tests the equality of the elements of a TObjArray* member
00132 // uses == operator to compare the TObject* elements of the TObjArray
00133   return TestGenericElemPtrTObjArrayPtrEquivalence<elemType>(arrName,
00134                                                thisTOA, rCndTOA, false);
00135 }
00136 
00137 //......................................................................
00138 template<class elemType>
00139 Bool_t CandBase::TestGenericElemPtrTObjArrayPtrEquivalence(
00140                                            const char* arrName,
00141                                            const TObjArray* thisTOA,
00142                                            const TObjArray* rCndTOA,
00143                                            Bool_t testEquivalence) const
00144 {
00145 
00146 // Tests the equivalence of the elements of a TObjArray* member
00147 // Uses the IsEquivalent() to compare the elements of the TObjArray
00148 // for the testEquivalence test
00149 // Note:  Uses IsEqual() instead of the == operator, for equality test.
00150   if (thisTOA == rCndTOA) {
00151     MSG("VCand", Msg::kDebug) << arrName << "  \t[is a shallow copy]\n";
00152     return false;
00153   }
00154   else {
00155     Bool_t isEquivalent = true;
00156     Bool_t isShallow    = false;
00157     Bool_t dcastFailed  = false;
00158     if (thisTOA->GetEntries() != thisTOA->GetEntries()) {
00159       isEquivalent = false;
00160     }
00161     else {
00162       TIterator* thisIter = thisTOA->MakeIterator();
00163       TIterator* rCndIter = rCndTOA->MakeIterator();
00164       TObject  *thisObj, *rCndObj;
00165       while ((thisObj = thisIter->Next()) &&
00166              (rCndObj = rCndIter->Next())) {
00167 
00168         if (thisObj == rCndObj) {
00169           isShallow = true;
00170         }
00171         else {
00172           elemType *thisCB = dynamic_cast<elemType*>(thisObj);
00173           elemType *rCndCB = dynamic_cast<elemType*>(rCndObj);
00174           if (thisCB == NULL || rCndCB == NULL) {
00175             isEquivalent = false;
00176             dcastFailed  = true;
00177             break;
00178           }
00179           if (testEquivalence) {   // use object's IsEquivalent() method
00180             if (!thisCB || !rCndCB || !(thisCB->IsEquivalent(rCndCB))) {
00181               isEquivalent = false;
00182             }
00183           }
00184           else {                    // use the object's IsEqual() method
00185             if ( !(thisObj->IsEqual(rCndObj)) ) {
00186               isEquivalent = false;
00187             }
00188           }
00189         }
00190       }
00191     }
00192     if (isEquivalent) {
00193       if (isShallow) {
00194         MSG("VCand", Msg::kDebug)
00195              << arrName << "  \t[shallow copy of TObjArray elements]\n";
00196       }
00197       else {
00198         MSG("VCand", Msg::kDebug) << arrName << "  \t[ok]\n";
00199       }
00200     }
00201     else {
00202       if (dcastFailed) {
00203         MSG("VCand", Msg::kDebug)
00204         << arrName << "  \t[dynamic cast of elements failed--not ok]\n";
00205       }
00206       else {
00207         MSG("VCand", Msg::kDebug) << arrName << "  \t[not ok]\n";
00208       }
00209       return false;
00210     }
00211   }
00212   return true;
00213 }
00214 
00215 //......................................................................
00216 template<class _char>
00217 void CandBase::TestNothing(_char* mName) const
00218 {
00219 
00220 // Shows that testing wasn't just looked over
00221   MSG("VCand", Msg::kDebug) << mName << " class:  Nothing to test.\n";
00222 }
00223 
00224 //......................................................................
00225 template<class mType>
00226 Bool_t CandBase::TestPtrEquivalence(const char* mName,
00227                                     const mType* thisMbr,
00228                                     const mType* rhsMbr) const
00229 {
00230 
00231 // Tests the equivalence of two object pointers
00232 // (uses the IsEquivalent method)
00233   if (thisMbr == rhsMbr) {
00234     MSG("VCand", Msg::kDebug) << mName << "  \t[is a shallow copy]\n";
00235     return false;
00236   }
00237   else {
00238     if (thisMbr->IsEquivalent(rhsMbr)) {
00239       MSG("VCand", Msg::kDebug) << mName << "  \t[ok]\n";
00240     }
00241     else {
00242       MSG("VCand", Msg::kDebug) << mName << "  \t[not ok]\n";
00243       return false;
00244     }
00245   }
00246   return true;
00247 }
00248 
00249 //......................................................................
00250 template<class toaType>
00251 Bool_t CandBase::TestTObjArrayCandHandleDup(const char* arrName,
00252                                             const toaType& thisTOA,
00253                                             const toaType& rCndTOA) const
00254 {
00255 
00256 // Tests if the CandHandles in the TObjArray were DupHandle()d
00257 // toaType is always a TObjArray, but it's templatized so the
00258   Bool_t isEquivalent = true;
00259   Bool_t hasShallowCopies = false;
00260   if (thisTOA.GetEntries() != rCndTOA.GetEntries() ){
00261     isEquivalent = false;
00262   }
00263   else {
00264     TIterator* thisIter = thisTOA.MakeIterator();
00265     TIterator* rCndIter = rCndTOA.MakeIterator();
00266 
00267 // loop over the CandHandle elements
00268     TObject *thisTObj, *rCndTObj;
00269     while ( ((thisTObj=thisIter->Next()) != NULL) &&
00270            ((rCndTObj=rCndIter->Next()) != NULL)   ) {
00271       if (thisTObj == rCndTObj) {
00272         hasShallowCopies = true;
00273         isEquivalent = false;
00274       }
00275       else {
00276         const CandHandle* thisCH =
00277               dynamic_cast<const CandHandle*>(thisTObj);
00278         const CandHandle* rCndCH =
00279               dynamic_cast<const CandHandle*>(rCndTObj);
00280         if(!(*thisCH == *rCndCH)) {
00281           isEquivalent = false;
00282         }
00283       }
00284     }
00285   }
00286 
00287   if (hasShallowCopies) {
00288     MSG("VCand", Msg::kDebug) << arrName
00289                               << "  \t[has shallow copies]\n";
00290   }
00291   else if (isEquivalent) {
00292     MSG("VCand", Msg::kDebug) << arrName << "  \t[ok]\n";
00293   }
00294   else {
00295     MSG("VCand", Msg::kDebug) << arrName << "  \t[not ok]\n";
00296     return false;
00297   }
00298   return true;
00299 }
00300 
00301 //......................................................................
00302 template<class toaType>
00303 Bool_t CandBase::TestTObjArrayEquality(const char* arrName,
00304                                        const toaType& thisTOA,
00305                                        const toaType& rCndTOA) const
00306 {
00307 
00308 // Tests the equality of a TObjArray member
00309 // array elements are compared by checking if they point to same object
00310 // (TObject* == TObject*)?
00311   return TestTObjArrayPtrEquality(arrName, &thisTOA, &rCndTOA);
00312 }
00313 
00314 //......................................................................
00315 template<class toaType>
00316 Bool_t CandBase::TestTObjArrayPtrEquality(const char* arrName,
00317                                           const toaType* thisTOA,
00318                                           const toaType* rCndTOA ) const
00319 {
00320 
00321 // Tests the equality of the elements of a TObjArray* member
00322 // uses == operator to compare the TObject* elements of the TObjArray
00323   return TestTObjArrayPtrEquivalence(arrName, thisTOA, rCndTOA, false);
00324 }
00325 
00326 //......................................................................
00327 template<class toaType>
00328 Bool_t CandBase::TestTObjArrayPtrEquivalence(const char* arrName,
00329                                              const toaType* thisTOA,
00330                                              const toaType* rCndTOA,
00331                                            Bool_t testEquivalence) const
00332 {
00333 
00334 // Tests the equivalence of the elements of a TObjArray* member
00335 // Uses the IsEquivalent() to compare the elements of the TObjArray
00336 // for the testEquivalence test
00337   if (thisTOA == rCndTOA) {
00338     MSG("VCand", Msg::kDebug) << arrName << "  \t[is a shallow copy]\n";
00339     return false;
00340   }
00341   else {
00342     Bool_t isEquivalent = true;
00343     if (thisTOA->GetEntries() != thisTOA->GetEntries()) {
00344       isEquivalent = false;
00345     }
00346     else {
00347       TIterator* thisIter = thisTOA->MakeIterator();
00348       TIterator* rCndIter = rCndTOA->MakeIterator();
00349       TObject  *thisObj, *rCndObj;
00350       while ( (thisObj = thisIter->Next()) &&
00351               (rCndObj = rCndIter->Next())   ) {
00352 
00353         if (testEquivalence) { // use the object's IsEquivalent() method
00354           CandBase *thisCB = dynamic_cast<CandBase*>(thisObj);
00355           CandBase *rCndCB = dynamic_cast<CandBase*>(rCndObj);
00356           if (!thisCB || !rCndCB || !(thisCB->IsEquivalent(rCndCB)) ) {
00357             isEquivalent = false;
00358           }
00359         }
00360         else {                                    // use the == operator
00361           if ( !(thisObj == rCndObj) ) {
00362             isEquivalent = false;
00363           }
00364         }
00365       }
00366     }
00367 
00368     if (isEquivalent) {
00369       MSG("VCand", Msg::kDebug) << arrName << "  \t[ok]\n";
00370     }
00371     else {
00372       MSG("VCand", Msg::kDebug) << arrName << "  \t[not ok]\n";
00373       return false;
00374     }
00375   }
00376   return true;
00377 }
00378 
00379 #endif                                                   // CANDBASE_TPL

Generated on Mon Feb 15 11:06:27 2010 for loon by  doxygen 1.3.9.1