libstdc++: Add pretty printer for std::span
This improves the debug output for C++20 spans. Before: {static extent = 18446744073709551615, _M_ptr = 0x7fffffffb9a8, _M_extent = {_M_extent_value = 2}} Now with StdSpanPrinter: std::span of length 2 = {1, 2} Signed-off-by: Philipp Fent <fent@in.tum.de> libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (StdSpanPrinter): Define. * testsuite/libstdc++-prettyprinters/cxx20.cc: Test it.
This commit is contained in:
parent
214d2860f4
commit
fdb3f82fb3
2 changed files with 49 additions and 0 deletions
|
@ -1654,6 +1654,43 @@ class StdRegexStatePrinter:
|
|||
s = "{}, {}={}".format(s, v, self.val['_M_' + v])
|
||||
return "{%s}" % (s)
|
||||
|
||||
class StdSpanPrinter:
|
||||
"Print a std::span"
|
||||
|
||||
class _iterator(Iterator):
|
||||
def __init__(self, begin, size):
|
||||
self.count = 0
|
||||
self.begin = begin
|
||||
self.size = size
|
||||
|
||||
def __iter__ (self):
|
||||
return self
|
||||
|
||||
def __next__ (self):
|
||||
if self.count == self.size:
|
||||
raise StopIteration
|
||||
|
||||
count = self.count
|
||||
self.count = self.count + 1
|
||||
return '[%d]' % count, (self.begin + count).dereference()
|
||||
|
||||
def __init__(self, typename, val):
|
||||
self.typename = typename
|
||||
self.val = val
|
||||
if val.type.template_argument(1) == gdb.parse_and_eval('static_cast<std::size_t>(-1)'):
|
||||
self.size = val['_M_extent']['_M_extent_value']
|
||||
else:
|
||||
self.size = val.type.template_argument(1)
|
||||
|
||||
def to_string(self):
|
||||
return '%s of length %d' % (self.typename, self.size)
|
||||
|
||||
def children(self):
|
||||
return self._iterator(self.val['_M_ptr'], self.size)
|
||||
|
||||
def display_hint(self):
|
||||
return 'array'
|
||||
|
||||
# A "regular expression" printer which conforms to the
|
||||
# "SubPrettyPrinter" protocol from gdb.printing.
|
||||
class RxPrinter(object):
|
||||
|
@ -2170,6 +2207,7 @@ def build_libstdcxx_dictionary ():
|
|||
libstdcxx_printer.add_version('std::', 'partial_ordering', StdCmpCatPrinter)
|
||||
libstdcxx_printer.add_version('std::', 'weak_ordering', StdCmpCatPrinter)
|
||||
libstdcxx_printer.add_version('std::', 'strong_ordering', StdCmpCatPrinter)
|
||||
libstdcxx_printer.add_version('std::', 'span', StdSpanPrinter)
|
||||
|
||||
# Extensions.
|
||||
libstdcxx_printer.add_version('__gnu_cxx::', 'slist', StdSlistPrinter)
|
||||
|
|
|
@ -18,8 +18,10 @@
|
|||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <array>
|
||||
#include <compare>
|
||||
#include <iostream>
|
||||
#include <span>
|
||||
|
||||
struct X
|
||||
{
|
||||
|
@ -54,6 +56,15 @@ main()
|
|||
auto c10 = 0.0 <=> __builtin_nan("");
|
||||
// { dg-final { note-test c10 "std::partial_ordering::unordered" } }
|
||||
|
||||
auto il = {1, 2};
|
||||
auto s1 = std::span(il);
|
||||
static_assert(s1.extent == std::size_t(-1));
|
||||
// { dg-final { note-test s1 {std::span of length 2 = {1, 2}} } }
|
||||
auto a = std::array{3, 4};
|
||||
auto s2 = std::span(a);
|
||||
static_assert(s2.extent == std::size_t(2));
|
||||
// { dg-final { note-test s2 {std::span of length 2 = {3, 4}} } }
|
||||
|
||||
std::cout << "\n";
|
||||
return 0; // Mark SPOT
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue