diff --git a/stl/inc/xpolymorphic_allocator.h b/stl/inc/xpolymorphic_allocator.h index 1701dedbdf5..d065085328e 100644 --- a/stl/inc/xpolymorphic_allocator.h +++ b/stl/inc/xpolymorphic_allocator.h @@ -282,6 +282,18 @@ namespace pmr { return _Resource; } + _NODISCARD_FRIEND bool operator==( + const polymorphic_allocator& _Lhs, const polymorphic_allocator& _Rhs) noexcept { + return *_Lhs._Resource == *_Rhs._Resource; + } + +#if !_HAS_CXX20 + _NODISCARD_FRIEND bool operator!=( + const polymorphic_allocator& _Lhs, const polymorphic_allocator& _Rhs) noexcept { + return *_Lhs._Resource != *_Rhs._Resource; + } +#endif // !_HAS_CXX20 + private: memory_resource* _Resource = _STD pmr::get_default_resource(); }; diff --git a/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp b/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp index cd3cb543f7c..7144cc0a21b 100644 --- a/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp +++ b/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -946,6 +947,45 @@ namespace { } } // namespace eq + namespace eq_cvt { + void test() { + const auto pres = std::pmr::get_default_resource(); + std::pmr::polymorphic_allocator a = pres; + const auto ra = std::ref(a); + const auto cra = std::cref(a); + + CHECK(a == pres); + CHECK(a == ra); + CHECK(a == cra); + CHECK(pres == a); + CHECK(pres == ra); + CHECK(pres == cra); + CHECK(ra == a); + CHECK(ra == pres); + CHECK(ra == ra); + CHECK(ra == cra); + CHECK(cra == a); + CHECK(cra == pres); + CHECK(cra == ra); + CHECK(cra == cra); + + CHECK(!(a != pres)); + CHECK(!(a != ra)); + CHECK(!(a != cra)); + CHECK(!(pres != a)); + CHECK(!(pres != ra)); + CHECK(!(pres != cra)); + CHECK(!(ra != a)); + CHECK(!(ra != pres)); + CHECK(!(ra != ra)); + CHECK(!(ra != cra)); + CHECK(!(cra != a)); + CHECK(!(cra != pres)); + CHECK(!(cra != ra)); + CHECK(!(cra != cra)); + } + } // namespace eq_cvt + namespace destroy { void test() { bool destroyed = false; @@ -1505,6 +1545,7 @@ int main() { polymorphic_allocator::mem::select_on_container_copy_construction::test(); polymorphic_allocator::mem::resource::test(); polymorphic_allocator::eq::test(); + polymorphic_allocator::eq_cvt::test(); polymorphic_allocator::destroy::test(); monotonic::ctor::buffer_upstream::test();