ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the ALICE HLT Project        * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
//*                  for The ALICE HLT Project.                            *
//*                                                                        *
//* Permission to use, copy, modify and distribute this software and its   *
//* documentation strictly for non-commercial purposes is hereby granted   *
//* without fee, provided that the above copyright notice appears in all   *
//* copies and that both the copyright notice and this permission notice   *
//* appear in the supporting documentation. The authors make no claims     *
//* about the suitability of this software for any purpose. It is          *
//* provided "as is" without express or implied warranty.                  *
//**************************************************************************

/** @file   AliHLTBlockDataCollection.cxx
    @author Matthias Richter
    @date   
    @brief  A collection of AliHLTComponentBlockData descriptors providing
            argument parsing and basic selection.
*/

#include <cstdlib>
#include "AliHLTBlockDataCollection.h"
#include "AliHLTComponent.h"
#include "TString.h"

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTBlockDataCollection)

AliHLTBlockDataCollection::AliHLTBlockDataCollection()
  : TObject()
  , AliHLTLogging()
  , fFilterRules()
{
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
}

AliHLTBlockDataCollection::~AliHLTBlockDataCollection()
{
  // see header file for class documentation
}

int AliHLTBlockDataCollection::Add(const AliHLTComponentBlockData& block)
{
  // see header file for class documentation
  fFilterRules.push_back(block);
  return fFilterRules.size();
}

int AliHLTBlockDataCollection::ScanArgument( int argc, const char** argv )
{
  // see header file for class documentation
  int iResult=0;
  TString argument="";
  int bMissingParam=0;
  AliHLTComponentBlockData rule;
  AliHLTComponent::FillBlockData(rule);
  int i=0;
  for (; i<argc && iResult>=0; i++) {
    argument=argv[i];
    if (argument.IsNull()) continue;

    // -datatype
    if (argument.CompareTo("-datatype")==0) {
      if ((bMissingParam=(i+2>=argc))) break;

      if (!MatchExactly(rule.fDataType,kAliHLTAnyDataType)) {
	// the data type has already been set, add to list
	// and reset
	fFilterRules.push_back(rule);
	AliHLTComponent::FillBlockData(rule);
      }

      AliHLTComponent::SetDataType(rule.fDataType, argv[i+1], argv[i+2]);
      i+=2;

      // -origin
    } else if (argument.CompareTo("-origin")==0) {
      if ((bMissingParam=(i+1>=argc))) break;

      if (!MatchExactly(rule.fDataType,kAliHLTAnyDataType)) {
	// the data type has already been set, add to list
	// and reset
	fFilterRules.push_back(rule);
	AliHLTComponent::FillBlockData(rule);
      }

      AliHLTComponent::SetDataType(rule.fDataType, NULL, argv[i+1]);
      i+=1;

      // -typeid
    } else if (argument.CompareTo("-typeid")==0) {
      if ((bMissingParam=(i+1>=argc))) break;

      if (!MatchExactly(rule.fDataType,kAliHLTAnyDataType)) {
	// the data type has already been set, add to list
	// and reset
	fFilterRules.push_back(rule);
	AliHLTComponent::FillBlockData(rule);
      }

      AliHLTComponent::SetDataType(rule.fDataType, argv[i+1], NULL);
      i+=1;

      // -dataspec
    } else if (argument.CompareTo("-dataspec")==0) {
      if ((bMissingParam=(++i>=argc))) break;

      if (rule.fSpecification!=kAliHLTVoidDataSpec) {
	// the specification has already been set, add to list
	// and reset
	fFilterRules.push_back(rule);
	AliHLTComponent::FillBlockData(rule);
      }

      TString parameter(argv[i]);
      parameter.Remove(TString::kLeading, ' '); // remove all blanks
      char* pRemnant=NULL;
      rule.fSpecification=strtoul(parameter.Data(), &pRemnant, 0);
      if (pRemnant!=NULL && pRemnant[0]!=0) {
	HLTError("invalid parameter/remnant (%s) for argument %s, number expected", pRemnant, argument.Data());
	iResult=-EINVAL;
      }
    } else {
      // terminate at the first unknown argument
      break;
    }
  }

  if (bMissingParam) {
    HLTError("missing parameter for argument %s", argument.Data());
    iResult=-EPROTO;
  }
  if (iResult>=0) {
    if (rule.fSpecification!=kAliHLTVoidDataSpec || !MatchExactly(rule.fDataType,kAliHLTAnyDataType)) {
      // add the pending rule
      fFilterRules.push_back(rule);
      AliHLTComponent::FillBlockData(rule);
    }
    iResult=i;
  }

  return iResult;
}

int AliHLTBlockDataCollection::IsSelected(const AliHLTComponentBlockData& block)
{
  // see header file for class documentation
  AliHLTComponentBlockDataList::iterator desc=fFilterRules.begin();
  //HLTDebug("check block: %s spec %#x", DataType2Text(block.fDataType, 1).c_str(), block.fSpecification);
  if (desc==fFilterRules.end()) return 1; // no filter rules
  do {
    // match if
    // 1. data types match or filter data type not set
    // 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).fSpecification==block.fSpecification || (*desc).fSpecification==kAliHLTVoidDataSpec) &&
	(!MatchExactly((*desc).fDataType,kAliHLTAnyDataType) || (*desc).fSpecification!=kAliHLTVoidDataSpec)) {
      return 1;
    }
  } while (++desc!=fFilterRules.end());
  
  return 0;
}

