2010-05-10 15 views
6

पर unordered_map हाल ही में मैंने अपने सिस्टम पर उत्कृष्ट बढ़ावा :: unordered_map का उपयोग करना शुरू कर दिया है, लेकिन एक दोष मिला: मैं यह नहीं समझ सका कि इसकी सामग्री का निरीक्षण कैसे किया जाए। इसे जीडीबी पर प्रिंट करना मुझे टेबल_ और बाल्टी_ देता है, लेकिन यह नहीं मिला कि आइटम कहां हैं। किसी के बारे में कोई सुराग है?सुंदर प्रिंटिंग बूस्ट :: gdb

उत्तर

10

प्रिंटर चाहते थे, मैं एक बनाने में कामयाब रहा है। यहाँ कोड है:

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

मुझे पता है की तुलना में होने के लिए नहीं है मुझे थोड़ा देर हो चुकी है, लेकिन मैं जीडीबी में इस सुंदर प्रिंटर को कैसे लोड (और उपयोग) कर सकता हूं? –

+2

इसे पोस्ट करने के लिए धन्यवाद। यह बाद के संस्करणों के लिए काम नहीं करता है (मैंने 1.58+ पर परीक्षण किया है), लेकिन मैंने इसे लिया और इसे आज सुबह 1.58 के साथ काम करने के लिए अपडेट किया। थोड़ी अधिक उड़ान के समय के बाद मैं https://github.com/ruediger/Boost-Pretty- प्रिंटर को पुल अनुरोध का योगदान दूंगा यदि यह आपके साथ ठीक है। –

2

एक विशिष्ट हैश तालिका कार्यान्वयन में, बाल्टी में एक लिंक्ड सूची का सिर होता है जिसमें वास्तव में इस विशेष हैश से संबंधित मान होते हैं। इस प्रकार मैं buckets_ पर शर्त लगाऊंगा।

एक और विकल्प: अब gdb के लिए विभिन्न पायथन सुंदर प्रिंटर लाइब्रेरी हैं, और मुझे लगता है कि आप सी ++ 0x के साथ काम करने वाले एक को ढूंढ सकते हैं और यह मान सकते हैं कि यह मूल्यों को कहां देखता है।

+0

ज़रूर, मैं देख लिया है जीसीसी tr1 कार्यान्वयन और संरचनाओं बहुत अलग हैं, और एक की जगह अच्छा है क्योंकि मैं मिल गया है को बढ़ावा देने कार्यान्वयन तेजी से tr1 समकक्ष – scooterman