98 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 P>16// iterator insert(const_iterator position, P&& p);17 18#include <map>19#include <cassert>20 21#include "MoveOnly.h"22#include "min_allocator.h"23#include "test_macros.h"24 25template <class Container, class Pair>26void do_insert_rv_test() {27 typedef Container M;28 typedef Pair P;29 typedef typename M::iterator R;30 M m;31 R r = m.insert(m.cend(), P(2, 2));32 assert(r == m.begin());33 assert(m.size() == 1);34 assert(r->first == 2);35 assert(r->second == 2);36 37 r = m.insert(m.cend(), P(1, 1));38 assert(r == m.begin());39 assert(m.size() == 2);40 assert(r->first == 1);41 assert(r->second == 1);42 43 r = m.insert(m.cend(), P(3, 3));44 assert(r == std::prev(m.end()));45 assert(m.size() == 3);46 assert(r->first == 3);47 assert(r->second == 3);48 49 r = m.insert(m.cend(), P(3, 2));50 assert(r == std::prev(m.end()));51 assert(m.size() == 4);52 assert(r->first == 3);53 assert(r->second == 2);54}55 56int main(int, char**) {57 do_insert_rv_test<std::multimap<int, MoveOnly>, std::pair<int, MoveOnly> >();58 do_insert_rv_test<std::multimap<int, MoveOnly>, std::pair<const int, MoveOnly> >();59 60 {61 typedef std::multimap<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;62 typedef std::pair<int, MoveOnly> P;63 typedef std::pair<const int, MoveOnly> CP;64 do_insert_rv_test<M, P>();65 do_insert_rv_test<M, CP>();66 }67 {68 typedef std::multimap<int, MoveOnly> M;69 typedef M::iterator R;70 M m;71 R r = m.insert(m.cend(), {2, MoveOnly(2)});72 assert(r == m.begin());73 assert(m.size() == 1);74 assert(r->first == 2);75 assert(r->second == 2);76 77 r = m.insert(m.cend(), {1, MoveOnly(1)});78 assert(r == m.begin());79 assert(m.size() == 2);80 assert(r->first == 1);81 assert(r->second == 1);82 83 r = m.insert(m.cend(), {3, MoveOnly(3)});84 assert(r == std::prev(m.end()));85 assert(m.size() == 3);86 assert(r->first == 3);87 assert(r->second == 3);88 89 r = m.insert(m.cend(), {3, MoveOnly(2)});90 assert(r == std::prev(m.end()));91 assert(m.size() == 4);92 assert(r->first == 3);93 assert(r->second == 2);94 }95 96 return 0;97}98