xref: /llvm-project/libcxx/test/std/containers/associative/map/map.cons/deduct_const.pass.cpp (revision 3cd4531b9ba421d1d096e746d787fe3039a546bb)
1f2f7d72fSLouis Dionne //===----------------------------------------------------------------------===//
2f2f7d72fSLouis Dionne //
3f2f7d72fSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f2f7d72fSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5f2f7d72fSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f2f7d72fSLouis Dionne //
7f2f7d72fSLouis Dionne //===----------------------------------------------------------------------===//
8f2f7d72fSLouis Dionne 
9f2f7d72fSLouis Dionne // <map>
1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
11f2f7d72fSLouis Dionne 
12f2f7d72fSLouis Dionne // template<class InputIterator,
13f2f7d72fSLouis Dionne //          class Compare = less<iter-value-type<InputIterator>>,
14f2f7d72fSLouis Dionne //          class Allocator = allocator<iter-value-type<InputIterator>>>
15f2f7d72fSLouis Dionne // map(InputIterator, InputIterator,
16f2f7d72fSLouis Dionne //          Compare = Compare(), Allocator = Allocator())
17f2f7d72fSLouis Dionne //   -> map<iter-value-type<InputIterator>, Compare, Allocator>;
18f2f7d72fSLouis Dionne // template<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
19f2f7d72fSLouis Dionne // map(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
20f2f7d72fSLouis Dionne //   -> map<Key, Compare, Allocator>;
21f2f7d72fSLouis Dionne // template<class InputIterator, class Allocator>
22f2f7d72fSLouis Dionne // map(InputIterator, InputIterator, Allocator)
23f2f7d72fSLouis Dionne //   -> map<iter-value-type<InputIterator>, less<iter-value-type<InputIterator>>, Allocator>;
24f2f7d72fSLouis Dionne // template<class Key, class Allocator>
25f2f7d72fSLouis Dionne // map(initializer_list<Key>, Allocator)
26f2f7d72fSLouis Dionne //   -> map<Key, less<Key>, Allocator>;
27f2f7d72fSLouis Dionne 
28f2f7d72fSLouis Dionne #include <algorithm> // std::equal
29f2f7d72fSLouis Dionne #include <cassert>
30f2f7d72fSLouis Dionne #include <climits> // INT_MAX
31f2f7d72fSLouis Dionne #include <functional>
32*3cd4531bSNikolas Klauser #include <iterator>
33f2f7d72fSLouis Dionne #include <map>
34f2f7d72fSLouis Dionne #include <type_traits>
35f2f7d72fSLouis Dionne 
36f2f7d72fSLouis Dionne #include "test_allocator.h"
37f2f7d72fSLouis Dionne 
38f2f7d72fSLouis Dionne using P = std::pair<int, long>;
39f2f7d72fSLouis Dionne using PC = std::pair<const int, long>;
40f2f7d72fSLouis Dionne using PCC = std::pair<const int, const long>;
41f2f7d72fSLouis Dionne 
main(int,char **)42f2f7d72fSLouis Dionne int main(int, char**)
43f2f7d72fSLouis Dionne {
44f2f7d72fSLouis Dionne     {
45f2f7d72fSLouis Dionne     const PCC arr[] = { {1,1L}, {2,2L}, {1,1L}, {INT_MAX,1L}, {3,1L} };
46f2f7d72fSLouis Dionne     std::map m(std::begin(arr), std::end(arr));
47f2f7d72fSLouis Dionne 
48f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, const long>);
49f2f7d72fSLouis Dionne     const PCC expected_m[] = { {1,1L}, {2,2L}, {3,1L}, {INT_MAX,1L} };
50f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
51f2f7d72fSLouis Dionne     }
52f2f7d72fSLouis Dionne 
53f2f7d72fSLouis Dionne     {
54f2f7d72fSLouis Dionne     const PCC arr[] = { {1,1L}, {2,2L}, {1,1L}, {INT_MAX,1L}, {3,1L} };
55f2f7d72fSLouis Dionne     std::map m(std::begin(arr), std::end(arr), std::greater<int>());
56f2f7d72fSLouis Dionne 
57f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, const long, std::greater<int>>);
58f2f7d72fSLouis Dionne     const PCC expected_m[] = { {INT_MAX,1L}, {3,1L}, {2,2L}, {1, 1L} };
59f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
60f2f7d72fSLouis Dionne     }
61f2f7d72fSLouis Dionne 
62f2f7d72fSLouis Dionne     {
63f2f7d72fSLouis Dionne     const PCC arr[] = { {1,1L}, {2,2L}, {1,1L}, {INT_MAX,1L}, {3,1L} };
64f2f7d72fSLouis Dionne     std::map m(std::begin(arr), std::end(arr), std::greater<int>(), test_allocator<PCC>(0, 42));
65f2f7d72fSLouis Dionne 
66f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, const long, std::greater<int>, test_allocator<PCC>>);
67f2f7d72fSLouis Dionne     const PCC expected_m[] = { {INT_MAX,1L}, {3,1L}, {2,2L}, {1, 1L} };
68f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
69f2f7d72fSLouis Dionne     assert(m.get_allocator().get_id() == 42);
70f2f7d72fSLouis Dionne     }
71f2f7d72fSLouis Dionne 
72f2f7d72fSLouis Dionne     {
73f2f7d72fSLouis Dionne     std::map m{ PC{1,1L}, PC{2,2L}, PC{1,1L}, PC{INT_MAX,1L}, PC{3,1L} };
74f2f7d72fSLouis Dionne 
75f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, long>);
76f2f7d72fSLouis Dionne     const PC expected_m[] = { {1, 1L}, {2,2L}, {3,1L}, {INT_MAX,1L} };
77f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
78f2f7d72fSLouis Dionne     }
79f2f7d72fSLouis Dionne 
80f2f7d72fSLouis Dionne     {
81f2f7d72fSLouis Dionne     std::map m({ PC{1,1L}, PC{2,2L}, PC{1,1L}, PC{INT_MAX,1L}, PC{3,1L} }, std::greater<int>());
82f2f7d72fSLouis Dionne 
83f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, long, std::greater<int>>);
84f2f7d72fSLouis Dionne     const PC expected_m[] = { {INT_MAX,1L}, {3,1L}, {2,2L}, {1, 1L} };
85f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
86f2f7d72fSLouis Dionne     }
87f2f7d72fSLouis Dionne 
88f2f7d72fSLouis Dionne     {
89f2f7d72fSLouis Dionne     std::map m({ PC{1,1L}, PC{2,2L}, PC{1,1L}, PC{INT_MAX,1L}, PC{3,1L} }, std::greater<int>(), test_allocator<PC>(0, 43));
90f2f7d72fSLouis Dionne 
91f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, long, std::greater<int>, test_allocator<PC>>);
92f2f7d72fSLouis Dionne     const PC expected_m[] = { {INT_MAX,1L}, {3,1L}, {2,2L}, {1, 1L} };
93f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
94f2f7d72fSLouis Dionne     assert(m.get_allocator().get_id() == 43);
95f2f7d72fSLouis Dionne     }
96f2f7d72fSLouis Dionne 
97f2f7d72fSLouis Dionne     {
98f2f7d72fSLouis Dionne     std::map m({ PC{1,1L}, PC{2,2L}, PC{1,1L}, PC{INT_MAX,1L}, PC{3,1L} }, test_allocator<PC>(0, 45));
99f2f7d72fSLouis Dionne 
100f2f7d72fSLouis Dionne     ASSERT_SAME_TYPE(decltype(m), std::map<int, long, std::less<int>, test_allocator<PC>>);
101f2f7d72fSLouis Dionne     const PC expected_m[] = { {1, 1L}, {2,2L}, {3,1L}, {INT_MAX,1L} };
102f2f7d72fSLouis Dionne     assert(std::equal(m.begin(), m.end(), std::begin(expected_m), std::end(expected_m)));
103f2f7d72fSLouis Dionne     assert(m.get_allocator().get_id() == 45);
104f2f7d72fSLouis Dionne     }
105f2f7d72fSLouis Dionne 
106f2f7d72fSLouis Dionne     return 0;
107f2f7d72fSLouis Dionne }
108