brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · f9708aa Raw
79 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++03, c++11, c++14, c++17, c++2010// `check_assertion.h` requires Unix headers and regex support.11// REQUIRES: has-unix-headers12// UNSUPPORTED: no-localization13// UNSUPPORTED: no-exceptions14 15// <flat_map>16 17// void swap(flat_map& y) noexcept;18// friend void swap(flat_map& x, flat_map& y) noexcept19 20// Test that std::terminate is called if any exception is thrown during swap21 22#include <flat_map>23#include <cassert>24#include <deque>25#include <functional>26#include <vector>27 28#include "test_macros.h"29#include "../helpers.h"30#include "check_assertion.h"31 32template <class F>33void test_swap_exception_guarantee([[maybe_unused]] F&& swap_function) {34  {35    // key swap throws36    using KeyContainer   = ThrowOnMoveContainer<int>;37    using ValueContainer = std::vector<int>;38    using M              = std::flat_map<int, int, TransparentComparator, KeyContainer, ValueContainer>;39 40    M m1, m2;41    m1.emplace(1, 1);42    m1.emplace(2, 2);43    m2.emplace(3, 3);44    m2.emplace(4, 4);45    // swap is noexcept46    EXPECT_STD_TERMINATE([&] { swap_function(m1, m2); });47  }48 49  {50    // value swap throws51    using KeyContainer   = std::vector<int>;52    using ValueContainer = ThrowOnMoveContainer<int>;53    using M              = std::flat_map<int, int, TransparentComparator, KeyContainer, ValueContainer>;54 55    M m1, m2;56    m1.emplace(1, 1);57    m1.emplace(2, 2);58    m2.emplace(3, 3);59    m2.emplace(4, 4);60 61    // swap is noexcept62    EXPECT_STD_TERMINATE([&] { swap_function(m1, m2); });63  }64}65 66int main(int, char**) {67  {68    auto swap_func = [](auto& m1, auto& m2) { swap(m1, m2); };69    test_swap_exception_guarantee(swap_func);70  }71 72  {73    auto swap_func = [](auto& m1, auto& m2) { m1.swap(m2); };74    test_swap_exception_guarantee(swap_func);75  }76 77  return 0;78}79