]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Support braces as arguments for std::erase on inplace_vector [PR121196]
authorTomasz Kamiński <tkaminsk@redhat.com>
Fri, 25 Jul 2025 12:50:26 +0000 (14:50 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Mon, 28 Jul 2025 06:32:47 +0000 (08:32 +0200)
PR libstdc++/121196

libstdc++-v3/ChangeLog:

* include/std/inplace_vector (std::erase): Provide default argument
for _Up parameter.
* testsuite/23_containers/inplace_vector/erasure.cc: Add test for
using braces-init-list as arguments to erase_if and use function
to verify content of inplace_vector

Reviewed-by: Patrick Palka <ppalka@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
libstdc++-v3/include/std/inplace_vector
libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc

index 290cf6eb0e929cbca03005ff301b30ca49c59969..b5a81bed3c98326dd050a5f8ab03fe4b5e7371ef 100644 (file)
@@ -1354,7 +1354,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
 
-  template<typename _Tp, size_t _Nm, typename _Up>
+  template<typename _Tp, size_t _Nm, typename _Up = _Tp>
     constexpr  size_t
     erase(inplace_vector<_Tp, _Nm>& __cont, const _Up& __value)
     {
index c7fda097896781b4d068f97a5d12386ee6142ec8..8fb56e906234b8d15363881f686953ecefa52031 100644 (file)
@@ -2,18 +2,38 @@
 
 #include <inplace_vector>
 #include <testsuite_hooks.h>
+#include <span>
+
+template<typename T, size_t N>
+constexpr bool
+eq(const std::inplace_vector<T, N>& l, std::span<const T> r) {
+  if (l.size() != r.size())
+    return false;
+  for (auto i = 0u; i < l.size(); ++i)
+    if (l[i] != r[i])
+      return false;
+  return true;
+};
 
 constexpr void
 test_erase()
 {
-  std::inplace_vector<int, 15> c{1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 4, 4, 9};
+  std::inplace_vector<int, 15> c{1, 0, 3, 4, 5, 6, 5, 4, 3, 0, 1, 4, 4, 9};
   std::erase(c, 4);
   VERIFY( c.size() == 10 );
   std::erase(c, 1);
   VERIFY( c.size() == 8 );
   std::erase(c, 9);
   VERIFY( c.size() == 7 );
-  VERIFY( (c == std::inplace_vector<int, 15>{2, 3, 5, 6, 5, 3, 2}) );
+  VERIFY( eq(c, {0, 3, 5, 6, 5, 3, 0}) );
+  
+  std::erase(c, {});
+  VERIFY( c.size() == 5 );
+  VERIFY( eq(c, {3, 5, 6, 5, 3}) );
+
+  std::erase(c, {5});
+  VERIFY( c.size() == 3 );
+  VERIFY( eq(c, {3, 6, 3}) );
 
   std::inplace_vector<int, 0> e;
   std::erase(e, 10);
@@ -29,7 +49,7 @@ test_erase_if()
   std::erase_if(c, [](int i) { return i == 4; });
   VERIFY( c.size() == 8 );
   std::erase_if(c, [](int i) { return i & 1; });
-  VERIFY( (c == std::inplace_vector<int, 15>{2, 2}) );
+  VERIFY( eq(c, {2, 2}) );
 
   std::inplace_vector<int, 0> e;
   std::erase_if(e, [](int i) { return i > 5; });