CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FWItemAccessorFactory.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWItemAccessorFactory
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Sat Oct 18 14:48:14 EDT 2008
11 //
12 
13 // system include files
14 #include <iostream>
15 #include "TClass.h"
16 #include "TVirtualCollectionProxy.h"
19 
20 // user include files
26 
27 //
28 // constants, enums and typedefs
29 //
30 
31 //
32 // static data member definitions
33 //
34 
35 //
36 // constructors and destructor
37 //
39 {
40 }
41 
42 // FWItemAccessorFactory::FWItemAccessorFactory(const FWItemAccessorFactory& rhs)
43 // {
44 // // do actual copying here;
45 // }
46 
48 {
49 }
50 
51 //
52 // assignment operators
53 //
54 // const FWItemAccessorFactory& FWItemAccessorFactory::operator=(const FWItemAccessorFactory& rhs)
55 // {
56 // //An exception safe implementation is
57 // FWItemAccessorFactory temp(rhs);
58 // swap(rhs);
59 //
60 // return *this;
61 // }
62 
63 //
64 // member functions
65 //
66 
67 //
68 // const member functions
69 //
70 
93 boost::shared_ptr<FWItemAccessorBase>
94 FWItemAccessorFactory::accessorFor(const TClass* iClass) const
95 {
96  static const bool debug = false;
97 
98  TClass *member = 0;
99  size_t offset=0;
100 
101  if(hasTVirtualCollectionProxy(iClass))
102  {
103  if (debug)
104  fwLog(fwlog::kDebug) << "class " << iClass->GetName()
105  << " uses FWItemTVirtualCollectionProxyAccessor." << std::endl;
106  return boost::shared_ptr<FWItemAccessorBase>(
108  boost::shared_ptr<TVirtualCollectionProxy>(iClass->GetCollectionProxy()->Generate())));
109  }
110  else if (hasMemberTVirtualCollectionProxy(iClass, member,offset))
111  {
112  if (debug)
113  fwLog(fwlog::kDebug) << "class "<< iClass->GetName()
114  << " only contains data member " << member->GetName()
115  << " which uses FWItemTVirtualCollectionProxyAccessor."
116  << std::endl;
117 
118  return boost::shared_ptr<FWItemAccessorBase>(
120  boost::shared_ptr<TVirtualCollectionProxy>(member->GetCollectionProxy()->Generate()),
121  offset));
122  }
123 
124  // Iterate on the available plugins and use the one which handles
125  // the iClass type.
126  // NOTE: This is done only a few times, not really performance critical.
127  // If you want this to be fast, the loop can be moved in the
128  // constructor. Notice that this will require constructing FWEventItemsManager
129  // after the plugin manager (i.e. invoking AutoLibraryLoader::enable()) is configured
130  // (i.e. invoking AutoLibraryLoader::enable()) in CmsShowMain.
131  std::string accessorName;
132  if (hasAccessor(iClass, accessorName))
133  {
134  if (debug)
135  fwLog(fwlog::kDebug) << "class " << iClass->GetName() << " uses "
136  << accessorName << "." << std::endl;
137  return boost::shared_ptr<FWItemAccessorBase>(FWItemAccessorRegistry::get()->create(accessorName, iClass));
138  }
139 
140  return boost::shared_ptr<FWItemAccessorBase>(new FWItemSingleAccessor(iClass));
141 }
142 
146 bool
148 {
149  // Check if this is a collection known by ROOT but also that the item held by
150  // the colletion actually has a dictionary
151  return iClass &&
152  iClass->GetCollectionProxy() &&
153  iClass->GetCollectionProxy()->GetValueClass() &&
154  iClass->GetCollectionProxy()->GetValueClass()->IsLoaded();
155 }
156 
168 bool
170  TClass *&oMember,
171  size_t& oOffset)
172 {
173  assert(iClass->GetTypeInfo());
174  edm::TypeWithDict dataType(*(iClass->GetTypeInfo()));
175  assert(bool(dataType));
176 
177  // If the object has more than one data member, we avoid guessing.
178  edm::TypeDataMembers members(dataType);
179  if (members.size() != 1)
180  return false;
181 
182  edm::MemberWithDict member(*members.begin());
183  edm::TypeWithDict memType(member.typeOf());
184  assert(bool(memType));
185  oMember = TClass::GetClass(memType.typeInfo());
186  oOffset = member.offset();
187 
188  // Check if this is a collection known by ROOT but also that the item held by
189  // the colletion actually has a dictionary
190 
191  if (!hasTVirtualCollectionProxy(oMember))
192  return false;
193 
194  return true;
195 }
196 
204 bool
206 {
207  const std::vector<edmplugin::PluginInfo> &available
208  = edmplugin::PluginManager::get()->categoryToInfos().find("cmsShow FWItemAccessorBase")->second;
209 
210  for (size_t i = 0, e = available.size(); i != e; ++i)
211  {
212  std::string name = available[i].name_;
213  std::string type = name.substr(0, name.find_first_of('@'));
214  if (iClass->GetTypeInfo()->name() == type)
215  {
216  result.swap(name);
217  return true;
218  }
219  }
220  return false;
221 }
222 
229 {
230  std::string accessorName;
231  TClass *member = 0;
232  size_t offset=0;
233 
234  // This is pretty much the same thing that happens
237  || FWItemAccessorFactory::hasAccessor(iClass, accessorName));
238 }
239 
240 //
241 // static member functions
242 //
const CategoryToInfos & categoryToInfos() const
Definition: PluginManager.h:82
type
Definition: HCALResponse.h:21
int i
Definition: DBlmapReader.cc:9
IterWithDict< TDataMember > begin() const
static bool classAccessedAsCollection(const TClass *)
size_t size() const
tuple result
Definition: query.py:137
unsigned int offset(bool)
#define debug
Definition: HDRShower.cc:19
#define fwLog(_level_)
Definition: fwLog.h:50
static bool hasTVirtualCollectionProxy(const TClass *iClass)
static bool hasMemberTVirtualCollectionProxy(const TClass *iClass, TClass *&oMember, size_t &oOffset)
static bool hasAccessor(const TClass *iClass, std::string &result)
static PluginManager * get()
boost::shared_ptr< FWItemAccessorBase > accessorFor(const TClass *) const
T get(const Candidate &c)
Definition: component.h:55