CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions
FWItemAccessorFactory Class Reference

#include <Fireworks/Core/interface/FWItemAccessorFactory.h>

Public Member Functions

boost::shared_ptr
< FWItemAccessorBase
accessorFor (const TClass *) const
 
 FWItemAccessorFactory ()
 
virtual ~FWItemAccessorFactory ()
 

Static Public Member Functions

static bool classAccessedAsCollection (const TClass *)
 
static bool hasAccessor (const TClass *iClass, std::string &result)
 
static bool hasMemberTVirtualCollectionProxy (const TClass *iClass, TClass *&oMember, size_t &oOffset)
 
static bool hasTVirtualCollectionProxy (const TClass *iClass)
 

Private Member Functions

 FWItemAccessorFactory (const FWItemAccessorFactory &)
 
const FWItemAccessorFactoryoperator= (const FWItemAccessorFactory &)
 

Detailed Description

Description: Factory for constructing FWItemAccessorBases appropriate to a certain type

Usage: <usage>

Definition at line 31 of file FWItemAccessorFactory.h.

Constructor & Destructor Documentation

FWItemAccessorFactory::FWItemAccessorFactory ( )

Definition at line 38 of file FWItemAccessorFactory.cc.

39 {
40 }
FWItemAccessorFactory::~FWItemAccessorFactory ( )
virtual

Definition at line 47 of file FWItemAccessorFactory.cc.

48 {
49 }
FWItemAccessorFactory::FWItemAccessorFactory ( const FWItemAccessorFactory )
private

Member Function Documentation

boost::shared_ptr< FWItemAccessorBase > FWItemAccessorFactory::accessorFor ( const TClass *  iClass) const

Create an accessor for a given type iClass.

iClass the type for which we need an accessor.

If the type is known to ROOT to be some sort of collection, we return the a FWItemTVirtualCollectionProxyAccessor constructed using the associated TVirtualCollectionProxy.

If above is not true, we lookup the plugin based FWItemAccessorRegistry for a plugin that can handle the given type.

If the type is not a collection but it contains only one element which is a collection, we return a FWItemTVirtualCollectionProxyAccessor using the TVirtualCollectionProxy of that element.

Failing that, we return a FWItemSingleAccessor which threats the object as if it was not a collection. Notice that this also will mean that the product associated to iClass will not show up in the "Add Collection" table.

Definition at line 94 of file FWItemAccessorFactory.cc.

References debug, fwLog, reco::get(), hasAccessor(), hasMemberTVirtualCollectionProxy(), hasTVirtualCollectionProxy(), fwlog::kDebug, hltrates_dqm_sourceclient-live_cfg::offset, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by FWSimpleRepresentationChecker::infoFor().

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 
111  // Iterate on the available plugins and use the one which handles
112  // the iClass type.
113  // NOTE: This is done only a few times, not really performance critical.
114  // If you want this to be fast, the loop can be moved in the
115  // constructor. Notice that this will require constructing FWEventItemsManager
116  // after the plugin manager (i.e. invoking FWLiteEnabler::enable()) is configured
117  // (i.e. invoking FWLiteEnabler::enable()) in CmsShowMain.
118  std::string accessorName;
119  if (hasAccessor(iClass, accessorName))
120  {
121  if (debug)
122  fwLog(fwlog::kDebug) << "class " << iClass->GetName() << " uses "
123  << accessorName << "." << std::endl;
124  return boost::shared_ptr<FWItemAccessorBase>(FWItemAccessorRegistry::get()->create(accessorName, iClass));
125  }
126 
127  if (hasMemberTVirtualCollectionProxy(iClass, member,offset))
128  {
129  if (debug)
130  fwLog(fwlog::kDebug) << "class "<< iClass->GetName()
131  << " only contains data member " << member->GetName()
132  << " which uses FWItemTVirtualCollectionProxyAccessor."
133  << std::endl;
134 
135  return boost::shared_ptr<FWItemAccessorBase>(
137  boost::shared_ptr<TVirtualCollectionProxy>(member->GetCollectionProxy()->Generate()),
138  offset));
139  }
140 
141  return boost::shared_ptr<FWItemAccessorBase>(new FWItemSingleAccessor(iClass));
142 }
#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)
T get(const Candidate &c)
Definition: component.h:55
bool FWItemAccessorFactory::classAccessedAsCollection ( const TClass *  iClass)
static

Helper method which checks if the object will be treated as a collection.

Returns
true if this is the case, false otherwise.

