191 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <map>10 11// class multimap12 13// iterator find(const key_type& k);14// const_iterator find(const key_type& k) const;15 16#include <map>17#include <cassert>18 19#include "test_macros.h"20#include "min_allocator.h"21#include "private_constructor.h"22#include "is_transparent.h"23 24template <class Iter>25bool iter_in_range(Iter first, Iter last, Iter to_find) {26 for (; first != last; ++first) {27 if (first == to_find)28 return true;29 }30 return false;31}32 33int main(int, char**) {34 typedef std::pair<const int, double> V;35 {36 typedef std::multimap<int, double> M;37 {38 typedef M::iterator R;39 V ar[] = {V(5, 1), V(5, 2), V(5, 3), V(7, 1), V(7, 2), V(7, 3), V(9, 1), V(9, 2), V(9, 3)};40 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));41 R r = m.find(5);42 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));43 r = m.find(6);44 assert(r == m.end());45 r = m.find(7);46 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));47 r = m.find(8);48 assert(r == m.end());49 r = m.find(9);50 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));51 r = m.find(10);52 assert(r == m.end());53 }54 {55 typedef M::const_iterator R;56 V ar[] = {V(5, 1), V(5, 2), V(5, 3), V(7, 1), V(7, 2), V(7, 3), V(9, 1), V(9, 2), V(9, 3)};57 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));58 R r = m.find(5);59 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));60 r = m.find(6);61 assert(r == m.end());62 r = m.find(7);63 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));64 r = m.find(8);65 assert(r == m.end());66 r = m.find(9);67 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));68 r = m.find(10);69 assert(r == m.end());70 }71 }72 {73 using Pair = std::pair<const int, int>;74 using Map = std::multimap<int, int, std::greater<int> >;75 Pair arr[] = {76 Pair(5, 1), Pair(5, 2), Pair(5, 3), Pair(7, 1), Pair(7, 2), Pair(7, 3), Pair(9, 1), Pair(9, 2), Pair(9, 3)};77 const Map m(arr, arr + sizeof(arr) / sizeof(arr[0]));78 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), m.find(5)));79 assert(m.find(6) == m.end());80 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), m.find(7)));81 assert(m.find(8) == m.end());82 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), m.find(9)));83 assert(m.find(10) == m.end());84 }85#if TEST_STD_VER >= 1186 {87 typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;88 {89 typedef M::iterator R;90 V ar[] = {V(5, 1), V(5, 2), V(5, 3), V(7, 1), V(7, 2), V(7, 3), V(9, 1), V(9, 2), V(9, 3)};91 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));92 R r = m.find(5);93 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));94 r = m.find(6);95 assert(r == m.end());96 r = m.find(7);97 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));98 r = m.find(8);99 assert(r == m.end());100 r = m.find(9);101 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));102 r = m.find(10);103 assert(r == m.end());104 }105 {106 typedef M::const_iterator R;107 V ar[] = {V(5, 1), V(5, 2), V(5, 3), V(7, 1), V(7, 2), V(7, 3), V(9, 1), V(9, 2), V(9, 3)};108 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));109 R r = m.find(5);110 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));111 r = m.find(6);112 assert(r == m.end());113 r = m.find(7);114 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));115 r = m.find(8);116 assert(r == m.end());117 r = m.find(9);118 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));119 r = m.find(10);120 assert(r == m.end());121 }122 }123#endif124#if TEST_STD_VER > 11125 {126 typedef std::multimap<int, double, std::less<>> M;127 typedef M::iterator R;128 129 V ar[] = {V(5, 1), V(5, 2), V(5, 3), V(7, 1), V(7, 2), V(7, 3), V(9, 1), V(9, 2), V(9, 3)};130 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));131 R r = m.find(5);132 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));133 r = m.find(6);134 assert(r == m.end());135 r = m.find(7);136 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));137 r = m.find(8);138 assert(r == m.end());139 r = m.find(9);140 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));141 r = m.find(10);142 assert(r == m.end());143 144 r = m.find(C2Int(5));145 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));146 r = m.find(C2Int(6));147 assert(r == m.end());148 r = m.find(C2Int(7));149 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));150 r = m.find(C2Int(8));151 assert(r == m.end());152 r = m.find(C2Int(9));153 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));154 r = m.find(C2Int(10));155 assert(r == m.end());156 }157 158 {159 typedef PrivateConstructor PC;160 typedef std::multimap<PC, double, std::less<>> M;161 typedef M::iterator R;162 163 M m;164 m.insert(std::make_pair<PC, double>(PC::make(5), 1));165 m.insert(std::make_pair<PC, double>(PC::make(5), 2));166 m.insert(std::make_pair<PC, double>(PC::make(5), 3));167 m.insert(std::make_pair<PC, double>(PC::make(7), 1));168 m.insert(std::make_pair<PC, double>(PC::make(7), 2));169 m.insert(std::make_pair<PC, double>(PC::make(7), 3));170 m.insert(std::make_pair<PC, double>(PC::make(9), 1));171 m.insert(std::make_pair<PC, double>(PC::make(9), 2));172 m.insert(std::make_pair<PC, double>(PC::make(9), 3));173 174 R r = m.find(5);175 assert(iter_in_range(std::next(m.begin(), 0), std::next(m.begin(), 3), r));176 r = m.find(6);177 assert(r == m.end());178 r = m.find(7);179 assert(iter_in_range(std::next(m.begin(), 3), std::next(m.begin(), 6), r));180 r = m.find(8);181 assert(r == m.end());182 r = m.find(9);183 assert(iter_in_range(std::next(m.begin(), 6), std::next(m.begin(), 9), r));184 r = m.find(10);185 assert(r == m.end());186 }187#endif188 189 return 0;190}191