brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.0 KiB · 63dbcda Raw
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