From 611894d11cc044ebccf44b2ad2a8a63e07ecbb84 Mon Sep 17 00:00:00 2001 From: fdumont Date: Wed, 15 May 2013 19:39:18 +0000 Subject: [PATCH] =?utf8?q?2013-05-15=20=20Fran=C3=A7ois=20Dumont=20=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * python/libstdcxx/v6/printers.py (Tr1HashtableIterator): Fix rendering of std::tr1 unordered containers iterator. (StdHashtableIterator): New, render std unordered containers iterator. * testsuite/libstdc++-prettyprinters/tr1.cc: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198947 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 7 ++ libstdc++-v3/python/libstdcxx/v6/printers.py | 49 ++++++++++-- .../testsuite/libstdc++-prettyprinters/tr1.cc | 90 ++++++++++++++++++++++ 3 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 libstdc++-v3/testsuite/libstdc++-prettyprinters/tr1.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1e51963aecf..e22b63e8dee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2013-05-15 François Dumont + + * python/libstdcxx/v6/printers.py (Tr1HashtableIterator): Fix + rendering of std::tr1 unordered containers iterator. + (StdHashtableIterator): New, render std unordered containers iterator. + * testsuite/libstdc++-prettyprinters/tr1.cc: New. + 2013-05-15 Jonathan Wakely * include/bits/basic_string.h (getline): Fix doxygen comments. diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index e6f20074979..a3a8b1e2fd7 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -621,8 +621,16 @@ class StdStringPrinter: class Tr1HashtableIterator: def __init__ (self, hash): - self.node = hash['_M_bbegin']['_M_node']['_M_nxt'] - self.node_type = find_type(hash.type, '__node_type').pointer() + self.buckets = hash['_M_buckets'] + self.bucket = 0 + self.bucket_count = hash['_M_bucket_count'] + self.node_type = find_type(hash.type, '_Node').pointer() + self.node = 0 + while self.bucket != self.bucket_count: + self.node = self.buckets[self.bucket] + if self.node: + break + self.bucket = self.bucket + 1 def __iter__ (self): return self @@ -632,9 +640,33 @@ class Tr1HashtableIterator: raise StopIteration node = self.node.cast(self.node_type) result = node.dereference()['_M_v'] - self.node = node.dereference()['_M_nxt'] + self.node = node.dereference()['_M_next']; + if self.node == 0: + self.bucket = self.bucket + 1 + while self.bucket != self.bucket_count: + self.node = self.buckets[self.bucket] + if self.node: + break + self.bucket = self.bucket + 1 return result +class StdHashtableIterator: + def __init__(self, hash): + self.node = hash['_M_bbegin']['_M_node']['_M_nxt'] + self.node_type = find_type(hash.type, '__node_type').pointer() + + def __iter__(self): + return self + + def next(self): + if self.node == 0: + raise StopIteration + elt = self.node.cast(self.node_type).dereference() + self.node = elt['_M_nxt'] + valptr = elt['_M_storage'].address + valptr = valptr.cast(elt.type.template_argument(0).pointer()) + return valptr.dereference() + class Tr1UnorderedSetPrinter: "Print a tr1::unordered_set" @@ -656,7 +688,9 @@ class Tr1UnorderedSetPrinter: def children (self): counter = itertools.imap (self.format_count, itertools.count()) - return itertools.izip (counter, Tr1HashtableIterator (self.hashtable())) + if self.typename.startswith('std::tr1'): + return itertools.izip (counter, Tr1HashtableIterator (self.hashtable())) + return itertools.izip (counter, StdHashtableIterator (self.hashtable())) class Tr1UnorderedMapPrinter: "Print a tr1::unordered_map" @@ -690,9 +724,14 @@ class Tr1UnorderedMapPrinter: def children (self): counter = itertools.imap (self.format_count, itertools.count()) # Map over the hash table and flatten the result. - data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.hashtable()))) + if self.typename.startswith('std::tr1'): + data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.hashtable()))) + # Zip the two iterators together. + return itertools.izip (counter, data) + data = self.flatten (itertools.imap (self.format_one, StdHashtableIterator (self.hashtable()))) # Zip the two iterators together. return itertools.izip (counter, data) + def display_hint (self): return 'map' diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/tr1.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/tr1.cc new file mode 100644 index 00000000000..3fac36edd3c --- /dev/null +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/tr1.cc @@ -0,0 +1,90 @@ +// { dg-do run } +// { dg-options "-g" } + +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include +#include +#include + +template +void +placeholder(const T &s) +{ + std::cout << s; +} + +template +void +placeholder(const std::pair &s) +{ + std::cout << s.first; +} + +template +void +use(const T &container) +{ + for (typename T::const_iterator i = container.begin(); + i != container.end(); + ++i) + placeholder(*i); +} + +int +main() +{ + std::tr1::unordered_map eum; +// { dg-final { note-test eum "std::tr1::unordered_map with 0 elements" } } + std::tr1::unordered_multimap eumm; +// { dg-final { note-test eumm "std::tr1::unordered_multimap with 0 elements" } } + std::tr1::unordered_set eus; +// { dg-final { note-test eus "std::tr1::unordered_set with 0 elements" } } + std::tr1::unordered_multiset eums; +// { dg-final { note-test eums "std::tr1::unordered_multiset with 0 elements" } } + + std::tr1::unordered_map uom; + uom[5] = "three"; + uom[3] = "seven"; +// { dg-final { note-test uom {std::tr1::unordered_map with 2 elements = {[3] = "seven", [5] = "three"}} } } + + std::tr1::unordered_multimap uomm; + uomm.insert(std::pair (5, "three")); + uomm.insert(std::pair (5, "seven")); +// { dg-final { note-test uomm {std::tr1::unordered_multimap with 2 elements = {[5] = "three", [5] = "seven"}} } } + + std::tr1::unordered_set uos; + uos.insert(5); +// { dg-final { note-test uos {std::tr1::unordered_set with 1 elements = {[0] = 5}} } } + + std::tr1::unordered_multiset uoms; + uoms.insert(5); +// { dg-final { note-test uoms {std::tr1::unordered_multiset with 1 elements = {[0] = 5}} } } + + placeholder(""); // Mark SPOT + use(eum); + use(eumm); + use(eus); + use(eums); + use(uoms); + + return 0; +} + +// { dg-final { gdb-test SPOT } } -- 2.11.4.GIT