1dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// -*- C++ -*-
2dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//===----------------------------------------------------------------------===//
3dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//
4dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//                     The LLVM Compiler Infrastructure
5dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//
6dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
7dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// Source Licenses. See LICENSE.TXT for details.
8dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//
9dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//===----------------------------------------------------------------------===//
10dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
11d8df1781e3e0041d81899c9131b43c6655c75351Dan Albert// REQUIRES: c++experimental
12dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// UNSUPPORTED: c++98, c++03
13dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
14dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// <experimental/unordered_set>
15dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
16dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// namespace std { namespace experimental { namespace pmr {
17dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// template <class V, class H = hash<V>, class P = equal_to<V> >
18dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// using unordered_set =
19dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//     ::std::unordered_set<V, H, P, polymorphic_allocator<V>>
20dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//
21dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// template <class V,  class H = hash<V>, class P = equal_to<V> >
22dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// using unordered_multiset =
23dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//     ::std::unordered_multiset<V, H, P, polymorphic_allocator<V>>
24dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier//
25dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier// }}} // namespace std::experimental::pmr
26dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
27dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier#include <experimental/unordered_set>
28dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier#include <experimental/memory_resource>
29dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier#include <type_traits>
30dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier#include <cassert>
31dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
32dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiseliernamespace pmr = std::experimental::pmr;
33dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
34dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiseliertemplate <class T>
35dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselierstruct MyHash : std::hash<T> {};
36dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
37dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiseliertemplate <class T>
38dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselierstruct MyPred : std::equal_to<T> {};
39dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier
40dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselierint main()
41dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier{
42dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    using V = char;
43dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    using DH = std::hash<V>;
44dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    using MH = MyHash<V>;
45dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    using DP = std::equal_to<V>;
46dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    using MP = MyPred<V>;
47dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
48dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_set<V, DH, DP, pmr::polymorphic_allocator<V>>;
49dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_set<V>;
50dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
51dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
52dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
53dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_set<V, MH, DP, pmr::polymorphic_allocator<V>>;
54dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_set<V, MH>;
55dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
56dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
57dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
58dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_set<V, MH, MP, pmr::polymorphic_allocator<V>>;
59dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_set<V, MH, MP>;
60dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
61dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
62dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
63174432dbd52dddcb683ef14b3c8de083cad9d28cMarshall Clow        pmr::unordered_set<int> m;
64dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        assert(m.get_allocator().resource() == pmr::get_default_resource());
65dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
66dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
67dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_multiset<V, DH, DP, pmr::polymorphic_allocator<V>>;
68dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_multiset<V>;
69dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
70dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
71dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
72dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_multiset<V, MH, DP, pmr::polymorphic_allocator<V>>;
73dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_multiset<V, MH>;
74dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
75dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
76dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
77dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using StdSet = std::unordered_multiset<V, MH, MP, pmr::polymorphic_allocator<V>>;
78dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        using PmrSet = pmr::unordered_multiset<V, MH, MP>;
79dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        static_assert(std::is_same<StdSet, PmrSet>::value, "");
80dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
81dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    {
82174432dbd52dddcb683ef14b3c8de083cad9d28cMarshall Clow        pmr::unordered_multiset<int> m;
83dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier        assert(m.get_allocator().resource() == pmr::get_default_resource());
84dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier    }
85dba23b499be925f98fba2345eaacb99b88eba9eaEric Fiselier}
86