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