2010-05-10 14 views
6

recientemente Empecé a utilizar el excelente boost :: unordered_map en mi sistema, pero tengo un inconveniente: no pude entender cómo inspeccionar su contenido. Imprimirlo en gdb me da table_ y a buckets_, pero no he encontrado dónde están los artículos. Alguien tiene una pista sobre esto?Bonito aumento de impresión :: unordered_map en gdb

Respuesta

10

Para los que querían una impresora, he logrado crear una. Aquí es Código:

class BoostUnorderedMapPrinter: 
    "prints a boost::unordered_map" 

    class _iterator: 
     def __init__ (self, fields): 
      type_1 = fields.val.type.template_argument(0) 
      type_2 = fields.val.type.template_argument(1) 
      self.buckets = fields.val['table_']['buckets_'] 
      self.bucket_count = fields.val['table_']['bucket_count_'] 
      self.current_bucket = 0 
      pair = "std::pair<%s const, %s>" % (type_1, type_2) 
      self.pair_pointer = gdb.lookup_type(pair).pointer() 
      self.base_pointer = gdb.lookup_type("boost::unordered_detail::value_base< %s >" % pair).pointer() 
      self.node_pointer = gdb.lookup_type("boost::unordered_detail::hash_node<std::allocator< %s >, boost::unordered_detail::ungrouped>" % pair).pointer() 
      self.node = self.buckets[self.current_bucket]['next_'] 

     def __iter__(self): 
      return self 

     def next(self): 
      while not self.node: 
       self.current_bucket = self.current_bucket + 1 
       if self.current_bucket >= self.bucket_count: 
        raise StopIteration 
       self.node = self.buckets[self.current_bucket]['next_'] 

      iterator = self.node.cast(self.node_pointer).cast(self.base_pointer).cast(self.pair_pointer).dereference() 
      self.node = self.node['next_'] 

      return ('%s' % iterator['first'], iterator['second']) 

    def __init__(self, val): 
     self.val = val 

    def children(self): 
     return self._iterator(self) 

    def to_string(self): 
     return "boost::unordered_map" 
+10

que sé Estoy un poco retrasado, pero ¿cómo puedo cargar (y usar) esta bonita impresora en GDB? –

+2

Gracias por publicar esto. No funciona para versiones posteriores (he probado en 1.58+), pero lo tomé y lo actualicé esta mañana para trabajar con 1.58. Después de un poco más de tiempo de vuelo contribuiré con una solicitud de extracción a https://github.com/ruediger/Boost-Pretty-Printer si te parece bien. –

2

En una implementación de tabla hash típica, los depósitos contienen el encabezado de una lista vinculada que en realidad contiene los valores correspondientes a este hash en particular. Por lo tanto, apostaría por buckets_.

Otra opción: ahora hay varias bibliotecas de impresoras lindas de python para gdb, y creo que podría encontrar una que funcione con C++ 0x e inspeccionar dónde busca los valores.

+0

Claro, yo he comprobado aplicación gcc TR1 y las estructuras son bastante diferentes, y una sustitución no es bueno porque he encontrado aplicación impulso a ser más rápido que la contraparte TR1 – scooterman

Cuestiones relacionadas