brintos

brintos / llvm-project-archived public Read only

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