]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONCalibParamND.cxx
CID 22679: Out-of-bounds write (OVERRUN_STATIC)
[u/mrichter/AliRoot.git] / MUON / AliMUONCalibParamND.cxx
index 0737fc5779276f737ca0df16c84d19508294b8e8..66331c261e0fd81aec80c9c7fe87704f597bd9c5 100644 (file)
 #include "TMath.h"
 #include "TString.h"
 
-///
+//-----------------------------------------------------------------------------
 /// \class AliMUONCalibParamND
 ///
 /// Handle the case of N floating point (double precision) parameters per channel.
 ///
 /// \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
 
+using std::cout;
+using std::endl;
 /// \cond CLASSIMP
 ClassImp(AliMUONCalibParamND)
 /// \endcond
@@ -107,6 +110,8 @@ AliMUONCalibParamND::CopyTo(AliMUONCalibParamND& destination) const
 {
 /// Copy *this to destination
 
+  TObject::Copy(destination);
+  
   delete[] destination.fValues;
   destination.fN = fN;
   destination.fSize = fSize;
@@ -131,11 +136,20 @@ AliMUONCalibParamND::Index(Int_t i, Int_t j) const
 
   if ( i >= 0 && i < Size() && j >= 0 && j < Dimension() )
   {
-    return i + Size()*j;
+    return IndexFast(i,j);
   }
   return -1;
 }
 
+//_____________________________________________________________________________
+Int_t
+AliMUONCalibParamND::IndexFast(Int_t i, Int_t j) const
+{
+  /// Compute the 1D index of the internal storage from the pair (i,j)
+  
+  return i + Size()*j;
+}
+
 //_____________________________________________________________________________
 void
 AliMUONCalibParamND::Print(Option_t* opt) const
@@ -204,6 +218,14 @@ AliMUONCalibParamND::SetValueAsDouble(Int_t i, Int_t j, Double_t value)
   }
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCalibParamND::SetValueAsDoubleFast(Int_t i, Int_t j, Double_t value)
+{
+  /// Set one value as a double, w/o checking that the indices are correct.
+  
+  fValues[IndexFast(i,j)] = value;
+}
 
 //_____________________________________________________________________________
 void
@@ -213,6 +235,14 @@ AliMUONCalibParamND::SetValueAsFloat(Int_t i, Int_t j, Float_t value)
   SetValueAsDouble(i,j,static_cast<Double_t>(value));
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCalibParamND::SetValueAsFloatFast(Int_t i, Int_t j, Float_t value)
+{
+  /// Set one value as a float, after checking that the indices are correct.
+  SetValueAsDoubleFast(i,j,static_cast<Double_t>(value));
+}
+
 //_____________________________________________________________________________
 void
 AliMUONCalibParamND::SetValueAsInt(Int_t i, Int_t j, Int_t value)
@@ -222,6 +252,15 @@ AliMUONCalibParamND::SetValueAsInt(Int_t i, Int_t j, Int_t value)
   SetValueAsFloat(i,j,static_cast<Float_t>(value));
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCalibParamND::SetValueAsIntFast(Int_t i, Int_t j, Int_t value)
+{
+  /// Set one value as an int.
+  
+  SetValueAsFloatFast(i,j,static_cast<Float_t>(value));
+}
+
 //_____________________________________________________________________________
 Double_t
 AliMUONCalibParamND::ValueAsDouble(Int_t i, Int_t j) const
@@ -242,6 +281,15 @@ AliMUONCalibParamND::ValueAsDouble(Int_t i, Int_t j) const
   }
 }
 
+//_____________________________________________________________________________
+Double_t
+AliMUONCalibParamND::ValueAsDoubleFast(Int_t i, Int_t j) const
+{
+  /// Return the value as a double (which it is), w/o checking indices.
+  
+  return fValues[IndexFast(i,j)];
+}
+
 //_____________________________________________________________________________
 Float_t
 AliMUONCalibParamND::ValueAsFloat(Int_t i, Int_t j) const
@@ -250,6 +298,14 @@ AliMUONCalibParamND::ValueAsFloat(Int_t i, Int_t j) const
   return static_cast<Float_t>(ValueAsDouble(i,j));
 }
 
+//_____________________________________________________________________________
+Float_t
+AliMUONCalibParamND::ValueAsFloatFast(Int_t i, Int_t j) const
+{
+  /// Return the value as a float 
+  return static_cast<Float_t>(ValueAsDoubleFast(i,j));
+}
+
 //_____________________________________________________________________________
 Int_t
 AliMUONCalibParamND::ValueAsInt(Int_t i, Int_t j) const
@@ -259,3 +315,13 @@ AliMUONCalibParamND::ValueAsInt(Int_t i, Int_t j) const
   Float_t v = ValueAsFloat(i,j);
   return TMath::Nint(v);
 }
+
+//_____________________________________________________________________________
+Int_t
+AliMUONCalibParamND::ValueAsIntFast(Int_t i, Int_t j) const
+{
+  /// Return the value as an int, by rounding the internal float value.
+  
+  Float_t v = ValueAsFloatFast(i,j);
+  return TMath::Nint(v);
+}