brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 8b90810 Raw
140 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// UNSUPPORTED: c++0310 11// <map>12 13// class multimap14 15// template <class... Args>16//   iterator emplace_hint(const_iterator position, Args&&... args);17 18#include <map>19#include <cassert>20 21#include "test_macros.h"22#include "../../../Emplaceable.h"23#include "DefaultOnly.h"24#include "min_allocator.h"25 26int main(int, char**) {27  {28    typedef std::multimap<int, DefaultOnly> M;29    typedef M::iterator R;30    M m;31    assert(DefaultOnly::count == 0);32    R r = m.emplace_hint(m.cend());33    assert(r == m.begin());34    assert(m.size() == 1);35    assert(m.begin()->first == 0);36    assert(m.begin()->second == DefaultOnly());37    assert(DefaultOnly::count == 1);38    r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple());39    assert(r == std::next(m.begin()));40    assert(m.size() == 2);41    assert(std::next(m.begin())->first == 1);42    assert(std::next(m.begin())->second == DefaultOnly());43    assert(DefaultOnly::count == 2);44    r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple());45    assert(r == std::next(m.begin(), 2));46    assert(m.size() == 3);47    assert(std::next(m.begin(), 2)->first == 1);48    assert(std::next(m.begin(), 2)->second == DefaultOnly());49    assert(DefaultOnly::count == 3);50  }51  assert(DefaultOnly::count == 0);52  {53    typedef std::multimap<int, Emplaceable> M;54    typedef M::iterator R;55    M m;56    R r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple());57    assert(r == m.begin());58    assert(m.size() == 1);59    assert(m.begin()->first == 2);60    assert(m.begin()->second == Emplaceable());61    r = m.emplace_hint(m.cbegin(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple(2, 3.5));62    assert(r == m.begin());63    assert(m.size() == 2);64    assert(m.begin()->first == 1);65    assert(m.begin()->second == Emplaceable(2, 3.5));66    r = m.emplace_hint(m.cbegin(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple(3, 3.5));67    assert(r == m.begin());68    assert(m.size() == 3);69    assert(r->first == 1);70    assert(r->second == Emplaceable(3, 3.5));71  }72  {73    typedef std::multimap<int, double> M;74    typedef M::iterator R;75    M m;76    R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));77    assert(r == m.begin());78    assert(m.size() == 1);79    assert(m.begin()->first == 2);80    assert(m.begin()->second == 3.5);81  }82  {83    typedef std::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;84    typedef M::iterator R;85    M m;86    assert(DefaultOnly::count == 0);87    R r = m.emplace_hint(m.cend());88    assert(r == m.begin());89    assert(m.size() == 1);90    assert(m.begin()->first == 0);91    assert(m.begin()->second == DefaultOnly());92    assert(DefaultOnly::count == 1);93    r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple());94    assert(r == std::next(m.begin()));95    assert(m.size() == 2);96    assert(std::next(m.begin())->first == 1);97    assert(std::next(m.begin())->second == DefaultOnly());98    assert(DefaultOnly::count == 2);99    r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple());100    assert(r == std::next(m.begin(), 2));101    assert(m.size() == 3);102    assert(std::next(m.begin(), 2)->first == 1);103    assert(std::next(m.begin(), 2)->second == DefaultOnly());104    assert(DefaultOnly::count == 3);105  }106  assert(DefaultOnly::count == 0);107  {108    typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;109    typedef M::iterator R;110    M m;111    R r = m.emplace_hint(m.cend(), std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple());112    assert(r == m.begin());113    assert(m.size() == 1);114    assert(m.begin()->first == 2);115    assert(m.begin()->second == Emplaceable());116    r = m.emplace_hint(m.cbegin(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple(2, 3.5));117    assert(r == m.begin());118    assert(m.size() == 2);119    assert(m.begin()->first == 1);120    assert(m.begin()->second == Emplaceable(2, 3.5));121    r = m.emplace_hint(m.cbegin(), std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple(3, 3.5));122    assert(r == m.begin());123    assert(m.size() == 3);124    assert(r->first == 1);125    assert(r->second == Emplaceable(3, 3.5));126  }127  {128    typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;129    typedef M::iterator R;130    M m;131    R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));132    assert(r == m.begin());133    assert(m.size() == 1);134    assert(m.begin()->first == 2);135    assert(m.begin()->second == 3.5);136  }137 138  return 0;139}140