1#ifndef __JROOT__JROOTCLASS__
2#define __JROOT__JROOTCLASS__
10#include <TDictionary.h>
12#include <TDataMember.h>
13#include <TBaseClass.h>
29namespace JPP {
using namespace JROOT; }
49 template<
class JType_t>
51 dictionary(TDictionary::GetDictionary(typeid(JType_t))),
61 template<
class JType_t,
class JClass_t>
63 dictionary(TDictionary::GetDictionary(typeid(JType_t))),
64 offset((char*) &(((JClass_t*) NULL)->*pd) - (char*) NULL)
162 if (name != NULL && strlen(name) != 0) {
172 for (TIter next(this->
getClass()->GetListOfDataMembers(kFALSE));
const TDataMember *p = (
const TDataMember*) next(); ) {
173 if (( option && strcmp (p->GetName(), name) == 0) ||
174 (!option && strcasecmp(p->GetName(), name) == 0)) {
175 return this->
get(*p);
181 for (TIter next(this->
getClass()->GetListOfBases());
const TBaseClass *p = (
const TBaseClass*) next(); ) {
187 rcs = rcs.
find(name, option);
209 return JRootClass(TDictionary::GetDictionary(
object.GetTypeName()),
222 return JRootClass(TDictionary::GetDictionary(
object.GetName()),
223 this->
getOffset() +
const_cast<TBaseClass&
>(
object).GetDelta());
232 inline void print(std::ostream& out)
const
259 inline void print(std::ostream& out,
const std::string& prefix)
const
267 for (TIter next(this->
getClass()->GetListOfBases());
const TBaseClass *p = (
const TBaseClass*) next(); ) {
269 this->
get(*p).
print(out, prefix +
"::" + p->GetName());
271 print(out, prefix +
"::" + p->GetName(), this->get(*p).getTypename());
274 for (TIter next(this->
getClass()->GetListOfDataMembers(kFALSE));
const TDataMember *p = (
const TDataMember*) next(); ) {
278 print(out, prefix + (
JRoot::is_static(*p) ?
"::" :
".") + p->GetName(), this->get(*p).getTypename());
292 inline static void print(std::ostream& out,
const std::string& name,
const std::string& type)
296 out << name <<
" " <<
'(' << type <<
')' << endl;
313 for (TIter next(parent.
getClass()->GetListOfDataMembers(kFALSE));
const TDataMember *p = (
const TDataMember*) next(); ) {
322 for (TIter next(parent.
getClass()->GetListOfBases());
const TBaseClass *p = (
const TBaseClass*) next(); ) {
345 template<
class JType_t,
class JClass_t>
360 if (buffer.empty()) {
362 TClass* rc =
dynamic_cast<TClass*
>(TDictionary::GetDictionary(
typeid(T)));
365 for (TIter next(rc->GetListOfDataMembers(kFALSE)); TDataMember *p = (TDataMember*) next(); ) {
382 template<
class JPo
inter_t>
447 if (
object.IsaPointer()) {
451 memcpy(&po, this->
getAddress() +
object.GetOffset(),
sizeof(
char*));
455 }
else if (strstr(
object.GetTypeName(),
"unique_ptr") != NULL) {
459 memcpy(&po, this->
getAddress() +
object.GetOffset(),
sizeof(
char*));
461 string buffer(
object.GetTypeName());
463 const string::size_type il = buffer.find_first_of(
"<");
464 const string::size_type ir = buffer.find_first_of(
">,");
466 buffer = buffer.substr(il + 1, ir - il - 1);
497 return this->
find(name);
578 operator const T&()
const
657 operator const T&()
const
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Exception for cast operation.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary classes and methods for ROOT I/O.
std::vector< TDataMember * > getListOfDataMembers()
Get list of ROOT data members for given class.
const TDataMember * getDataMember(const JRootClass &parent, const JRootClass &member)
Get ROOT data member for given parent and member class.
Template definition of auxiliary base class for comparison of data structures.
Auxiliary class for a type holder.
Auxiliary class to manage access to base classes and data members of ROOT class objects.
JPointer_t pointer_type
Type definition of address.
bool is_valid() const
Check validity of this addressable class.
pointer_type getAddress() const
Get address.
JRootAddressableClass find(const char *const name) const
Find addressable base class or data member with given name within current class.
JRootAddressableClass operator[](const char *const name) const
Find addressable base class or data member with given name within current class.
JRootAddressableClass(const JRootClass &rc, pointer_type address)
Constructor.
JRootAddressableClass get(const TDataMember &object) const
Get addressable class of given data member.
JRootAddressableClass get(const TBaseClass &object) const
Get addressable class of given base class.
JRootAddressableClass()
Default constructor.
JRootAddressableClass(T &object)
Constructor.
Auxiliary class to manage access to base classes and data members of ROOT class.
TDictionary * getDictionary() const
Get dictionary.
JRootClass(const JType< JType_t > &type)
Constructor.
void print(std::ostream &out) const
Print ROOT class information.
TDictionary * dictionary
pointer to ROOT dictionary
const char * getTypename() const
Get type name.
bool is_valid() const
Check validity of this class.
JRootClass(JType_t JClass_t::*pd)
Constructor.
JRootClass()
Default constructor.
TClass * getClass() const
Get class.
void print(std::ostream &out, const std::string &prefix) const
Print ROOT class information.
int getOffset() const
Get offset of this class with respect to parent class.
JRootClass get(const TBaseClass &object) const
Get ROOT class of given base class.
int offset
offset with respect to data structure [B]
JRootClass find(const char *const name, const bool option=true) const
Find base class or data member with given name within current class.
static void print(std::ostream &out, const std::string &name, const std::string &type)
Print ROOT class information.
JRootClass get(const TDataMember &object) const
Get ROOT class of given data member.
JRootClass(TDictionary *dictionary, int offset=0)
Constructor.
bool equals(const JRootClass &object) const
Test equality of ROOT classes.
ROOT class for reading into object.
JRootReadableClass(const JRootAddressableClass< char * > &rc)
Copy constructor.
JRootReadableClass()
Default constructor.
JRootReadableClass(TDictionary *dictionary, pointer_type address)
Constructor.
JRootReadableClass(T &object)
Constructor.
ROOT class for writing from object.
JRootWritableClass(const JRootAddressableClass< const char * > &rc)
Copy constructor.
JRootWritableClass()
Default constructor.
JRootWritableClass(const T &object)
Constructor.
JRootWritableClass(TDictionary *dictionary, pointer_type address)
Constructor.
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.
static bool is_STLcontainer(const TBaseClass &object)
Check if base class is STL container.
static bool is_STLstring(const TDataMember &object)
Check if data member is STL string.