1#ifndef __JROOT_TYPEWRITER__ 
    2#define __JROOT_TYPEWRITER__ 
   10#include "TDictionary.h" 
   11#include "TVirtualCollectionProxy.h" 
   12#include "TStreamerInfo.h" 
   13#include "TStreamerElement.h" 
   14#include "TBaseClass.h" 
   15#include "TDataMember.h" 
   24#include "TDirectory.h" 
   31namespace JPP { 
using namespace JROOT; }
 
   56    virtual void print(std::ostream& out, 
const char* po) 
const = 0;
 
 
   76    virtual void print(std::ostream& out, 
const char* po)
 const override 
   78      out << * ((
const T*) po);
 
 
 
   92    const TString* str = (
const TString*) po;
 
   95      out << 
"\"" << *str << 
"\"";
 
 
  109    out << 
"\"" << * ((
const std::string*) po) << 
"\"";
 
 
  124    out << 
"0x" << hex << (int) *po << dec;
 
 
  139    out << 
"\0x" << hex << (
unsigned int) *po << dec;
 
 
  147    public std::map<std::string, std::shared_ptr<JAbstractTypewriter> >
 
  180      this->
print(out, 
object.getTypename(), 
object);
 
 
  191    void operator()(std::ostream& out, TVirtualStreamerInfo* info, 
const char* ps)
 const 
  193      this->
print(out, info->GetClass()->GetName(), info, ps);
 
 
  205      if (
object.getClass() != NULL)
 
 
  234    void print(std::ostream& out, 
const std::string prefix, 
const char* type, 
const char* 
object)
 const 
  238      const_iterator i1 = this->find(type);
 
  241      out << 
" <" << type << 
">  ";
 
  243      if (i1 != this->end())
 
  244        i1->second->print(out, 
object);
 
 
  262    void print(std::ostream& out, 
const std::string prefix, 
const char* type, 
const char* ps, 
const size_t ns, 
const size_t size)
 const 
  266      const_iterator i1 = this->find(type);
 
  269      out << 