Definition at line 229 of file FWItemAccessorFactory.cc.

References hasAccessor(), hasMemberTVirtualCollectionProxy(), hasTVirtualCollectionProxy(), hltrates_dqm_sourceclient-live_cfg::offset, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by FWLiteJobMetadataManager::doUpdate(), and FWFFMetadataManager::doUpdate().

230 {
231  std::string accessorName;
232  TClass *member = 0;
233  size_t offset=0;
234 
235  // This is pretty much the same thing that happens
238  || FWItemAccessorFactory::hasAccessor(iClass, accessorName));
239 }
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)
bool FWItemAccessorFactory::hasAccessor ( const TClass *  iClass,
std::string &  result 
)
static

Helper method which can be used to retrieve the name of the accessor plugin which has to be created for a object of type iClass.

The result is stored in the passed reference result.

Returns
true if the plugin coul be found, false otherwise.

Definition at line 206 of file FWItemAccessorFactory.cc.

References edmplugin::PluginManager::categoryToInfos(), alignCSCRings::e, edmplugin::PluginManager::get(), i, mergeVDriftHistosByStation::name, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by accessorFor(), and classAccessedAsCollection().

207 {
208  const std::vector<edmplugin::PluginInfo> &available
209  = edmplugin::PluginManager::get()->categoryToInfos().find("cmsShow FWItemAccessorBase")->second;
210 
211  for (size_t i = 0, e = available.size(); i != e; ++i)
212  {
213  std::string name = available[i].name_;
214  std::string type = name.substr(0, name.find_first_of('@'));
215  if (iClass->GetTypeInfo()->name() == type)
216  {
217  result.swap(name);
218  return true;
219  }
220  }
221  return false;
222 }
const CategoryToInfos & categoryToInfos() const
Definition: PluginManager.h:82
type
Definition: HCALResponse.h:21
int i
Definition: DBlmapReader.cc:9
tuple result
Definition: query.py:137
static PluginManager * get()
bool FWItemAccessorFactory::hasMemberTVirtualCollectionProxy ( const TClass *  iClass,
TClass *&  oMember,
size_t &  oOffset 
)
static

Helper method which checks if the object has only one data member and if that data memeber can be accessed via a TVirtualCollectionProxy.

oMember a reference to the pointer which will hold the actual TClass of the datamember to be used to build the TVirtualCollectionProxy.

a reference which will hold the offset of the member relative to the beginning address of a class instance.

Returns
true if this is the case, false otherwise.

Definition at line 170 of file FWItemAccessorFactory.cc.

References assert(), edm::TypeDataMembers::begin(), dtTPAnalyzer_cfg::dataType, hasTVirtualCollectionProxy(), and edm::TypeDataMembers::size().

Referenced by accessorFor(), and classAccessedAsCollection().

173 {
174  assert(iClass->GetTypeInfo());
175  edm::TypeWithDict dataType(*(iClass->GetTypeInfo()));
176  assert(bool(dataType));
177 
178  // If the object has more than one data member, we avoid guessing.
180  if (members.size() != 1)
181  return false;
182 
183  edm::MemberWithDict member(*members.begin());
184  edm::TypeWithDict memType(member.typeOf());
185  assert(bool(memType));
186  oMember = TClass::GetClass(memType.typeInfo());
187  oOffset = member.offset();
188 
189  // Check if this is a collection known by ROOT but also that the item held by
190  // the colletion actually has a dictionary
191 
192  if (!hasTVirtualCollectionProxy(oMember))
193  return false;
194 
195  return true;
196 }
assert(m_qm.get())
static bool hasTVirtualCollectionProxy(const TClass *iClass)
bool FWItemAccessorFactory::hasTVirtualCollectionProxy ( const TClass *  iClass)
static

Helper method which

Returns
true if the passes iClass can be accessed via TVirtualCollectionProxy.

Definition at line 148 of file FWItemAccessorFactory.cc.

Referenced by accessorFor(), classAccessedAsCollection(), and hasMemberTVirtualCollectionProxy().

149 {
150  // Check if this is a collection known by ROOT but also that the item held by
151  // the colletion actually has a dictionary
152  return iClass &&
153  iClass->GetCollectionProxy() &&
154  iClass->GetCollectionProxy()->GetValueClass() &&
155  iClass->GetCollectionProxy()->GetValueClass()->IsLoaded();
156 }
const FWItemAccessorFactory& FWItemAccessorFactory::operator= ( const FWItemAccessorFactory )
private