diff --git a/reflex/inc/Reflex/Builder/CollectionProxy.h b/reflex/inc/Reflex/Builder/CollectionProxy.h index fb5c4d5b51afae8be9c7122362932dc4db8caa45..02d4b62e7989289484dd74c7276d8e4a750e4ec3 100644 --- a/reflex/inc/Reflex/Builder/CollectionProxy.h +++ b/reflex/inc/Reflex/Builder/CollectionProxy.h @@ -1,4 +1,4 @@ -// @(#)root/reflex:$Name: $:$Id: CollectionProxy.h,v 1.8 2005/12/13 09:59:39 roiser Exp $ +// @(#)root/reflex:$Name: $:$Id: CollectionProxy.h,v 1.9 2005/12/13 10:00:42 roiser Exp $ // Author: Markus Frank 2004 // Copyright CERN, CH-1211 Geneva 23, 2004-2005, All rights reserved. @@ -199,7 +199,7 @@ namespace ROOT { /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h * * Small helper to encapsulate all necessary data accesses for - * containers like Set, multiset etc. + * containers like set, multiset etc. * * @author M.Frank * @version 1.0 @@ -358,7 +358,7 @@ namespace ROOT { return CFTGenerator<Pushback<std::deque<T,A> > >::Generate(); } }; - // Specialization for std::Set + // Specialization for std::set template <class K, class T, class A> struct Proxy< std::set<K,T,A> > { static CollFuncTable* Generate() { return CFTGenerator<Insert<std::set<K,T,A> > >::Generate(); diff --git a/reflex/python/genreflex/gendict.py b/reflex/python/genreflex/gendict.py index 968e07bc5bc3375f86d05b54b44b9f3a0e363ad5..2f2ee9e5cfed240a20beceededcfb4cd32f113b9 100644 --- a/reflex/python/genreflex/gendict.py +++ b/reflex/python/genreflex/gendict.py @@ -515,16 +515,16 @@ class genDictionary(object) : #---------------------------------------------------------------------------------- def checkAccessibleType( self, type ): while type['elem'] in ('PointerType','Typedef') : type = self.xref[type['attrs']['type']] - typeAttrs = type['attrs'] - if typeAttrs.has_key('access') and typeAttrs['access'] in ('private','protected') : return type['attrs']['id'] + attrs = type['attrs'] + if 'access' in attrs and attrs['access'] in ('private','protected') : return attrs['id'] + if 'context' in attrs and self.checkAccessibleType(self.xref[attrs['context']]) : return attrs['id'] return 0 #---------------------------------------------------------------------------------- def genClassShadow(self, attrs, inner = 0 ) : + inner_shadows = {} bases = self.getBases( attrs['id'] ) - if inner : cls = attrs['name'] - else : cls = self.genTypeName(attrs['id']) + cls = self.genTypeName(attrs['id'],const=True,colon=True) clt = string.translate(str(cls), self.transtable) - self.generated_shadow_classes.append(clt) typ = self.xref[attrs['id']]['elem'].lower() indent = inner * 2 * ' ' if typ == 'enumeration' : @@ -547,24 +547,32 @@ class genDictionary(object) : memList = members.split() for m in memList : member = self.xref[m] - if member['elem'] in ('Class','Struct'): - c += self.genClassShadow(member['attrs'], inner + 1) + if member['elem'] in ('Class','Struct','Union','Enumeration') \ + and 'access' in member['attrs'] \ + and member['attrs']['access'] in ('private','protected') : + cmem = self.genTypeName(member['attrs']['id'],const=True,colon=True) + if cmem != cls and cmem not in inner_shadows : + inner_shadows[cmem] = string.translate(str(cmem), self.transtable) + c += self.genClassShadow(member['attrs'], inner + 1) for m in memList : member = self.xref[m] if member['elem'] in ('Field',) : a = member['attrs'] t = self.genTypeName(a['type'],colon=True,const=True) + #---- Check for non public types------------------------ noPublicType = self.checkAccessibleType(self.xref[a['type']]) if ( noPublicType ): noPubTypeAttrs = self.xref[noPublicType]['attrs'] - tend = '' - while t[-1] in ('*','&') : - tend = tend + t[-1] - t = t[:-1] - t = string.translate(str(t), self.transtable)[2:] - t += tend - if ( string.translate(str(self.genTypeName(noPubTypeAttrs['id'])), self.transtable) not in self.generated_shadow_classes ): - c += self.genClassShadow(noPubTypeAttrs) + cmem = self.genTypeName(noPubTypeAttrs['id'],const=True,colon=True) + if cmem != cls and cmem not in inner_shadows : + inner_shadows[cmem] = string.translate(str(cmem), self.transtable) + c += self.genClassShadow(noPubTypeAttrs, inner + 1) + #---- translate the type with the inner shadow type----- + ikeys = inner_shadows.keys() + ikeys.sort(lambda x,y : len(y) - len(x)) + for ikey in ikeys : + if t.find(ikey) == 0 : t = t.replace(ikey, inner_shadows[ikey]) # change current class by shadow name + elif t.find(ikey[2:]) != -1 : t = t.replace(ikey[2:], inner_shadows[ikey]) # idem without leading :: if t[-1] == ']' : c += indent + ' %s %s;\n' % ( t[:t.find('[')], a['name']+t[t.find('['):] ) elif t.find(')(') != -1 : c += indent + ' %s;\n' % ( t.replace(')(', ' %s)('%a['name'])) else : c += indent + ' %s %s;\n' % ( t, a['name'] ) @@ -891,7 +899,7 @@ class genDictionary(object) : if self.selector : xattrs = self.selector.selfield( cls,name) else : xattrs = None mod = self.genModifier(attrs,xattrs) - shadow = '__shadow__::' + string.translate( str(cls), self.transtable) + shadow = '__shadow__::' + string.translate( str(cl), self.transtable) c = ' .AddDataMember(%s, "%s", OffsetOf(%s, %s), %s)' % (self.genTypeID(attrs['type']), name, shadow, name, mod) c += self.genCommentProperty(attrs) # Other properties @@ -1153,7 +1161,7 @@ class genDictionary(object) : 'access' not in self.xref[m]['attrs'] and not self.isDestructorNonPublic(attrs['id']): # NewDel functions extra function id = u'_x%d' % self.x_id.next() - new_attrs = { 'id':id, 'context':attrs['id'] } + new_attrs = { 'id':id, 'context':attrs['id'], 'artificial':'true' } self.xref[id] = {'elem':'GetNewDelFunctions', 'attrs':new_attrs,'subelems':[] } attrs['members'] += u' ' + id # Bases extra function @@ -1212,7 +1220,8 @@ class genDictionary(object) : def genGetNewDelFunctionsDecl( self, attrs, args ) : return 'static void* method%s( void*, const std::vector<void*>&, void* ); ' % (attrs['id']) def genGetNewDelFunctionsBuild( self, attrs, args ) : - return ' .AddFunctionMember<void*(void)>("__getNewDelFunctions", method%s)' % (attrs['id']) + mod = self.genModifier(attrs, None) + return ' .AddFunctionMember<void*(void)>("__getNewDelFunctions", method%s, 0, 0, %s)' % (attrs['id'], mod) def genGetNewDelFunctionsDef( self, attrs, args ) : cid = attrs['context'] cl = self.genTypeName(cid, colon=True) @@ -1258,6 +1267,9 @@ class genDictionary(object) : if 'members' in attrs : members = attrs['members'].split() else : members = [] cid = attrs['id'] + for c in self.classes : + if c['context'] == cid and c['id'] not in members : + attrs['members'] += u' ' + c['id'] for m in self.methods : if m['context'] == cid and m['id'] not in members : # replace the mame by the complete templated name. Use the demangle module for that