// @(#)root/foam:$Name: $:$Id: TFoamVect.cxx,v 1.9 2005/09/04 09:02:06 brun Exp $
// Author: S. Jadach <mailto:Stanislaw.jadach@ifj.edu.pl>, P.Sawicki <mailto:Pawel.Sawicki@ifj.edu.pl>
//_____________________________________________________________________________
// //
// Auxiliary class TFoamVect of n-dimensional vector, with dynamic allocation //
// used for the cartesian geometry of the TFoam cells //
// //
//_____________________________________________________________________________
#include "Riostream.h"
#include "TSystem.h"
#include "TFoamVect.h"
#define SW2 setprecision(7) << setw(12)
ClassImp(TFoamVect);
//_____________________________________________________________________________
TFoamVect::TFoamVect()
{
// Default constructor for streamer
fDim =0;
fCoords =0;
fNext =0;
fPrev =0;
}
//______________________________________________________________________________
TFoamVect::TFoamVect(Int_t n)
{
// User constructor creating n-dimensional vector
// and allocating dynamically array of components
Int_t i;
fNext=0;
fPrev=0;
fDim=n;
fCoords = 0;
if (n>0){
fCoords = new Double_t[fDim];
if(gDebug) {
if(fCoords == NULL)
Error("TFoamVect", "Constructor failed to allocate\n");
}
for (i=0; i<n; i++) *(fCoords+i)=0.0;
}
if(gDebug) Info("TFoamVect", "USER CONSTRUCTOR TFoamVect(const Int_t)\n ");
}
//___________________________________________________________________________
TFoamVect::TFoamVect(const TFoamVect &Vect): TObject(Vect)
{
// Copy constructor
fNext=0;
fPrev=0;
fDim=Vect.fDim;
fCoords = 0;
if(fDim>0) fCoords = new Double_t[fDim];
if(gDebug) {
if(fCoords == NULL){
Error("TFoamVect", "Constructor failed to allocate fCoords\n");
}
}
for(Int_t i=0; i<fDim; i++)
fCoords[i] = Vect.fCoords[i];
Error("TFoamVect","+++++ NEVER USE Copy constructor !!!!!\n ");
}
//___________________________________________________________________________
TFoamVect::~TFoamVect()
{
// Destructor
if(gDebug) Info("TFoamVect"," DESTRUCTOR TFoamVect~ \n");
delete [] fCoords; // free(fCoords)
fCoords=0;
}
//////////////////////////////////////////////////////////////////////////////
// Overloading operators //
//////////////////////////////////////////////////////////////////////////////
//____________________________________________________________________________
TFoamVect& TFoamVect::operator =(const TFoamVect& Vect)
{
// substitution operator
Int_t i;
if (&Vect == this) return *this;
if( fDim != Vect.fDim )
Error("TFoamVect","operator=Dims. are different: %d and %d \n ",fDim,Vect.fDim);
if( fDim != Vect.fDim ){ // cleanup
delete [] fCoords;
fCoords = new Double_t[fDim];
}
fDim=Vect.fDim;
for(i=0; i<fDim; i++)
fCoords[i] = Vect.fCoords[i];
fNext=Vect.fNext;
fPrev=Vect.fPrev;
if(gDebug) Info("TFoamVect", "SUBSITUTE operator =\n ");
return *this;
}
//______________________________________________________________________
Double_t &TFoamVect::operator[](Int_t n)
{
// [] is for access to elements as in ordinary matrix like a[j]=b[j]
// (Perhaps against some strict rules but rather practical.)
// Range protection is built in, consequently for substitution
// one should use rather use a=b than explicit loop!
if ((n<0) || (n>=fDim)){
Error( "TFoamVect","operator[], out of range \n");
}
return fCoords[n];
}
//______________________________________________________________________
TFoamVect& TFoamVect::operator*=(const Double_t &x)
{
// unary multiplication operator *=
for(Int_t i=0;i<fDim;i++)
fCoords[i] = fCoords[i]*x;
return *this;
}
//_______________________________________________________________________
TFoamVect& TFoamVect::operator+=(const TFoamVect& Shift)
{
// unary addition operator +=; adding vector c*=x,
if( fDim != Shift.fDim){
Error( "TFoamVect","operator+, different dimensions= %d %d \n",fDim,Shift.fDim);
}
for(Int_t i=0;i<fDim;i++)
fCoords[i] = fCoords[i]+Shift.fCoords[i];
return *this;
}
//________________________________________________________________________
TFoamVect& TFoamVect::operator-=(const TFoamVect& Shift)
{
// unary subtraction operator -=
if( fDim != Shift.fDim){
Error( "TFoamVect","operator+, different dimensions= %d %d \n",fDim,Shift.fDim);
}
for(Int_t i=0;i<fDim;i++)
fCoords[i] = fCoords[i]-Shift.fCoords[i];
return *this;
}
//_________________________________________________________________________
TFoamVect TFoamVect::operator+(const TFoamVect &p2)
{
// addition operator +; sum of 2 vectors: c=a+b, a=a+b,
// NEVER USE IT, VERY SLOW!!!
TFoamVect temp(fDim);
temp = (*this);
temp += p2;
return temp;
}
//__________________________________________________________________________
TFoamVect TFoamVect::operator-(const TFoamVect &p2)
{
// subtraction operator -; difference of 2 vectors; c=a-b, a=a-b,
// NEVER USE IT, VERY SLOW!!!
TFoamVect temp(fDim);
temp = (*this);
temp -= p2;
return temp;
}
//___________________________________________________________________________
TFoamVect& TFoamVect::operator =(Double_t Vect[])
{
// Loading in ordinary double prec. vector, sometimes can be useful
Int_t i;
for(i=0; i<fDim; i++)
fCoords[i] = Vect[i];
return *this;
}
//____________________________________________________________________________
TFoamVect& TFoamVect::operator =(Double_t x)
{
// Loading in double prec. number, sometimes can be useful
if(fCoords != 0){
for(Int_t i=0; i<fDim; i++)
fCoords[i] = x;
}
return *this;
}
//////////////////////////////////////////////////////////////////////////////
// OTHER METHODS //
//////////////////////////////////////////////////////////////////////////////
//_____________________________________________________________________________
void TFoamVect::Print(Option_t *option) const
{
// Printout of all vector components on "cout"
if(!option) Error("Print ", "No option set \n");
Int_t i;
cout << "(";
for(i=0; i<fDim-1; i++) cout << SW2 << *(fCoords+i) << ",";
cout << SW2 << *(fCoords+fDim-1);
cout << ")";
}
//______________________________________________________________________________
void TFoamVect::PrintList(void)
{
// Printout of all member vectors in the list starting from "this"
Long_t i=0;
if(this == 0) return;
TFoamVect *current=this;
while(current != 0){
cout<<"vec["<<i<<"]=";
current->Print("1");
cout<<endl;
current = current->fNext;
i++;
}
}
///////////////////////////////////////////////////////////////////////////////
// End of Class TFoamVect //
///////////////////////////////////////////////////////////////////////////////
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.