aboutsummaryrefslogtreecommitdiff
path: root/gcc/vec.c
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2018-05-01 19:16:43 +0000
committerTom de Vries <vries@gcc.gnu.org>2018-05-01 19:16:43 +0000
commitb94c2dc138c60636e3898b04c1026cbb1b868b26 (patch)
treee99c38252e340bc2e91a93e586b47cdf8ba5aaf3 /gcc/vec.c
parent2cc7d3a7da20bcfd854302b1f265c6551b8a3741 (diff)
downloadgcc-b94c2dc138c60636e3898b04c1026cbb1b868b26.zip
gcc-b94c2dc138c60636e3898b04c1026cbb1b868b26.tar.gz
gcc-b94c2dc138c60636e3898b04c1026cbb1b868b26.tar.bz2
Add VEC_ORDERED_REMOVE_IF
2018-05-01 Tom de Vries <tom@codesourcery.com> PR other/83786 * vec.h (VEC_ORDERED_REMOVE_IF, VEC_ORDERED_REMOVE_IF_FROM_TO): Define. * vec.c (test_ordered_remove_if): New function. (vec_c_tests): Call test_ordered_remove_if. * dwarf2cfi.c (connect_traces): Use VEC_ORDERED_REMOVE_IF_FROM_TO. * lto-streamer-out.c (prune_offload_funcs): Use VEC_ORDERED_REMOVE_IF. * tree-vect-patterns.c (vect_pattern_recog_1): Use VEC_ORDERED_REMOVE_IF. From-SVN: r259808
Diffstat (limited to 'gcc/vec.c')
-rw-r--r--gcc/vec.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/vec.c b/gcc/vec.c
index 695cd1e..11924a8 100644
--- a/gcc/vec.c
+++ b/gcc/vec.c
@@ -382,6 +382,51 @@ test_ordered_remove ()
ASSERT_EQ (9, v.length ());
}
+/* Verify that vec::ordered_remove_if works correctly. */
+
+static void
+test_ordered_remove_if (void)
+{
+ auto_vec <int> v;
+ safe_push_range (v, 0, 10);
+ unsigned ix, ix2;
+ int *elem_ptr;
+ VEC_ORDERED_REMOVE_IF (v, ix, ix2, elem_ptr,
+ *elem_ptr == 5 || *elem_ptr == 7);
+ ASSERT_EQ (4, v[4]);
+ ASSERT_EQ (6, v[5]);
+ ASSERT_EQ (8, v[6]);
+ ASSERT_EQ (8, v.length ());
+
+ v.truncate (0);
+ safe_push_range (v, 0, 10);
+ VEC_ORDERED_REMOVE_IF_FROM_TO (v, ix, ix2, elem_ptr, 0, 6,
+ *elem_ptr == 5 || *elem_ptr == 7);
+ ASSERT_EQ (4, v[4]);
+ ASSERT_EQ (6, v[5]);
+ ASSERT_EQ (7, v[6]);
+ ASSERT_EQ (9, v.length ());
+
+ v.truncate (0);
+ safe_push_range (v, 0, 10);
+ VEC_ORDERED_REMOVE_IF_FROM_TO (v, ix, ix2, elem_ptr, 0, 5,
+ *elem_ptr == 5 || *elem_ptr == 7);
+ VEC_ORDERED_REMOVE_IF_FROM_TO (v, ix, ix2, elem_ptr, 8, 10,
+ *elem_ptr == 5 || *elem_ptr == 7);
+ ASSERT_EQ (4, v[4]);
+ ASSERT_EQ (5, v[5]);
+ ASSERT_EQ (6, v[6]);
+ ASSERT_EQ (10, v.length ());
+
+ v.truncate (0);
+ safe_push_range (v, 0, 10);
+ VEC_ORDERED_REMOVE_IF (v, ix, ix2, elem_ptr, *elem_ptr == 5);
+ ASSERT_EQ (4, v[4]);
+ ASSERT_EQ (6, v[5]);
+ ASSERT_EQ (7, v[6]);
+ ASSERT_EQ (9, v.length ());
+}
+
/* Verify that vec::unordered_remove works correctly. */
static void
@@ -443,6 +488,7 @@ vec_c_tests ()
test_pop ();
test_safe_insert ();
test_ordered_remove ();
+ test_ordered_remove_if ();
test_unordered_remove ();
test_block_remove ();
test_qsort ();