228 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 map12 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 24int main(int, char**) {25 {26 typedef std::pair<const int, double> V;27 typedef std::map<int, double> M;28 {29 typedef M::iterator R;30 V ar[] = {V(5, 5), V(6, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(11, 11), V(12, 12)};31 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));32 R r = m.find(5);33 assert(r == m.begin());34 r = m.find(6);35 assert(r == std::next(m.begin()));36 r = m.find(7);37 assert(r == std::next(m.begin(), 2));38 r = m.find(8);39 assert(r == std::next(m.begin(), 3));40 r = m.find(9);41 assert(r == std::next(m.begin(), 4));42 r = m.find(10);43 assert(r == std::next(m.begin(), 5));44 r = m.find(11);45 assert(r == std::next(m.begin(), 6));46 r = m.find(12);47 assert(r == std::next(m.begin(), 7));48 r = m.find(4);49 assert(r == std::next(m.begin(), 8));50 }51 {52 typedef M::const_iterator R;53 V ar[] = {V(5, 5), V(6, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(11, 11), V(12, 12)};54 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));55 R r = m.find(5);56 assert(r == m.begin());57 r = m.find(6);58 assert(r == std::next(m.begin()));59 r = m.find(7);60 assert(r == std::next(m.begin(), 2));61 r = m.find(8);62 assert(r == std::next(m.begin(), 3));63 r = m.find(9);64 assert(r == std::next(m.begin(), 4));65 r = m.find(10);66 assert(r == std::next(m.begin(), 5));67 r = m.find(11);68 assert(r == std::next(m.begin(), 6));69 r = m.find(12);70 assert(r == std::next(m.begin(), 7));71 r = m.find(4);72 assert(r == std::next(m.begin(), 8));73 }74 }75 { // Check with std::greater to ensure we're actually using the correct comparator76 using Pair = std::pair<const int, int>;77 using Map = std::map<int, int, std::greater<int> >;78 Pair ar[] = {Pair(5, 5), Pair(6, 6), Pair(7, 7), Pair(8, 8), Pair(9, 9), Pair(10, 10), Pair(11, 11), Pair(12, 12)};79 Map m(ar, ar + sizeof(ar) / sizeof(ar[0]));80 assert(m.find(12) == std::next(m.begin(), 0));81 assert(m.find(11) == std::next(m.begin(), 1));82 assert(m.find(10) == std::next(m.begin(), 2));83 assert(m.find(9) == std::next(m.begin(), 3));84 assert(m.find(8) == std::next(m.begin(), 4));85 assert(m.find(7) == std::next(m.begin(), 5));86 assert(m.find(6) == std::next(m.begin(), 6));87 assert(m.find(5) == std::next(m.begin(), 7));88 assert(m.find(4) == std::next(m.begin(), 8));89 assert(std::next(m.begin(), 8) == m.end());90 }91#if TEST_STD_VER >= 1192 {93 typedef std::pair<const int, double> V;94 typedef std::map<int, double, std::less<int>, min_allocator<V>> M;95 {96 typedef M::iterator R;97 V ar[] = {V(5, 5), V(6, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(11, 11), V(12, 12)};98 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));99 R r = m.find(5);100 assert(r == m.begin());101 r = m.find(6);102 assert(r == std::next(m.begin()));103 r = m.find(7);104 assert(r == std::next(m.begin(), 2));105 r = m.find(8);106 assert(r == std::next(m.begin(), 3));107 r = m.find(9);108 assert(r == std::next(m.begin(), 4));109 r = m.find(10);110 assert(r == std::next(m.begin(), 5));111 r = m.find(11);112 assert(r == std::next(m.begin(), 6));113 r = m.find(12);114 assert(r == std::next(m.begin(), 7));115 r = m.find(4);116 assert(r == std::next(m.begin(), 8));117 }118 {119 typedef M::const_iterator R;120 V ar[] = {V(5, 5), V(6, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(11, 11), V(12, 12)};121 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));122 R r = m.find(5);123 assert(r == m.begin());124 r = m.find(6);125 assert(r == std::next(m.begin()));126 r = m.find(7);127 assert(r == std::next(m.begin(), 2));128 r = m.find(8);129 assert(r == std::next(m.begin(), 3));130 r = m.find(9);131 assert(r == std::next(m.begin(), 4));132 r = m.find(10);133 assert(r == std::next(m.begin(), 5));134 r = m.find(11);135 assert(r == std::next(m.begin(), 6));136 r = m.find(12);137 assert(r == std::next(m.begin(), 7));138 r = m.find(4);139 assert(r == std::next(m.begin(), 8));140 }141 }142#endif143#if TEST_STD_VER > 11144 {145 typedef std::pair<const int, double> V;146 typedef std::map<int, double, std::less<>> M;147 typedef M::iterator R;148 149 V ar[] = {V(5, 5), V(6, 6), V(7, 7), V(8, 8), V(9, 9), V(10, 10), V(11, 11), V(12, 12)};150 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));151 R r = m.find(5);152 assert(r == m.begin());153 r = m.find(6);154 assert(r == std::next(m.begin()));155 r = m.find(7);156 assert(r == std::next(m.begin(), 2));157 r = m.find(8);158 assert(r == std::next(m.begin(), 3));159 r = m.find(9);160 assert(r == std::next(m.begin(), 4));161 r = m.find(10);162 assert(r == std::next(m.begin(), 5));163 r = m.find(11);164 assert(r == std::next(m.begin(), 6));165 r = m.find(12);166 assert(r == std::next(m.begin(), 7));167 r = m.find(4);168 assert(r == std::next(m.begin(), 8));169 170 r = m.find(C2Int(5));171 assert(r == m.begin());172 r = m.find(C2Int(6));173 assert(r == std::next(m.begin()));174 r = m.find(C2Int(7));175 assert(r == std::next(m.begin(), 2));176 r = m.find(C2Int(8));177 assert(r == std::next(m.begin(), 3));178 r = m.find(C2Int(9));179 assert(r == std::next(m.begin(), 4));180 r = m.find(C2Int(10));181 assert(r == std::next(m.begin(), 5));182 r = m.find(C2Int(11));183 assert(r == std::next(m.begin(), 6));184 r = m.find(C2Int(12));185 assert(r == std::next(m.begin(), 7));186 r = m.find(C2Int(4));187 assert(r == std::next(m.begin(), 8));188 }189 190 {191 typedef PrivateConstructor PC;192 typedef std::map<PC, double, std::less<>> M;193 typedef M::iterator R;194 195 M m;196 m[PC::make(5)] = 5;197 m[PC::make(6)] = 6;198 m[PC::make(7)] = 7;199 m[PC::make(8)] = 8;200 m[PC::make(9)] = 9;201 m[PC::make(10)] = 10;202 m[PC::make(11)] = 11;203 m[PC::make(12)] = 12;204 205 R r = m.find(5);206 assert(r == m.begin());207 r = m.find(6);208 assert(r == std::next(m.begin()));209 r = m.find(7);210 assert(r == std::next(m.begin(), 2));211 r = m.find(8);212 assert(r == std::next(m.begin(), 3));213 r = m.find(9);214 assert(r == std::next(m.begin(), 4));215 r = m.find(10);216 assert(r == std::next(m.begin(), 5));217 r = m.find(11);218 assert(r == std::next(m.begin(), 6));219 r = m.find(12);220 assert(r == std::next(m.begin(), 7));221 r = m.find(4);222 assert(r == std::next(m.begin(), 8));223 }224#endif225 226 return 0;227}228