10 __version__ =
"$Revision: 1.12 $"
11 __author__ =
"Sebastien Binet <binet@cern.ch>"
13 simple interface to the rootmap files to easily locate reflex dictionaries \
23 from PyUtils
import Dso
as _Dso
24 from PyUtils.Dso
import _aliases
28 import RootUtils.PyROOTFixes
33 'char',
'unsigned char',
'signed char',
35 'short int',
'short signed',
'short signed int',
36 'short',
'unsigned short',
'signed short',
37 'int',
'unsigned int',
44 'long signed',
'signed long',
73 class DsoDb(_Dso.PyDsoDb):
75 The repository of 'rootmap' files (location, content,...) and a set of
76 operations one can apply on them (load dict, query dicts,...)
79 super(DsoDb, self).
__init__(
'AthenaDsoDb')
80 import AthenaCommon.Logging
81 self.msg = AthenaCommon.Logging.logging.getLogger(
"AthenaDsoDb")
85 for k,v
in _aliases.iteritems():
87 self.db[k] = self.db[v]
89 self.msg.
info(
"could not install alias [%s] -> [%s]", k,v)
93 self._rflx_type = cppyy.gbl.RootType.ByName
96 def has_type (self, typename):
97 if typename
in _cpp_builtins:
100 typename = self._to_rootmap_name (typename)
101 return self.db.has_key (typename)
or \
102 self.pf.has_key (typename)
104 def load_type (self, typename):
105 rflx_type = self.rflx_type(typename)
106 if not(rflx_type
is None):
107 rflx_name = rflx_type.Name(RflxEnums.DICTSCOPE)
112 def rflx_type(self, typename):
113 _rootmap_name = self._to_rootmap_name (typename)
114 _rflx_name = self._to_rflx_name (typename)
115 self.msg.
verbose(
"------- loading type [%s]...", typename)
117 if typename
in _cpp_builtins:
118 self.msg.
verbose(
" ==> [ok] (builtin)")
119 return self._rflx_type (_rflx_name)
121 if not self.has_type (_rootmap_name):
122 self.msg.
verbose(
" ==> [err] (no '%s')",_rootmap_name)
124 libs = (self.db.
get(_rootmap_name)
or
125 self.pf.
get(_rootmap_name))
126 if libs
is None or len(libs) <= 0:
128 from ctypes
import cdll
129 _load = cdll.LoadLibrary
130 from cppyy
import loadDict
as _load
133 _load (os.path.basename(lib.strip()))
134 self.msg.
verbose(
"... %s [done]",lib)
139 rflx_type = self._rflx_type (_rflx_name)
140 if rflx_type.Name() !=
'':
145 def visit(self, typename, visitor=None, ctx=None):
146 self.msg.
verbose(
"=== visiting %s", typename)
149 if isinstance (typename, str):
150 rflx_type = self.load_type (typename)
151 typename = rflx_type.Name (RflxEnums.DICTSCOPE)
156 self.msg.
verbose(
"**warning** no dict for [%s] !!", typename)
163 if rflx_type.IsClass()
or rflx_type.IsStruct():
164 for i
in range(rflx_type.BaseSize()):
165 itype = rflx_type.BaseAt(i).ToType()
166 itype_name = itype.Name(RflxEnums.DICTSCOPE)
167 if itype_name !=
'' and not (itype_name
in ctx):
168 self.load_type (itype_name)
170 ctx.update (self.visit (itype, visitor, ctx))
172 for i
in range(rflx_type.DataMemberSize()):
173 itype = rflx_type.DataMemberAt (i).TypeOf()
174 itype = itype.RawType()
if itype.IsPointer()
else itype
175 itype_name = itype.Name(RflxEnums.DICTSCOPE)
176 if itype_name !=
'' and not (itype_name
in ctx):
177 self.load_type (itype_name)
180 itype = rflx_type.DataMemberAt (i).TypeOf()
181 itype_name = itype.Name(RflxEnums.DICTSCOPE)
182 ctx.update (self.visit (itype, visitor, ctx))
188 registry = _Dso.DsoDb()