#include "AliHLTScalars.h"
#include "TString.h"
#include "AliHLTLogging.h"
#include "TClass.h" // for Class_Name macro for logging
#include "TIterator.h"
#include "Riostream.h"
#include <cassert>
ClassImp(AliHLTScalars);
ClassImp(AliHLTScalars::AliScalar);
AliHLTScalars::AliHLTScalars() :
TObject(),
fScalars(AliHLTScalars::AliScalar::Class(), 128),
fMap(TCollection::kInitHashTableCapacity, 2)
{
fMap.SetOwner(kFALSE);
}
AliHLTScalars::AliHLTScalars(const AliHLTScalars& obj) :
TObject(obj),
fScalars(obj.fScalars),
fMap(obj.fMap.GetSize(), obj.fMap.GetRehashLevel())
{
fMap.SetOwner(kFALSE);
fMap.AddAll(&fScalars);
}
AliHLTScalars::AliHLTScalars(const TClass* cl, Int_t initSize) :
TObject(),
fScalars(cl, initSize),
fMap(TCollection::kInitHashTableCapacity, 2)
{
fMap.SetOwner(kFALSE);
}
AliHLTScalars::~AliHLTScalars()
{
Clear();
}
AliHLTScalars::AliScalar* AliHLTScalars::NewScalar(UInt_t i, const char* name, const char* description, Double_t value)
{
return new (fScalars[i]) AliScalar(name, description, value);
}
const AliHLTScalars::AliScalar& AliHLTScalars::Sentinel() const
{
static AliHLTScalars::AliScalar sentinel;
return sentinel;
}
bool AliHLTScalars::Add(AliScalar*& scalar, const char* name, const char* description, Double_t value)
{
scalar = static_cast<AliScalar*>( fMap.FindObject(name) );
bool exists = scalar != NULL;
if (not exists)
{
scalar = NewScalar(fScalars.GetEntriesFast(), name, description, value);
fMap.Add(scalar);
}
else
{
scalar->Value(value);
}
return exists;
}
bool AliHLTScalars::Add(const char* name, const char* description, Double_t value)
{
AliScalar* scalar = NULL;
return Add(scalar, name, description, value);
}
bool AliHLTScalars::Remove(const char* name)
{
TNamed x(name, "");
TObject* scalar = fMap.Remove(&x);
bool existed = scalar != NULL;
if (existed)
{
fScalars.Remove(scalar);
fScalars.Compress();
}
return existed;
}
const AliHLTScalars::AliScalar& AliHLTScalars::GetScalar(const char* name) const
{
const TObject* scalar = fMap.FindObject(name);
if (scalar != NULL)
{
return *static_cast<const AliScalar*>(scalar);
}
else
{
return Sentinel();
}
}
AliHLTScalars::AliScalar& AliHLTScalars::GetScalar(const char* name)
{
TObject* scalar = fMap.FindObject(name);
if (scalar == NULL)
{
scalar = NewScalar(fScalars.GetEntriesFast(), name, "", 0);
fMap.Add(scalar);
}
return *static_cast<AliScalar*>(scalar);
}
const AliHLTScalars::AliScalar& AliHLTScalars::GetScalarN(UInt_t n) const
{
if (n < NumberOfScalars())
{
const TObject* scalar = fScalars.UncheckedAt(Int_t(n));
return *static_cast<const AliScalar*>(scalar);
}
else
{
return Sentinel();
}
}
AliHLTScalars::AliScalar& AliHLTScalars::GetScalarN(UInt_t n)
{
TObject* scalar = NULL;
if (n < NumberOfScalars())
{
scalar = fScalars.UncheckedAt(Int_t(n));
}
else
{
for (UInt_t i = NumberOfScalars(); i <= n; ++i)
{
TString nameToUse = Form("Scalar%d", i);
if (FindObject(nameToUse.Data()) != NULL)
{
UInt_t m = 0;
do
{
nameToUse = Form("Scalar%d_%d", i, m++);
}
while (FindObject(nameToUse.Data()) != NULL);
}
scalar = NewScalar(i, nameToUse.Data(), "", 0);
fMap.Add(scalar);
}
}
return *static_cast<AliScalar*>(scalar);
}
void AliHLTScalars::Reset()
{
for (Int_t i = 0; i < fScalars.GetEntriesFast(); ++i)
{
AliScalar* scalar = static_cast<AliScalar*>( fScalars.UncheckedAt(i) );
scalar->Value(0);
}
}
void AliHLTScalars::Clear(Option_t* option)
{
fMap.Clear();
fScalars.Delete(option);
}
void AliHLTScalars::Copy(TObject& object) const
{
if (object.IsA() != AliHLTScalars::Class())
{
AliHLTLogging log;
log.LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , "Cannot copy to an object of type '%s'.", object.ClassName());
return;
}
AliHLTScalars* obj = static_cast<AliHLTScalars*>(&object);
obj->operator = (*this);
}
void AliHLTScalars::Print(Option_t* option) const
{
TIter next(&fScalars);
const AliScalar* scalar = NULL;
TString opt = option;
if (opt == "compact")
{
scalar = static_cast<const AliScalar*>(next());
if (scalar != NULL) cout << scalar->Value();
while ((scalar = static_cast<const AliScalar*>(next())) != NULL)
{
cout << ", " << scalar->Value();
}
cout << endl;
return;
}
int fieldwidth = 0;
while ((scalar = static_cast<const AliScalar*>(next())) != NULL)
{
int length = strlen(scalar->Name()) + strlen(scalar->Description()) + 3;
if (length > fieldwidth) fieldwidth = length;
}
if (fieldwidth > 80) fieldwidth = 80;
cout << "HLT scalars:" << endl;
next.Reset();
while ((scalar = static_cast<const AliScalar*>(next())) != NULL)
{
TString str = scalar->Description();
str += " (";
str += scalar->Name();
str += ")";
cout << setw(fieldwidth) << str.Data() << setw(0)
<< " = " << scalar->Value() << setw(0)
<< endl;
}
if (fScalars.GetEntriesFast() == 0) cout << "(none)" << endl;
}
AliHLTScalars& AliHLTScalars::operator = (const AliHLTScalars& obj)
{
if (this == &obj) return *this;
Clear();
TObject::operator = (obj);
for (Int_t i = 0; i < obj.fScalars.GetEntriesFast(); ++i)
{
const AliScalar* x = static_cast<const AliScalar*>(obj.fScalars.UncheckedAt(i));
new (fScalars[i]) AliScalar(*x);
}
fMap.AddAll(&fScalars);
return *this;
}
Bool_t AliHLTScalars::IsEqual(const TObject *obj) const
{
assert(obj != NULL);
if (obj->IsA()->GetBaseClass(AliHLTScalars::Class()) == NULL)
{
AliHLTLogging log;
log.LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , "Cannot compare object of type '%s'' with an object of type '%s'.",
this->ClassName(), obj->ClassName()
);
return kFALSE;
}
const AliHLTScalars* rhs = static_cast<const AliHLTScalars*>(obj);
if (fScalars.GetEntriesFast() != rhs->fScalars.GetEntriesFast()) return kFALSE;
TIter next(&fScalars);
const AliScalar* scalar = NULL;
while ((scalar = static_cast<const AliScalar*>(next())) != NULL)
{
if (rhs->fScalars.FindObject(scalar->Name()) == NULL) return kFALSE;
}
return kTRUE;
}
bool AliHLTScalars::operator == (const AliHLTScalars& obj) const
{
if (fScalars.GetEntriesFast() != obj.fScalars.GetEntriesFast()) return false;
TIter next(&fScalars);
const AliScalar* a = NULL;
while ((a = static_cast<const AliScalar*>(next())) != NULL)
{
const AliScalar* b = static_cast<const AliScalar*>(
obj.fScalars.FindObject(a->Name())
);
if (b == NULL) return false;
if (a->Value() != b->Value()) return false;
}
return true;
}
void AliHLTScalars::AliScalar::Copy(TObject& object) const
{
if (object.IsA() != AliHLTScalars::AliScalar::Class())
{
AliHLTLogging log;
log.LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , "Cannot copy to an object of type '%s'.", object.ClassName());
return;
}
AliHLTScalars::AliScalar* obj = static_cast<AliHLTScalars::AliScalar*>(&object);
*obj = *this;
}