brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · c481ac5 Raw
162 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// <deque>10// UNSUPPORTED: c++03, c++11, c++1411 12// template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>13//    deque(InputIterator, InputIterator, Allocator = Allocator())14//    -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>;15//16// template<ranges::input_range R, class Allocator = allocator<ranges::range_value_t<R>>>17//   deque(from_range_t, R&&, Allocator = Allocator())18//     -> deque<ranges::range_value_t<R>, Allocator>; // C++2319 20#include "asan_testing.h"21#include <array>22#include <cassert>23#include <climits> // INT_MAX24#include <cstddef>25#include <deque>26#include <iterator>27 28#include "deduction_guides_sfinae_checks.h"29#include "test_macros.h"30#include "test_iterators.h"31#include "test_allocator.h"32 33struct A {};34 35int main(int, char**) {36  //  Test the explicit deduction guides37  {38    const int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};39    std::deque deq(std::begin(arr), std::end(arr));40 41    static_assert(std::is_same_v<decltype(deq), std::deque<int>>, "");42    assert(std::equal(deq.begin(), deq.end(), std::begin(arr), std::end(arr)));43    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));44  }45 46  {47    const long arr[] = {INT_MAX, 1L, 2L, 3L};48    std::deque deq(std::begin(arr), std::end(arr), std::allocator<long>());49    static_assert(std::is_same_v<decltype(deq)::value_type, long>, "");50    assert(deq.size() == 4);51    assert(deq[0] == INT_MAX);52    assert(deq[1] == 1L);53    assert(deq[2] == 2L);54    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));55  }56 57  //  Test the implicit deduction guides58 59  {60    //  We don't expect this one to work.61    //  std::deque deq(std::allocator<int>()); // deque (allocator &)62  }63 64  {65    std::deque deq(1, A{}); // deque (size_type, T)66    static_assert(std::is_same_v<decltype(deq)::value_type, A>, "");67    static_assert(std::is_same_v<decltype(deq)::allocator_type, std::allocator<A>>, "");68    assert(deq.size() == 1);69    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));70  }71 72  {73    std::deque deq(1, A{}, test_allocator<A>()); // deque (size_type, T, allocator)74    static_assert(std::is_same_v<decltype(deq)::value_type, A>, "");75    static_assert(std::is_same_v<decltype(deq)::allocator_type, test_allocator<A>>, "");76    assert(deq.size() == 1);77    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));78  }79 80  {81    std::deque deq{1U, 2U, 3U, 4U, 5U}; // deque(initializer-list)82    static_assert(std::is_same_v<decltype(deq)::value_type, unsigned>, "");83    assert(deq.size() == 5);84    assert(deq[2] == 3U);85    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));86  }87 88  {89    std::deque deq({1.0, 2.0, 3.0, 4.0}, test_allocator<double>()); // deque(initializer-list, allocator)90    static_assert(std::is_same_v<decltype(deq)::value_type, double>, "");91    static_assert(std::is_same_v<decltype(deq)::allocator_type, test_allocator<double>>, "");92    assert(deq.size() == 4);93    assert(deq[3] == 4.0);94    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));95  }96 97  {98    std::deque<long double> source;99    std::deque deq(source); // deque(deque &)100    static_assert(std::is_same_v<decltype(deq)::value_type, long double>, "");101    static_assert(std::is_same_v<decltype(deq)::allocator_type, std::allocator<long double>>, "");102    assert(deq.size() == 0);103    LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));104  }105 106  {107    typedef test_allocator<short> Alloc;108    typedef test_allocator<int> ConvertibleToAlloc;109 110    {111      std::deque<short, Alloc> source;112      std::deque deq(source, Alloc(2));113      static_assert(std::is_same_v<decltype(deq), decltype(source)>);114      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));115      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(source));116    }117 118    {119      std::deque<short, Alloc> source;120      std::deque deq(source, ConvertibleToAlloc(2));121      static_assert(std::is_same_v<decltype(deq), decltype(source)>);122      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));123      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(source));124    }125 126    {127      std::deque<short, Alloc> source;128      std::deque deq(std::move(source), Alloc(2));129      static_assert(std::is_same_v<decltype(deq), decltype(source)>);130      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));131      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(source));132    }133 134    {135      std::deque<short, Alloc> source;136      std::deque deq(std::move(source), ConvertibleToAlloc(2));137      static_assert(std::is_same_v<decltype(deq), decltype(source)>);138      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(deq));139      LIBCPP_ASSERT(is_double_ended_contiguous_container_asan_correct(source));140    }141  }142 143#if TEST_STD_VER >= 23144  {145    {146      std::deque c(std::from_range, std::array<int, 0>());147      static_assert(std::is_same_v<decltype(c), std::deque<int>>);148    }149 150    {151      using Alloc = test_allocator<int>;152      std::deque c(std::from_range, std::array<int, 0>(), Alloc());153      static_assert(std::is_same_v<decltype(c), std::deque<int, Alloc>>);154    }155  }156#endif157 158  SequenceContainerDeductionGuidesSfinaeAway<std::deque, std::deque<int>>();159 160  return 0;161}162