diff --git a/Control/CLIDComps/src/ClassIDSvc.cxx b/Control/CLIDComps/src/ClassIDSvc.cxx index ad4796efdaa50188646478fd18605331d5a6d236..f95d037bca4d98b63e1289e644e8c52c9b2ddcca 100644 --- a/Control/CLIDComps/src/ClassIDSvc.cxx +++ b/Control/CLIDComps/src/ClassIDSvc.cxx @@ -32,6 +32,15 @@ namespace { boost::replace_all(s, string(";"), string()); } + bool tryNumeric (const std::string& s, CLID& clid) + { + clid = CLID_NULL; + char* endptr = nullptr; + clid = strtol (s.c_str(), &endptr, 10); + return clid != CLID_NULL && endptr == (s.c_str() + s.size()); + } + + // HACK LIFTED FROM AthenaBaseComps/AthMsgStreamMacros.h to remove dep loop #define ATH_MSG_LVL(lvl, x) \ do { \ @@ -358,6 +367,10 @@ ClassIDSvc::getIDOfTypeNameInternal(const std::string& typeName, CLID& id) const ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") CLID is " << id); sc = StatusCode::SUCCESS; } + else if (tryNumeric (typeName, id)) { + ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") is a numeric CLID"); + sc = StatusCode::SUCCESS; + } else { ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") no associated CLID found " ); } diff --git a/Control/CLIDComps/test/ClassIDSvc_test.cxx b/Control/CLIDComps/test/ClassIDSvc_test.cxx index 2f3205aba1ff33dbf2cc5a538a392fb04c324c9c..21e4a8729189504bb5f9fe92139f911a9aac9c22 100644 --- a/Control/CLIDComps/test/ClassIDSvc_test.cxx +++ b/Control/CLIDComps/test/ClassIDSvc_test.cxx @@ -105,6 +105,8 @@ void basic_test(ISvcLocator* pSvcLoc) { assert(pClassIDSvc->getIDOfTypeName("Blu", id).isSuccess()); assert(id == 9943); assert(pClassIDSvc->getIDOfTypeName("NotExist", id).isFailure()); + assert(pClassIDSvc->getIDOfTypeName("12345", id).isSuccess()); + assert(id == 12345); assert(pClassIDSvc->isIDInUse(9942)); // assert(!pClassIDSvc->isIDInUse(9945));