" <" << type << 
">  ";
 
  271      if (i1 != this->end()) {
 
  273        for (
size_t i = 0; i != ns; ++i) {
 
  274          i1->second->print(out, ps + i * size);
 
 
  293    template<
class TArray_t>
 
  294    void print(std::ostream& out, 
const std::string prefix, 
const TArray* pA)
 const 
  298      const TArray_t* p = 
dynamic_cast<const TArray_t*
>(pA);
 
  301        for (Int_t i = 0; i != p->GetSize(); ++i) {
 
  302          out << prefix << 
"[" << i << 
"]" << 
' ' << p->At(i) << endl;
 
 
  319      if (
object.is_valid()) {
 
  321        if (this->count(
object.getTypename()) != 0) {
 
  323          this->
print(out, prefix, 
object.getTypename(), 
object.getAddress());
 
  325        } 
else if (
object.getClass() != NULL) {
 
  327          if        (
object.getClass() == TArray::Class()) {
 
  329            TArray* p = (TArray*) (
object.getAddress());
 
  331            if (p->GetSize() == 0) {
 
  332              out << prefix << 
" <" << p->IsA()->GetName() << 
"> " << 
"{}" << endl;
 
  342          } 
else if (
object.getClass() == TList::Class()) {
 
  346            for (TIter next((TList*) 
object.getAddress()); 
const TObject *
p1 = (
const TObject*) next(); ++i) {
 
  350          } 
else if (
object.getClass()->GetCollectionProxy() != NULL) {
 
  352            unique_ptr<TVirtualCollectionProxy> 
p1(
object.getClass()->GetCollectionProxy()->Generate());
 
  354            p1->PushProxy(
const_cast<char*
>(
object.getAddress()));
 
  356            if (
p1->GetValueClass() == NULL) {
 
  357              for (UInt_t i = 0; i != 
p1->Size(); ++i) {
 
  358                this->
print(out,  prefix + 
"[" + to_string(i) + 
"]", TDataType::GetTypeName(
p1->GetType()),  (
const char*) 
p1->At(i));
 
  361              for (UInt_t i = 0; i != 
p1->Size(); ++i) {
 
  362                this->
print(out,  prefix + 
"[" + to_string(i) + 
"]", 
p1->GetValueClass()->GetStreamerInfo(), (
const char*) 
p1->At(i));
 
  368            if (
object.getClass()->GetListOfBases() != NULL) {
 
  370              for (TIter next(
object.getClass()->GetListOfBases()); 
const TBaseClass *
p1 = (
const TBaseClass*) next(); ) {
 
  373                  this->
print(out, prefix, 
object.get(*
p1));
 
  378            if (
object.getClass()->GetListOfDataMembers() != NULL) {
 
  380              if (!
object.getClass()->InheritsFrom(TClass::GetClass<TArray>())) {
 
  382                for (TIter next(
object.getClass()->GetListOfDataMembers()); 
const TDataMember *
p1 = (
const TDataMember*) next(); ) {
 
  386                    if (!
p1->IsEnum() && 
p1->IsPersistent()) {
 
  387                      this->
print(out, prefix + 
"." + 
p1->GetName(), 
object.get(*
p1));
 
 
  407    void print(std::ostream& out, 
const std::string prefix, TVirtualStreamerInfo* info, 
const char* ps)
 const 
  413        for (TIter next(info->GetElements()); TStreamerElement* ts = 
dynamic_cast<TStreamerElement*
>(next()); ) {
 
  415          if (this->count(ts->GetTypeName()) != 0) {
 
  417            if (ts->GetArrayLength() == 0)
 
  418              this->
print(out, prefix + 
"." + ts->GetName(), ts->GetTypeName(), ps + ts->GetOffset());
 
  420              this->
print(out, prefix + 
"." + ts->GetName(), ts->GetTypeName(), ps + ts->GetOffset(), ts->GetArrayLength(), ts->GetSize() / ts->GetArrayLength());
 
  422          } 
else if (ts->GetClass() != NULL) {
 
  424            if (ts->IsaPointer()) {
 
  428              memcpy(&po, ps + ts->GetOffset(), 
sizeof(
char*));
 
  432                if (ts->GetClass()->InheritsFrom(TList::Class())) {
 
  438                  this->
print(out, prefix + 
"." +  ts->GetName(), ts->GetClass()->GetStreamerInfo(), po);
 
  443                out << prefix << 
"." << ts->GetName() << 
" <" << ts->GetTypeName() << 
"> " << 
"NULL" << endl;
 
  446            } 
else if (ts->GetClass()->InheritsFrom(TArray::Class())) {
 
  450            } 
else if (ts->GetClass()->InheritsFrom(TDirectory::Class())) {
 
  454            } 
else if (ts->GetClass()->GetCollectionProxy() != NULL) {
 
  461                this->
print(out, prefix + 
"." +  ts->GetName(), ts->GetClass()->GetStreamerInfo(), ps + ts->GetOffset());
 
 
 
Interface for printing of a template class.
 
virtual void print(std::ostream &out, const char *po) const =0
Print object.
 
virtual ~JAbstractTypewriter()
Virtual destructor.
 
Implementation for printing of a template class.
 
virtual void print(std::ostream &out, const char *po) const override
Print object.
 
void operator()(std::ostream &out, TVirtualStreamerInfo *info, const char *ps) const
Print object.
 
void print(std::ostream &out, const std::string prefix, const char *type, const char *ps, const size_t ns, const size_t size) const
Print array of objects.
 
void print(std::ostream &out, const std::string prefix, const char *type, const char *object) const
Print object.
 
void operator()(std::ostream &out, const JBranchClass &object) const
Print object.
 
void print(std::ostream &out, const std::string prefix, const TArray *pA) const
Print TArray.
 
void print(std::ostream &out, const std::string prefix, TVirtualStreamerInfo *info, const char *ps) const
Print object.
 
void operator()(std::ostream &out, const T &object) const
Print object.
 
void operator()(std::ostream &out, const JRootWritableClass &object) const
Print object.
 
void print(std::ostream &out, const std::string prefix, const JRootWritableClass &object) const
Print object.
 
JRootTypewriter()
Default constructor.
 
void operator()(const char *const name, const JType< T > &type)
Addition of class.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary classes and methods for ROOT I/O.
 
void handler(JType_t &object)
Apply ROOT types handler to given object.
 
const char * getName()
Get ROOT name of given data type.
 
Auxiliary class for a type holder.
 
ROOT readable class for TBranch.
 
ROOT class for reading into object.
 
ROOT class for writing from object.
 
static bool is_class(const char *const name)
Check name of class against internal ROOT class names.
 
static bool is_static(const TDataMember &object)
Check if data member is static.