class SharedPointerPrinter:
"Print a shared_ptr or weak_ptr"
class _iterator:
def __init__(self, sharedPointer):
self.sharedPointer = sharedPointer
self.managedValue = sharedPointer.val['_M_ptr']
self.count = 0
def __iter__(self):
return self
def next(self):
if self.managedValue == 0:
raise StopIteration
self.count = self.count + 1
if (self.count == 1):
return ('Managed value', self.managedValue.cast(self.managedValue.dynamic_type).dereference())
else:
raise StopIteration
def __init__ (self, typename, val):
self.typename = typename
self.val = val
def children (self):
return self._iterator(self)
def to_string (self):
state = 'empty'
refcounts = self.val['_M_refcount']['_M_pi']
if refcounts != 0:
usecount = refcounts['_M_use_count']
weakcount = refcounts['_M_weak_count']
if usecount == 0:
state = 'expired, weakcount %d' % weakcount
else:
state = 'usecount %d, weakcount %d' % (usecount, weakcount - 1)
return '%s (%s) to %s' % (self.typename, state, self.val['_M_ptr'])
Y2xhc3MgU2hhcmVkUG9pbnRlclByaW50ZXI6CiAgICAiUHJpbnQgYSBzaGFyZWRfcHRyIG9yIHdlYWtfcHRyIgoKICAgIGNsYXNzIF9pdGVyYXRvcjoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2hhcmVkUG9pbnRlcik6CiAgICAgICAgICAgIHNlbGYuc2hhcmVkUG9pbnRlciA9IHNoYXJlZFBvaW50ZXIKICAgICAgICAgICAgc2VsZi5tYW5hZ2VkVmFsdWUgPSBzaGFyZWRQb2ludGVyLnZhbFsnX01fcHRyJ10KICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi5tYW5hZ2VkVmFsdWUgPT0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCiAgICAgICAgICAgIGlmIChzZWxmLmNvdW50ID09IDEpOgogICAgICAgICAgICAgICAgcmV0dXJuICgnTWFuYWdlZCB2YWx1ZScsIHNlbGYubWFuYWdlZFZhbHVlLmNhc3Qoc2VsZi5tYW5hZ2VkVmFsdWUuZHluYW1pY190eXBlKS5kZXJlZmVyZW5jZSgpKQogICAgICAgICAgICAgICAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCiAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgogICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQogICAgICAgIHNlbGYudmFsID0gdmFsCgogICAgZGVmIGNoaWxkcmVuIChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Ioc2VsZikKCiAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKICAgICAgICBzdGF0ZSA9ICdlbXB0eScKICAgICAgICByZWZjb3VudHMgPSBzZWxmLnZhbFsnX01fcmVmY291bnQnXVsnX01fcGknXQogICAgICAgIGlmIHJlZmNvdW50cyAhPSAwOgogICAgICAgICAgICB1c2Vjb3VudCA9IHJlZmNvdW50c1snX01fdXNlX2NvdW50J10KICAgICAgICAgICAgd2Vha2NvdW50ID0gcmVmY291bnRzWydfTV93ZWFrX2NvdW50J10KICAgICAgICAgICAgaWYgdXNlY291bnQgPT0gMDoKICAgICAgICAgICAgICAgIHN0YXRlID0gJ2V4cGlyZWQsIHdlYWtjb3VudCAlZCcgJSB3ZWFrY291bnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXRlID0gJ3VzZWNvdW50ICVkLCB3ZWFrY291bnQgJWQnICUgKHVzZWNvdW50LCB3ZWFrY291bnQgLSAxKQogICAgICAgIHJldHVybiAnJXMgKCVzKSB0byAlcycgJSAoc2VsZi50eXBlbmFtZSwgc3RhdGUsIHNlbGYudmFsWydfTV9wdHInXSk=