aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Utilities/Containers.h29
-rw-r--r--src/common/Utilities/advstd.h3
2 files changed, 32 insertions, 0 deletions
diff --git a/src/common/Utilities/Containers.h b/src/common/Utilities/Containers.h
index ba929bc2a84..0454b8d4aad 100644
--- a/src/common/Utilities/Containers.h
+++ b/src/common/Utilities/Containers.h
@@ -18,6 +18,7 @@
#ifndef TRINITY_CONTAINERS_H
#define TRINITY_CONTAINERS_H
+#include "advstd.h"
#include "Define.h"
#include "Random.h"
#include <algorithm>
@@ -241,6 +242,34 @@ namespace Trinity
++itr;
}
}
+
+ template <typename Container, typename Predicate>
+ std::enable_if_t<advstd::is_move_assignable_v<decltype(*std::declval<Container>().begin())>, void> EraseIf(Container& c, Predicate p)
+ {
+ auto wpos = c.begin();
+ for (auto rpos = c.begin(), end = c.end(); rpos != end; ++rpos)
+ {
+ if (!p(*rpos))
+ {
+ if (rpos != wpos)
+ std::swap(*rpos, *wpos);
+ ++wpos;
+ }
+ }
+ c.erase(wpos, c.end());
+ }
+
+ template <typename Container, typename Predicate>
+ std::enable_if_t<!advstd::is_move_assignable_v<decltype(*std::declval<Container>().begin())>, void> EraseIf(Container& c, Predicate p)
+ {
+ for (auto it = c.begin(); it != c.end();)
+ {
+ if (p(*it))
+ it = c.erase(it);
+ else
+ ++it;
+ }
+ }
}
//! namespace Containers
}
diff --git a/src/common/Utilities/advstd.h b/src/common/Utilities/advstd.h
index df962a0bbcd..5606b84cfa2 100644
--- a/src/common/Utilities/advstd.h
+++ b/src/common/Utilities/advstd.h
@@ -79,6 +79,9 @@ namespace advstd
// C++17 std::is_arithmetic_v
forward_1v(is_arithmetic, bool);
+ // C++17 std::is_move_assignable_v
+ forward_1v(is_move_assignable, bool);
+
#undef forward_1v
#undef forward_2v