// Copyright (C) 2023 Ahmad Samir // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef Q20MAP_H #define Q20MAP_H #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::map #if defined(__cpp_lib_erase_if) && __cpp_lib_erase_if >= 202002L // the one returning size_type 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). #define MAKE_OVERLOAD(map, allocator) \ template \ constexpr typename std::map>>::size_type \ erase_if(std::map>> &c, Pred p) \ { \ const auto origSize = c.size(); \ for (auto it = c.begin(), end = c.end(); it != end; /* erasing */) { \ if (p(*it)) \ it = c.erase(it); \ else \ ++it; \ } \ return origSize - c.size(); \ } \ /* end */ MAKE_OVERLOAD(map, allocator) MAKE_OVERLOAD(multimap, allocator) #ifdef __cpp_lib_polymorphic_allocator MAKE_OVERLOAD(map, pmr::polymorphic_allocator) MAKE_OVERLOAD(multimap, pmr::polymorphic_allocator) #endif // __cpp_lib_polymorphic_allocator #undef MAKE_OVERLOAD #endif // __cpp_lib_erase_if } // namespace q20 QT_END_NAMESPACE #endif /* Q20MAP_H */