brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 9820792 Raw
226 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// <list>10 11// UNSUPPORTED: c++03, no-exceptions12 13// TODO:14// - throwing upon moving;15// - initializer lists;16// - throwing when constructing the element in place.17 18// list(size_type n, const value_type& v);19// list(size_type n, const value_type& v, const allocator_type& a);20// template <class InputIterator>21//     list(InputIterator first, InputIterator last);22// template <class InputIterator>23//     list(InputIterator first, InputIterator last, const allocator_type& a);24// template<container-compatible-range<T> R>25//     list(from_range_t, R&& rg, const Allocator& = Allocator()); // C++2326// list(const list& x);27// list(const list& x, const allocator_type& a);28//29// list& operator=(const list& x);30//31// template <class InputIterator>32//     void assign(InputIterator first, InputIterator last);33// void assign(size_type n, const value_type& v);34// template<container-compatible-range<T> R>35//     void assign_range(R&& rg); // C++2336//37// template<container-compatible-range<T> R>38//   void prepend_range(R&& rg); // C++2339// void push_back(const value_type& x);40// template<container-compatible-range<T> R>41//   void append_range(R&& rg); // C++2342// void push_front(const value_type& v);43//44// iterator insert(const_iterator p, const value_type& v);45// iterator insert(const_iterator p, size_type n, const value_type& v);46// template <class InputIterator>47//     iterator insert(const_iterator p,48//                     InputIterator first, InputIterator last);49// template<container-compatible-range<T> R>50//     iterator insert_range(const_iterator position, R&& rg); // C++2351//52// void resize(size_type n, const value_type& v);53 54#include <list>55 56#include <cassert>57#include "../../exception_safety_helpers.h"58#include "test_macros.h"59 60#if TEST_STD_VER >= 2361#  include <ranges>62#endif63 64int main(int, char**) {65  {66    constexpr int ThrowOn = 1;67    constexpr int Size    = 1;68    using T               = ThrowingCopy<ThrowOn>;69 70    // void push_front(const value_type& v);71    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {72      std::list<T> c;73      c.push_front(*from);74    });75 76    // void push_back(const value_type& v);77    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {78      std::list<T> c;79      c.push_back(*from);80    });81 82    // iterator insert(const_iterator p, const value_type& v);83    test_exception_safety_throwing_copy</*ThrowOn=*/1, Size>([](T* from, T*) {84      std::list<T> c;85      c.insert(c.end(), *from);86    });87  }88 89  {90    constexpr int ThrowOn = 3;91    constexpr int Size    = 5;92    using T               = ThrowingCopy<ThrowOn>;93    using C               = std::list<T>;94    using Alloc           = std::allocator<T>;95 96    // list(size_type n, const value_type& v);97    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {98      std::list<T> c(Size, *from);99      (void)c;100    });101 102    // list(size_type n, const value_type& v, const allocator_type& a);103    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {104      std::list<T> c(Size, *from, Alloc());105      (void)c;106    });107 108    // template <class InputIterator>109    //     list(InputIterator first, InputIterator last);110    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {111      std::list<T> c(from, to);112      (void)c;113    });114 115    // template <class InputIterator>116    //     list(InputIterator first, InputIterator last, const allocator_type& a);117    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {118      std::list<T> c(from, to, Alloc());119      (void)c;120    });121 122#if TEST_STD_VER >= 23123    // template<container-compatible-range<T> R>124    //     list(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23125    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {126      {127        std::list<T> c(std::from_range, std::ranges::subrange(from, to));128        (void)c;129      }130 131      {132        std::list<T> c(std::from_range, std::ranges::subrange(from, to), Alloc());133        (void)c;134      }135    });136#endif137 138    // list(const list& x);139    test_exception_safety_throwing_copy_container<C, ThrowOn, Size>([](C&& in) {140      std::list<T> c(in);141      (void)c;142    });143 144    // list(const list& x, const allocator_type& a);145    test_exception_safety_throwing_copy_container<C, ThrowOn, Size>([](C&& in) {146      std::list<T> c(in, Alloc());147      (void)c;148    });149 150    // list& operator=(const list& x);151    test_exception_safety_throwing_copy_container<C, ThrowOn, Size>([](C&& in) {152      std::list<T> c;153      c = in;154    });155 156    // template <class InputIterator>157    //     void assign(InputIterator first, InputIterator last);158    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {159      std::list<T> c;160      c.assign(from, to);161    });162 163#if TEST_STD_VER >= 23164    // template<container-compatible-range<T> R>165    //     void assign_range(R&& rg); // C++23166    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {167      std::list<T> c;168      c.assign_range(std::ranges::subrange(from, to));169    });170#endif171 172    // void assign(size_type n, const value_type& v);173    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {174      std::list<T> c;175      c.assign(Size, *from);176    });177 178#if TEST_STD_VER >= 23179    // template<container-compatible-range<T> R>180    //   void prepend_range(R&& rg); // C++23181    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {182      std::list<T> c;183      c.prepend_range(std::ranges::subrange(from, to));184    });185 186    // template<container-compatible-range<T> R>187    //   void append_range(R&& rg); // C++23188    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {189      std::list<T> c;190      c.append_range(std::ranges::subrange(from, to));191    });192#endif193 194    // iterator insert(const_iterator p, size_type n, const value_type& v);195    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {196      std::list<T> c;197      c.insert(c.end(), Size, *from);198    });199 200    // template <class InputIterator>201    //     iterator insert(const_iterator p,202    //                     InputIterator first, InputIterator last);203    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {204      std::list<T> c;205      c.insert(c.end(), from, to);206    });207 208#if TEST_STD_VER >= 23209    // template<container-compatible-range<T> R>210    //     iterator insert_range(const_iterator position, R&& rg); // C++23211    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T* to) {212      std::list<T> c;213      c.insert_range(c.end(), std::ranges::subrange(from, to));214    });215#endif216 217    // void resize(size_type n, const value_type& v);218    test_exception_safety_throwing_copy<ThrowOn, Size>([](T* from, T*) {219      std::list<T> c;220      c.resize(Size, *from);221    });222  }223 224  return 0;225}226