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