From e686338105177046975bcff8fe6199536e80caf9 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sat, 19 Oct 2024 08:10:38 +0200 Subject: [PATCH] [gdbsupport] Add gdb::array_view::{iterator,const_iterator} While trying to substitute some std::vector type A in the code with a gdb::array_view: ... - using A = std::vector + using A = gdb::array_view .... I ran into the problem that the code was using A::iterator while gdb::array_view doesn't define such a type. Fix this by: - adding types gdb::array_view::iterator and gdb::array_view::const_iterator, - using them in gdb::array_view::(c)begin and gdb::array_view::(c)end, as is usual, and - using them explicitly in a unit test. Tested on aarch64-linux. Approved-By: Tom Tromey --- gdb/unittests/array-view-selftests.c | 36 ++++++++++++++++++++++++++++ gdbsupport/array-view.h | 10 ++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gdb/unittests/array-view-selftests.c b/gdb/unittests/array-view-selftests.c index eb3ae304790..c07b5720ef0 100644 --- a/gdb/unittests/array-view-selftests.c +++ b/gdb/unittests/array-view-selftests.c @@ -364,6 +364,39 @@ check_range_for () SELF_CHECK (sum == 1 + 2 + 3 + 4); } +template +static void +check_iterator () +{ + T data[] = {1, 2, 3, 4}; + gdb::array_view view (data); + + typename std::decay::type sum = 0; + for (typename gdb::array_view::iterator it = view.begin (); + it != view.end (); it++) + { + *it *= 2; + sum += *it; + } + + SELF_CHECK (sum == 2 + 4 + 6 + 8); +} + +template +static void +check_const_iterator () +{ + T data[] = {1, 2, 3, 4}; + gdb::array_view view (data); + + typename std::decay::type sum = 0; + for (typename gdb::array_view::const_iterator it = view.cbegin (); + it != view.cend (); it++) + sum += *it; + + SELF_CHECK (sum == 1 + 2 + 3 + 4); +} + /* Entry point. */ static void @@ -490,6 +523,9 @@ run_tests () check_range_for (); check_range_for (); + check_iterator (); + check_const_iterator (); + check_const_iterator (); /* Check that the right ctor overloads are taken when the element is a container. */ diff --git a/gdbsupport/array-view.h b/gdbsupport/array-view.h index 0dea26f67ac..5bf9ed77dbf 100644 --- a/gdbsupport/array-view.h +++ b/gdbsupport/array-view.h @@ -88,6 +88,8 @@ class array_view using reference = T &; using const_reference = const T &; using size_type = size_t; + using const_iterator = const T *; + using iterator = T *; /* Default construction creates an empty view. */ constexpr array_view () noexcept @@ -157,11 +159,11 @@ class array_view constexpr T *data () noexcept { return m_array; } constexpr const T *data () const noexcept { return m_array; } - constexpr T *begin () const noexcept { return m_array; } - constexpr const T *cbegin () const noexcept { return m_array; } + constexpr iterator begin () const noexcept { return m_array; } + constexpr const_iterator cbegin () const noexcept { return m_array; } - constexpr T *end () const noexcept { return m_array + m_size; } - constexpr const T *cend () const noexcept { return m_array + m_size; } + constexpr iterator end () const noexcept { return m_array + m_size; } + constexpr const_iterator cend () const noexcept { return m_array + m_size; } constexpr reference operator[] (size_t index) noexcept {