2010-05-10 26 views
6

gần đây tôi đã bắt đầu sử dụng boost tuyệt vời :: unordered_map trên hệ thống của tôi, nhưng có một nhược điểm: Tôi không thể tìm cách kiểm tra nội dung của nó. In nó trên gdb cho tôi một table_ và một buckets_, nhưng không tìm thấy đâu là các mục. Bất cứ ai cũng có một đầu mối về điều này?Pretty printing boost :: unordered_map trên gdb

Trả lời

10

Đối với những người muốn có máy in, tôi đã quản lý để tạo một máy in. Dưới đây là Code:

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

tôi biết Tôi trễ một chút, nhưng làm cách nào để tải (và sử dụng) máy in đẹp này trong GDB? –

+2

Cảm ơn bạn đã đăng bài này. Nó không hoạt động cho các phiên bản sau (tôi đã thử nghiệm trên 1,58+), nhưng tôi đã lấy nó và cập nhật nó vào sáng nay để làm việc với 1.58. Sau một ít thời gian bay, tôi sẽ đóng góp một yêu cầu kéo đến https://github.com/ruediger/Boost-Pretty-Printer nếu điều đó ổn với bạn. –

2

Trong triển khai bảng băm điển hình, các nhóm chứa đầu của danh sách được liên kết thực sự chứa các giá trị tương ứng với băm cụ thể này. Do đó tôi sẽ đặt cược vào buckets_.

Tùy chọn khác: có nhiều thư viện máy in khá tốt cho gdb bây giờ, và tôi nghĩ bạn có thể tìm một thư viện hoạt động với C++ 0x và kiểm tra xem nó tìm kiếm giá trị ở đâu.

+0

Chắc chắn, tôi đã kiểm tra thực hiện gcc TR1 và các cấu trúc là khá khác nhau, và một thay thế là không tốt bởi vì tôi đã tìm thấy thúc đẩy thực hiện là nhanh hơn so với người đồng nhiệm tr1 – scooterman

Các vấn đề liên quan