more bugfixes on data type operator semantics: earlier workarounds have been cleaned now
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTBlockFilterComponent.cxx
index faf8afbd406c6c07fd2c3bd7bd7c77f00f879cbb..f88cc931b6f8b376e008e801d1223dce1fccd8c5 100644 (file)
@@ -105,7 +105,7 @@ int AliHLTBlockFilterComponent::DoInit( int argc, const char** argv )
     if (argument.CompareTo("-datatype")==0) {
       if ((bMissingParam=(i+2>=argc))) break;
 
-      if (rule.fDataType!=kAliHLTAnyDataType) {
+      if (!MatchExactly(rule.fDataType,kAliHLTAnyDataType)) {
        // the data type has already been set, add to list
        // and reset
        fFilterRules.push_back(rule);
@@ -140,7 +140,7 @@ int AliHLTBlockFilterComponent::DoInit( int argc, const char** argv )
       break;
     }
   }
-  if (iResult>=0 && (rule.fSpecification!=kAliHLTVoidDataSpec || rule.fDataType!=kAliHLTAnyDataType)) {
+  if (iResult>=0 && (rule.fSpecification!=kAliHLTVoidDataSpec || !MatchExactly(rule.fDataType,kAliHLTAnyDataType))) {
     // add the pending rule
     fFilterRules.push_back(rule);
     FillBlockData(rule);
@@ -164,16 +164,28 @@ int AliHLTBlockFilterComponent::DoEvent( const AliHLTComponentEventData& evtData
 {
   // see header file for class documentation
   int iResult=0;
-  for (int n=0; n<(int)evtData.fBlockCnt; n++ ) {
-    if (IsSelected(blocks[n])) {
-      HLTDebug("block %d type %s %#x (ptr=%p offset=%d size=%d) selected by filter rules", 
-              n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification, 
-              blocks[n].fPtr, blocks[n].fOffset, blocks[n].fSize);
-      outputBlocks.push_back(blocks[n]);
+  for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock();
+       pBlock!=NULL; 
+       pBlock=GetNextInputBlock()) {
+    if (IsSelected(*pBlock)) {
+      HLTDebug("block type %s %#x (ptr=%p offset=%d size=%d) selected by filter rules", 
+              DataType2Text(pBlock->fDataType).c_str(), pBlock->fSpecification, 
+              pBlock->fPtr, pBlock->fOffset, pBlock->fSize);
+      Forward();
     } else {
-      HLTDebug("block %d type %s %#x discarded by filter rules", n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification);
+      HLTDebug("block type %s %#x discarded by filter rules", DataType2Text(pBlock->fDataType).c_str(), pBlock->fSpecification);
     }
   }
+//   for (int n=0; n<(int)evtData.fBlockCnt; n++ ) {
+//     if (IsSelected(blocks[n])) {
+//       HLTDebug("block %d type %s %#x (ptr=%p offset=%d size=%d) selected by filter rules", 
+//            n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification, 
+//            blocks[n].fPtr, blocks[n].fOffset, blocks[n].fSize);
+//       outputBlocks.push_back(blocks[n]);
+//     } else {
+//       HLTDebug("block %d type %s %#x discarded by filter rules", n, DataType2Text(blocks[n].fDataType).c_str(), blocks[n].fSpecification);
+//     }
+//   }
   size=0;
   return iResult;
 }
@@ -190,9 +202,9 @@ int AliHLTBlockFilterComponent::IsSelected(const AliHLTComponentBlockData& block
     // 2. data spec match or filter data wpec not set
     // 3. either filter data type or spec is set
     //HLTDebug("check rule : %s spec %#x", DataType2Text((*desc).fDataType, 2).c_str(), block.fSpecification);
-    if (((*desc).fDataType==block.fDataType || (*desc).fDataType==kAliHLTAnyDataType) &&
+    if (((*desc).fDataType==block.fDataType) &&
        ((*desc).fSpecification==block.fSpecification || (*desc).fSpecification==kAliHLTVoidDataSpec) &&
-       ((*desc).fDataType!=kAliHLTAnyDataType || (*desc).fSpecification!=kAliHLTVoidDataSpec)) {
+       (!MatchExactly((*desc).fDataType,kAliHLTAnyDataType) || (*desc).fSpecification!=kAliHLTVoidDataSpec)) {
       return 1;
     }
   } while (++desc!=fFilterRules.end());