File indexing completed on 2024-04-06 12:11:41
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 assert(bool(memType));
0163 oMember = TClass::GetClass(memType.typeInfo());
0164 oOffset = member.offset();
0165
0166
0167
0168
0169 if (!hasTVirtualCollectionProxy(oMember))
0170 return false;
0171
0172 return true;
0173 }
0174
0175
0176
0177
0178
0179
0180
0181
0182 bool FWItemAccessorFactory::hasAccessor(const TClass *iClass, std::string &result) {
0183 const std::vector<edmplugin::PluginInfo> &available =
0184 edmplugin::PluginManager::get()->categoryToInfos().find("cmsShow FWItemAccessorBase")->second;
0185
0186 for (size_t i = 0, e = available.size(); i != e; ++i) {
0187 std::string name = available[i].name_;
0188 std::string type = name.substr(0, name.find_first_of('@'));
0189 if (iClass->GetTypeInfo()->name() == type) {
0190 result.swap(name);
0191 return true;
0192 }
0193 }
0194 return false;
0195 }
0196
0197
0198
0199
0200
0201
0202 bool FWItemAccessorFactory::classAccessedAsCollection(const TClass *iClass) {
0203 std::string accessorName;
0204 TClass *member = nullptr;
0205 size_t offset = 0;
0206
0207
0208 return (FWItemAccessorFactory::hasTVirtualCollectionProxy(iClass) ||
0209 FWItemAccessorFactory::hasMemberTVirtualCollectionProxy(iClass, member, offset) ||
0210 FWItemAccessorFactory::hasAccessor(iClass, accessorName));
0211 }
0212
0213
0214
0215