Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:01:19

0001 // -*- C++ -*-
0002 //
0003 // Package:     Utilities
0004 // Class  :     findDataMember
0005 //
0006 // Implementation:
0007 //     <Notes on implementation>
0008 //
0009 // Original Author:  Chris Jones
0010 //         Created:  Wed Aug 13 10:07:46 EDT 2008
0011 // $Id: findDataMember.cc,v 1.3 2012/08/03 18:08:11 wmtan Exp $
0012 //
0013 
0014 // system include files
0015 #include "TInterpreter.h"
0016 #include "TVirtualMutex.h"
0017 
0018 #include "FWCore/Reflection/interface/BaseWithDict.h"
0019 
0020 // user include files
0021 #include "CommonTools/Utils/src/findDataMember.h"
0022 #include "CommonTools/Utils/src/ErrorCodes.h"
0023 
0024 //
0025 // constants, enums and typedefs
0026 //
0027 
0028 namespace reco {
0029 
0030   edm::MemberWithDict findDataMember(const edm::TypeWithDict& iType, const std::string& iName, int& oError) {
0031     edm::MemberWithDict ret;
0032     oError = parser::kNameDoesNotExist;
0033     edm::TypeWithDict type = iType;
0034     if (!bool(type)) {
0035       return ret;
0036     }
0037     if (type.isPointer()) {
0038       type = type.toType();
0039     }
0040     ret = type.dataMemberByName(iName);
0041     if (!bool(ret)) {
0042       // check base classes
0043       edm::TypeBases bases(type);
0044       for (auto const& B : bases) {
0045         ret = findDataMember(edm::BaseWithDict(B).typeOf(), iName, oError);
0046         //only stop if we found it or some other error happened
0047         if (bool(ret) || (oError != parser::kNameDoesNotExist)) {
0048           break;
0049         }
0050       }
0051     }
0052     if (bool(ret) && !ret.isPublic()) {
0053       ret = edm::MemberWithDict();
0054       oError = parser::kIsNotPublic;
0055     } else if (bool(ret)) {
0056       oError = parser::kNoError;
0057     }
0058     return ret;
0059   }
0060 
0061 }  // namespace reco