// Copyright (C) 2023 Ahmad Samir // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef Q20VECTOR_H #define Q20VECTOR_H #include #include #include #if __has_include() # include #endif // // W A R N I N G // ------------- // // This file is not part of the Qt API. Types and functions defined in this // file can reliably be replaced by their std counterparts, once available. // You may use these definitions in your own code, but be aware that we // will remove them once Qt depends on the C++ version that supports // them in namespace std. There will be NO deprecation warning, the // definitions will JUST go away. // // If you can't agree to these terms, don't use these definitions! // // We mean it. // QT_BEGIN_NAMESPACE namespace q20 { // like std::erase/std::erase_if for std::vector #if defined(__cpp_lib_erase_if) && __cpp_lib_erase_if >= 202002L // the one returning size_type using std::erase; using std::erase_if; #else // Make it more specialized than the compiler's, so that our implementation is preferred over // the compiler's (which may be present, but return void instead of the number of erased elements). template constexpr typename std::vector>::size_type erase(std::vector> &c, const U &value) { const auto origSize = c.size(); auto it = std::remove(c.begin(), c.end(), value); c.erase(it, c.end()); return origSize - c.size(); } template constexpr typename std::vector>::size_type erase_if(std::vector> &c, Pred pred) { const auto origSize = c.size(); auto it = std::remove_if(c.begin(), c.end(), pred); c.erase(it, c.end()); return origSize - c.size(); } #ifdef __cpp_lib_polymorphic_allocator template constexpr typename std::vector>::size_type erase(std::vector> &c, const U &value) { const auto origSize = c.size(); auto it = std::remove(c.begin(), c.end(), value); c.erase(it, c.end()); return origSize - c.size(); } template constexpr typename std::vector>::size_type erase_if(std::vector> &c, Pred pred) { const auto origSize = c.size(); auto it = std::remove_if(c.begin(), c.end(), pred); c.erase(it, c.end()); return origSize - c.size(); } #endif // __cpp_lib_polymorphic_allocator #endif // __cpp_lib_erase_if } // namespace q20 QT_END_NAMESPACE #endif /* Q20VECTOR_H */