54  {
   55    TObjArray* branches = tree.GetListOfBranches();
   56    
   57    if (branches->GetEntries() == 1) {
   58      tree.SetBranchAddress(branches->First()->GetName(), &this->address);
   59      return;
   60    }
   61 
   62    
   63    TClass* t_class = TClass::GetClass<T>();
   64    if (t_class == nullptr) {
   65      THROW(JException, 
"Could not get class " << 
typeid(T).name());
 
   66    }
   67 
   68    auto branch_names = 
to_vector(tree.GetListOfBranches());
 
   69    auto all_member_names = 
to_vector(t_class->GetListOfRealData());
 
   70 
   72 
   73    
   74    std::copy_if(all_member_names.begin(), all_member_names.end(), std::back_inserter(member_names),
   75                 [](const std::string& member_name)
   76                 { return !JRootClass::is_tobject_member(member_name.c_str()); });
   77 
   78    std::sort(branch_names.begin(), branch_names.end());
   79    std::sort(member_names.begin(), member_names.end());
   80 
   81    
   82    
   83    if (std::includes(branch_names.begin(), branch_names.end(), member_names.begin(),
   84                      member_names.end())) {
   85 
   87 
   88      auto* base = 
reinterpret_cast<uint8_t*
>(this->
address);
 
   89 
   90      for (const auto& member_name : member_names) {
   91        auto* member = static_cast<TDataMember*>(t_class->GetDataMember(member_name.c_str()));
   92        tree.SetBranchAddress(member_name.c_str(),
   93                              reinterpret_cast<void*>(base + member->GetOffset()));
   94      }
   95      return;
   96    }
   97 
   98    
   99    
  100    THROW(JException, 
"Members of type " << 
typeid(T).name() << 
"\n" 
  101                                         << 
JEEP::JEEPZ() << member_names << 
"\nBranches in tree\n" 
  103  }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
 
std::vector< std::string > to_vector(TCollection *col)
 
Auxiliary data structure for streaming of STL containers.