xmethods.py: Add xmethods for associative containers.
authorSiva Chandra Reddy <sivachandra@google.com>
Tue, 11 Nov 2014 11:35:34 +0000 (11:35 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 11 Nov 2014 11:35:34 +0000 (11:35 +0000)
2014-11-11  Siva Chandra Reddy  <sivachandra@google.com>

* python/libstdcxx/v6/xmethods.py: Add xmethods for associative
containers.
* testsuite/libstdc++-xmethods/associative-containers.cc: New file.

From-SVN: r217344

libstdc++-v3/ChangeLog
libstdc++-v3/python/libstdcxx/v6/xmethods.py

index 2a8fb6c239fd445a139f0798dcbe723451739f94..dd810a9c3901beaf2e41773010ad2f853b4f8f07 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-11  Siva Chandra Reddy  <sivachandra@google.com>
+
+       * python/libstdcxx/v6/xmethods.py: Add xmethods for associative
+       containers.
+       * testsuite/libstdc++-xmethods/associative-containers.cc: New file.
+
 2014-11-11  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/63811
index 6af1c95bc28702eea0a014542f6a800858c4d321..2198411dcfdc4cc26cad3237ff0c0dae83da32fb 100644 (file)
@@ -422,6 +422,50 @@ class VectorMethodsMatcher(gdb.xmethod.XMethodMatcher):
             return None
         return method.worker_class(class_type.template_argument(0))
 
+# Xmethods for associative containers
+
+class AssociativeContainerWorkerBase(gdb.xmethod.XMethodWorker):
+    def __init__(self, unordered):
+        self._unordered = unordered
+
+    def node_count(self, obj):
+        if self._unordered:
+            return obj['_M_h']['_M_element_count']
+        else:
+            return obj['_M_t']['_M_impl']['_M_node_count']
+
+    def get_arg_types(self):
+        return None
+
+class AssociativeContainerEmptyWorker(AssociativeContainerWorkerBase):
+    def __call__(self, obj):
+        return int(self.node_count(obj)) == 0
+
+class AssociativeContainerSizeWorker(AssociativeContainerWorkerBase):
+    def __call__(self, obj):
+        return self.node_count(obj)
+
+class AssociativeContainerMethodsMatcher(gdb.xmethod.XMethodMatcher):
+    def __init__(self, name):
+        gdb.xmethod.XMethodMatcher.__init__(self,
+                                            matcher_name_prefix + name)
+        self._name = name
+        self._method_dict = {
+            'size': LibStdCxxXMethod('size', AssociativeContainerSizeWorker),
+            'empty': LibStdCxxXMethod('empty',
+                                      AssociativeContainerEmptyWorker),
+        }
+        self.methods = [self._method_dict[m] for m in self._method_dict]
+
+    def match(self, class_type, method_name):
+        if not re.match('^std::%s<.*>$' % self._name, class_type.tag):
+            return None
+        method = self._method_dict.get(method_name)
+        if method is None or not method.enabled:
+            return None
+        unordered = 'unordered' in self._name
+        return method.worker_class(unordered)
+
 # Xmethods for std::unique_ptr
 
 class UniquePtrGetWorker(gdb.xmethod.XMethodWorker):
@@ -465,4 +509,20 @@ def register_libstdcxx_xmethods(locus):
     gdb.xmethod.register_xmethod_matcher(locus, DequeMethodsMatcher())
     gdb.xmethod.register_xmethod_matcher(locus, ListMethodsMatcher())
     gdb.xmethod.register_xmethod_matcher(locus, VectorMethodsMatcher())
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('set'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('map'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('multiset'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('multimap'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('unordered_set'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('unordered_map'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('unordered_multiset'))
+    gdb.xmethod.register_xmethod_matcher(
+        locus, AssociativeContainerMethodsMatcher('unordered_multimap'))
     gdb.xmethod.register_xmethod_matcher(locus, UniquePtrMethodsMatcher())