brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 7939e77 Raw
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