From c04f64807ee5e911741290aafc90d17618a02dca Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 29 May 2018 11:55:02 +0200 Subject: [PATCH] Add vec::reverse. 2018-05-29 Martin Liska David Malcolm * vec.c (test_reverse): New. (vec_c_tests): Add new test. * vec.h (vl_ptr>::reverse): New function. Co-Authored-By: David Malcolm From-SVN: r260890 --- gcc/ChangeLog | 7 +++++++ gcc/vec.c | 38 ++++++++++++++++++++++++++++++++++++++ gcc/vec.h | 14 ++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 686db9370f3..01a24da64d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-05-29 Martin Liska + David Malcolm + + * vec.c (test_reverse): New. + (vec_c_tests): Add new test. + * vec.h (vl_ptr>::reverse): New function. + 2018-05-29 Gerald Pfeifer * config.gcc: Identify FreeBSD 3.x and 4.x as unsupported. diff --git a/gcc/vec.c b/gcc/vec.c index 2941715a34a..beb857fd838 100644 --- a/gcc/vec.c +++ b/gcc/vec.c @@ -476,6 +476,43 @@ test_qsort () ASSERT_EQ (10, v.length ()); } +/* Verify that vec::reverse works correctly. */ + +static void +test_reverse () +{ + /* Reversing an empty vec ought to be a no-op. */ + { + auto_vec v; + ASSERT_EQ (0, v.length ()); + v.reverse (); + ASSERT_EQ (0, v.length ()); + } + + /* Verify reversing a vec with even length. */ + { + auto_vec v; + safe_push_range (v, 0, 4); + v.reverse (); + ASSERT_EQ (3, v[0]); + ASSERT_EQ (2, v[1]); + ASSERT_EQ (1, v[2]); + ASSERT_EQ (0, v[3]); + ASSERT_EQ (4, v.length ()); + } + + /* Verify reversing a vec with odd length. */ + { + auto_vec v; + safe_push_range (v, 0, 3); + v.reverse (); + ASSERT_EQ (2, v[0]); + ASSERT_EQ (1, v[1]); + ASSERT_EQ (0, v[2]); + ASSERT_EQ (3, v.length ()); + } +} + /* Run all of the selftests within this file. */ void @@ -492,6 +529,7 @@ vec_c_tests () test_unordered_remove (); test_block_remove (); test_qsort (); + test_reverse (); } } // namespace selftest diff --git a/gcc/vec.h b/gcc/vec.h index 2d1f468ca1c..a9f3bcf09eb 100644 --- a/gcc/vec.h +++ b/gcc/vec.h @@ -1389,6 +1389,7 @@ public: T *bsearch (const void *key, int (*compar)(const void *, const void *)); unsigned lower_bound (T, bool (*)(const T &, const T &)) const; bool contains (const T &search) const; + void reverse (void); bool using_auto_storage () const; @@ -1900,6 +1901,19 @@ vec::contains (const T &search) const return m_vec ? m_vec->contains (search) : false; } +/* Reverse content of the vector. */ + +template +inline void +vec::reverse (void) +{ + unsigned l = length (); + T *ptr = address (); + + for (unsigned i = 0; i < l / 2; i++) + std::swap (ptr[i], ptr[l - i - 1]); +} + template inline bool vec::using_auto_storage () const -- 2.30.2