// @(#)root/meta:$Id$
// Author: Rene Brun   05/03/95

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TRealData.h"
#include "TDataMember.h"
#include "TClass.h"
#include "TStreamer.h"

ClassImp(TRealData)

/** \class TRealData
The TRealData class manages the effective list of all data members
for a given class. For example for an object of class TLine that inherits
from TObject and TAttLine, the TRealData object for a line contains the
complete list of all data members of the 3 classes.

The list of TRealData members in TClass is built when functions like
object.Inspect or object.DrawClass are called.
*/

////////////////////////////////////////////////////////////////////////////////
/// RealData default constructor.

TRealData::TRealData() : TObject(), fDataMember(0), fThisOffset(-1),
   fStreamer(0), fIsObject(kFALSE)
{
}


////////////////////////////////////////////////////////////////////////////////
/// Constructor to define one persistent data member.
/// datamember is the pointer to the data member descriptor.

TRealData::TRealData(const char *name, Long_t offset, TDataMember *datamember)
   : TObject(), fDataMember(datamember), fThisOffset(offset), fName(name),
     fStreamer(0), fIsObject(kFALSE)
{
}

////////////////////////////////////////////////////////////////////////////////
/// RealData default destructor.

TRealData::~TRealData()
{
   delete fStreamer;
}

////////////////////////////////////////////////////////////////////////////////
/// Write one persistent data member on output buffer.
/// pointer points to the current persistent data member

void TRealData::WriteRealData(void *, char *&)
{
}

////////////////////////////////////////////////////////////////////////////////

void TRealData::AdoptStreamer(TMemberStreamer *str)
{
// fDataMember->SetStreamer(str);
// delete fStreamer;
   fStreamer = str;
}

////////////////////////////////////////////////////////////////////////////////
/// Return the name of the data member as represented in the list of
/// real data.

void TRealData::GetName(TString &output, TDataMember *dm)
{
   output.Clear();
   // keep an empty name if data member is not found
   if (dm) output = dm->GetName();
   if (dm->IsaPointer())
      output = TString("*")+output;
   else {
      if (dm && dm->GetArrayDim() > 0) {
         // in case of array (like fMatrix[2][2] we need to add max index )
         // this only in case of it os not a pointer
         for (int idim = 0; idim < dm->GetArrayDim(); ++idim)
            output += TString::Format("[%d]",dm->GetMaxIndex(idim) );
      }
   }
}


////////////////////////////////////////////////////////////////////////////////
/// Return the associate streamer object.

TMemberStreamer *TRealData::GetStreamer() const
{
   return fStreamer; // return fDataMember->GetStreamer();
}