File indexing completed on 2025-09-12 09:59:50
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <iostream>
0015 #include "TClass.h"
0016 #include "TVirtualCollectionProxy.h"
0017 #include "FWCore/Reflection/interface/TypeWithDict.h"
0018 #include "FWCore/Reflection/interface/MemberWithDict.h"
0019
0020
0021 #include "Fireworks/Core/interface/FWItemAccessorFactory.h"
0022 #include "Fireworks/Core/interface/FWItemAccessorRegistry.h"
0023 #include "Fireworks/Core/src/FWItemTVirtualCollectionProxyAccessor.h"
0024 #include "Fireworks/Core/interface/FWItemSingleAccessor.h"
0025 #include "Fireworks/Core/interface/fwLog.h"
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 FWItemAccessorFactory::FWItemAccessorFactory() {}
0039
0040
0041
0042
0043
0044
0045 FWItemAccessorFactory::~FWItemAccessorFactory() {}
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089 std::shared_ptr<FWItemAccessorBase> FWItemAccessorFactory::accessorFor(const TClass *iClass) const {
0090 static const bool debug = false;
0091
0092 TClass *member = nullptr;
0093 size_t offset = 0;
0094
0095 if (hasTVirtualCollectionProxy(iClass)) {
0096 if (debug)
0097 fwLog(fwlog::kDebug) << "class " << iClass->GetName() << " uses FWItemTVirtualCollectionProxyAccessor."
0098 << std::endl;
0099 return std::make_shared<FWItemTVirtualCollectionProxyAccessor>(
0100 iClass, std::shared_ptr<TVirtualCollectionProxy>(iClass->GetCollectionProxy()->Generate()));
0101 }
0102
0103
0104
0105
0106
0107
0108
0109
0110 std::string accessorName;
0111 if (hasAccessor(iClass, accessorName)) {
0112 if (debug)
0113 fwLog(fwlog::kDebug) << "class " << iClass->GetName() << " uses " << accessorName << "." << std::endl;
0114 return std::shared_ptr<FWItemAccessorBase>(FWItemAccessorRegistry::get()->create(accessorName, iClass));
0115 }
0116
0117 if (hasMemberTVirtualCollectionProxy(iClass, member, offset)) {
0118 if (debug)
0119 fwLog(fwlog::kDebug) << "class " << iClass->GetName() << " only contains data member " << member->GetName()
0120 << " which uses FWItemTVirtualCollectionProxyAccessor." << std::endl;
0121
0122 return std::make_shared<FWItemTVirtualCollectionProxyAccessor>(
0123 iClass, std::shared_ptr<TVirtualCollectionProxy>(member->GetCollectionProxy()->Generate()), offset);
0124 }
0125
0126 return std::make_shared<FWItemSingleAccessor>(iClass);
0127 }
0128
0129
0130
0131
0132 bool FWItemAccessorFactory::hasTVirtualCollectionProxy(const TClass *iClass) {
0133
0134
0135 return iClass && iClass->GetCollectionProxy() && iClass->GetCollectionProxy()->GetValueClass() &&
0136 iClass->GetCollectionProxy()->GetValueClass()->IsLoaded();
0137 }
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 bool FWItemAccessorFactory::hasMemberTVirtualCollectionProxy(const TClass *iClass, TClass *&oMember, size_t &oOffset) {
0151 assert(iClass->GetTypeInfo());
0152 edm::TypeWithDict dataType(*(iClass->GetTypeInfo()));
0153 assert(bool(dataType));
0154
0155
0156 edm::TypeDataMembers members(dataType);
0157 if (members.size() != 1)
0158 return false;
0159
0160 edm::MemberWithDict member(*members.begin());
0161 edm::TypeWithDict memType(member.typeOf());
0162
0163 if (bool(memType) == false) {
0164 fwLog(fwlog::kDebug) << "FWItemAccessorFactory::hasMemberTVirtualCollectionProxy memtype not exhisiting "
0165 << iClass->GetName() << "\n";
0166 return false;
0167 }
0168 if (memType.invalidTypeInfo()) {
0169 fwLog(fwlog::kDebug) << "FWItemAccessorFactory::hasMemberTVirtualCollectionProxy class " << iClass->GetName()
0170 << " has invalid member type." << std::endl
0171 << memType << "\n";
0172 return false;
0173 }
0174
0175 oMember = TClass::GetClass(memType.typeInfo());
0176 oOffset = member.offset();
0177
0178
0179
0180
0181 if (!hasTVirtualCollectionProxy(oMember))
0182 return false;
0183
0184 return true;
0185 }
0186
0187
0188
0189
0190
0191
0192
0193
0194 bool FWItemAccessorFactory::hasAccessor(const TClass *iClass, std::string &result) {
0195 const std::vector<edmplugin::PluginInfo> &available =
0196 edmplugin::PluginManager::get()->categoryToInfos().find("cmsShow FWItemAccessorBase")->second;
0197
0198 for (size_t i = 0, e = available.size(); i != e; ++i) {
0199 std::string name = available[i].name_;
0200 std::string type = name.substr(0, name.find_first_of('@'));
0201 if (iClass->GetTypeInfo()->name() == type) {
0202 result.swap(name);
0203 return true;
0204 }
0205 }
0206 return false;
0207 }
0208
0209
0210
0211
0212
0213
0214 bool FWItemAccessorFactory::classAccessedAsCollection(const TClass *iClass) {
0215 std::string accessorName;
0216 TClass *member = nullptr;
0217 size_t offset = 0;
0218
0219
0220 return (FWItemAccessorFactory::hasTVirtualCollectionProxy(iClass) ||
0221 FWItemAccessorFactory::hasMemberTVirtualCollectionProxy(iClass, member, offset) ||
0222 FWItemAccessorFactory::hasAccessor(iClass, accessorName));
0223 }
0224
0225
0226
0227