int AliHLTBlockDataCollection::IsEmpty()
{
  // see header file for class documentation
  if (fFilterRules.size()==0) return 1;
  return 0;
}
 AliHLTBlockDataCollection.cxx:1
 AliHLTBlockDataCollection.cxx:2
 AliHLTBlockDataCollection.cxx:3
 AliHLTBlockDataCollection.cxx:4
 AliHLTBlockDataCollection.cxx:5
 AliHLTBlockDataCollection.cxx:6
 AliHLTBlockDataCollection.cxx:7
 AliHLTBlockDataCollection.cxx:8
 AliHLTBlockDataCollection.cxx:9
 AliHLTBlockDataCollection.cxx:10
 AliHLTBlockDataCollection.cxx:11
 AliHLTBlockDataCollection.cxx:12
 AliHLTBlockDataCollection.cxx:13
 AliHLTBlockDataCollection.cxx:14
 AliHLTBlockDataCollection.cxx:15
 AliHLTBlockDataCollection.cxx:16
 AliHLTBlockDataCollection.cxx:17
 AliHLTBlockDataCollection.cxx:18
 AliHLTBlockDataCollection.cxx:19
 AliHLTBlockDataCollection.cxx:20
 AliHLTBlockDataCollection.cxx:21
 AliHLTBlockDataCollection.cxx:22
 AliHLTBlockDataCollection.cxx:23
 AliHLTBlockDataCollection.cxx:24
 AliHLTBlockDataCollection.cxx:25
 AliHLTBlockDataCollection.cxx:26
 AliHLTBlockDataCollection.cxx:27
 AliHLTBlockDataCollection.cxx:28
 AliHLTBlockDataCollection.cxx:29
 AliHLTBlockDataCollection.cxx:30
 AliHLTBlockDataCollection.cxx:31
 AliHLTBlockDataCollection.cxx:32
 AliHLTBlockDataCollection.cxx:33
 AliHLTBlockDataCollection.cxx:34
 AliHLTBlockDataCollection.cxx:35
 AliHLTBlockDataCollection.cxx:36
 AliHLTBlockDataCollection.cxx:37
 AliHLTBlockDataCollection.cxx:38
 AliHLTBlockDataCollection.cxx:39
 AliHLTBlockDataCollection.cxx:40
 AliHLTBlockDataCollection.cxx:41
 AliHLTBlockDataCollection.cxx:42
 AliHLTBlockDataCollection.cxx:43
 AliHLTBlockDataCollection.cxx:44
 AliHLTBlockDataCollection.cxx:45
 AliHLTBlockDataCollection.cxx:46
 AliHLTBlockDataCollection.cxx:47
 AliHLTBlockDataCollection.cxx:48
 AliHLTBlockDataCollection.cxx:49
 AliHLTBlockDataCollection.cxx:50
 AliHLTBlockDataCollection.cxx:51
 AliHLTBlockDataCollection.cxx:52
 AliHLTBlockDataCollection.cxx:53
 AliHLTBlockDataCollection.cxx:54
 AliHLTBlockDataCollection.cxx:55
 AliHLTBlockDataCollection.cxx:56
 AliHLTBlockDataCollection.cxx:57
 AliHLTBlockDataCollection.cxx:58
 AliHLTBlockDataCollection.cxx:59
 AliHLTBlockDataCollection.cxx:60
 AliHLTBlockDataCollection.cxx:61
 AliHLTBlockDataCollection.cxx:62
 AliHLTBlockDataCollection.cxx:63
 AliHLTBlockDataCollection.cxx:64
 AliHLTBlockDataCollection.cxx:65
 AliHLTBlockDataCollection.cxx:66
 AliHLTBlockDataCollection.cxx:67
 AliHLTBlockDataCollection.cxx:68
 AliHLTBlockDataCollection.cxx:69
 AliHLTBlockDataCollection.cxx:70
 AliHLTBlockDataCollection.cxx:71
 AliHLTBlockDataCollection.cxx:72
 AliHLTBlockDataCollection.cxx:73
 AliHLTBlockDataCollection.cxx:74
 AliHLTBlockDataCollection.cxx:75
 AliHLTBlockDataCollection.cxx:76
 AliHLTBlockDataCollection.cxx:77
 AliHLTBlockDataCollection.cxx:78
 AliHLTBlockDataCollection.cxx:79
 AliHLTBlockDataCollection.cxx:80
 AliHLTBlockDataCollection.cxx:81
 AliHLTBlockDataCollection.cxx:82
 AliHLTBlockDataCollection.cxx:83
 AliHLTBlockDataCollection.cxx:84
 AliHLTBlockDataCollection.cxx:85
 AliHLTBlockDataCollection.cxx:86
 AliHLTBlockDataCollection.cxx:87
 AliHLTBlockDataCollection.cxx:88
 AliHLTBlockDataCollection.cxx:89
 AliHLTBlockDataCollection.cxx:90
 AliHLTBlockDataCollection.cxx:91
 AliHLTBlockDataCollection.cxx:92
 AliHLTBlockDataCollection.cxx:93
 AliHLTBlockDataCollection.cxx:94
 AliHLTBlockDataCollection.cxx:95
 AliHLTBlockDataCollection.cxx:96
 AliHLTBlockDataCollection.cxx:97
 AliHLTBlockDataCollection.cxx:98
 AliHLTBlockDataCollection.cxx:99
 AliHLTBlockDataCollection.cxx:100
 AliHLTBlockDataCollection.cxx:101
 AliHLTBlockDataCollection.cxx:102
 AliHLTBlockDataCollection.cxx:103
 AliHLTBlockDataCollection.cxx:104
 AliHLTBlockDataCollection.cxx:105
 AliHLTBlockDataCollection.cxx:106
 AliHLTBlockDataCollection.cxx:107
 AliHLTBlockDataCollection.cxx:108
 AliHLTBlockDataCollection.cxx:109
 AliHLTBlockDataCollection.cxx:110
 AliHLTBlockDataCollection.cxx:111
 AliHLTBlockDataCollection.cxx:112
 AliHLTBlockDataCollection.cxx:113
 AliHLTBlockDataCollection.cxx:114
 AliHLTBlockDataCollection.cxx:115
 AliHLTBlockDataCollection.cxx:116
 AliHLTBlockDataCollection.cxx:117
 AliHLTBlockDataCollection.cxx:118
 AliHLTBlockDataCollection.cxx:119
 AliHLTBlockDataCollection.cxx:120
 AliHLTBlockDataCollection.cxx:121
 AliHLTBlockDataCollection.cxx:122
 AliHLTBlockDataCollection.cxx:123
 AliHLTBlockDataCollection.cxx:124
 AliHLTBlockDataCollection.cxx:125
 AliHLTBlockDataCollection.cxx:126
 AliHLTBlockDataCollection.cxx:127
 AliHLTBlockDataCollection.cxx:128
 AliHLTBlockDataCollection.cxx:129
 AliHLTBlockDataCollection.cxx:130
 AliHLTBlockDataCollection.cxx:131
 AliHLTBlockDataCollection.cxx:132
 AliHLTBlockDataCollection.cxx:133
 AliHLTBlockDataCollection.cxx:134
 AliHLTBlockDataCollection.cxx:135
 AliHLTBlockDataCollection.cxx:136
 AliHLTBlockDataCollection.cxx:137
 AliHLTBlockDataCollection.cxx:138
 AliHLTBlockDataCollection.cxx:139
 AliHLTBlockDataCollection.cxx:140
 AliHLTBlockDataCollection.cxx:141
 AliHLTBlockDataCollection.cxx:142
 AliHLTBlockDataCollection.cxx:143
 AliHLTBlockDataCollection.cxx:144
 AliHLTBlockDataCollection.cxx:145
 AliHLTBlockDataCollection.cxx:146
 AliHLTBlockDataCollection.cxx:147
 AliHLTBlockDataCollection.cxx:148
 AliHLTBlockDataCollection.cxx:149
 AliHLTBlockDataCollection.cxx:150
 AliHLTBlockDataCollection.cxx:151
 AliHLTBlockDataCollection.cxx:152
 AliHLTBlockDataCollection.cxx:153
 AliHLTBlockDataCollection.cxx:154
 AliHLTBlockDataCollection.cxx:155
 AliHLTBlockDataCollection.cxx:156
 AliHLTBlockDataCollection.cxx:157
 AliHLTBlockDataCollection.cxx:158
 AliHLTBlockDataCollection.cxx:159
 AliHLTBlockDataCollection.cxx:160
 AliHLTBlockDataCollection.cxx:161
 AliHLTBlockDataCollection.cxx:162
 AliHLTBlockDataCollection.cxx:163
 AliHLTBlockDataCollection.cxx:164
 AliHLTBlockDataCollection.cxx:165
 AliHLTBlockDataCollection.cxx:166
 AliHLTBlockDataCollection.cxx:167
 AliHLTBlockDataCollection.cxx:168
 AliHLTBlockDataCollection.cxx:169
 AliHLTBlockDataCollection.cxx:170
 AliHLTBlockDataCollection.cxx:171
 AliHLTBlockDataCollection.cxx:172
 AliHLTBlockDataCollection.cxx:173
 AliHLTBlockDataCollection.cxx:174
 AliHLTBlockDataCollection.cxx:175
 AliHLTBlockDataCollection.cxx:176
 AliHLTBlockDataCollection.cxx:177
 AliHLTBlockDataCollection.cxx:178
 AliHLTBlockDataCollection.cxx:179
 AliHLTBlockDataCollection.cxx:180
 AliHLTBlockDataCollection.cxx:181