// @(#)root/treeplayer:$Id: TFormLeafInfoReference.h 20882 2007-11-19 11:31:26Z rdm $
// Author: Markus Frank 01/02/2006

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

#ifndef ROOT_TFormLeafInfoReference
#define ROOT_TFormLeafInfoReference

#ifndef ROOT_TFormLeafInfo
#include "TFormLeafInfo.h"
#endif

#include <string>

// Forward declarations
class TVirtualRefProxy;

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFormLeafInfoReference                                               //
//                                                                      //
// TFormLeafInfoReference is a small helper class to implement the      //
// following of reference objects stored in a TTree                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
class TFormLeafInfoReference : public TFormLeafInfo {
   typedef TVirtualRefProxy Proxy;
public:
   Proxy*      fProxy;         //! Cached pointer to reference proxy
   TBranch*    fBranch;        //! Cached pointer to branch object
public:
   // Initializing constructor
   TFormLeafInfoReference(TClass* classptr, TStreamerElement* element, int off);
   // Copy constructor
   TFormLeafInfoReference(const TFormLeafInfoReference& orig);
   // Default destructor
   virtual ~TFormLeafInfoReference();
   // Virtual copy constructor
   virtual TFormLeafInfo* DeepCopy()  const;

   // Access to the info's proxy
   Proxy*           GetProxy()        const      {  return fProxy;        }
   // Access to the info's connected branch
   TBranch*         GetBranch()       const      {  return fBranch;       }
   // Access to the info's connected branch
   void             SetBranch(TBranch* branch)   
   {  fBranch = branch; if ( fNext ) fNext->SetBranch(branch);            }
   // Access to the offset of the data
   virtual Int_t    GetOffset()       const     {  return fOffset;       }
   // Return true only if the underlying data is an integral value
   virtual Bool_t   IsInteger()       const     {  return kFALSE;         }
   // Return true only if the underlying data is a string
   virtual Bool_t   IsString()        const     {  return kFALSE;         }
   // Return true only if the underlying data is a reference
   virtual Bool_t   IsReference()     const     {  return kTRUE;          }
   // Access to target class pointer (if available)
   virtual TClass*  GetClass()        const;
   // Access to the value class of the reference proxy
   virtual TClass*  GetValueClass(TLeaf* from);
   // Access to the value class from the object pointer
   virtual TClass*  GetValueClass(void* from);
   // Return the address of the local value
   virtual void    *GetLocalValuePointer( TLeaf *from, Int_t instance = 0);
   // Return the address of the local value
   virtual void    *GetLocalValuePointer(char *from, Int_t instance = 0);
   // Return true if any of underlying data has a array size counter
   virtual Bool_t HasCounter() const;
   // Return the size of the underlying array for the current entry in the TTree.
   virtual Int_t ReadCounterValue(char *where);
   // Return the current size of the array container
   virtual Int_t GetCounterValue(TLeaf* leaf);

   // Access value of referenced object
   virtual Double_t GetValue(TLeaf *leaf, Int_t instance);
   // Read value of referenced object
   virtual Double_t ReadValue(char *where, Int_t instance = 0);
   // TFormLeafInfo overload: Update (and propagate) cached information
   virtual Bool_t   Update();
};
#endif /* ROOT_TFormLeafInfoReference */
