brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · f9797ca Raw
217 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++1410 11// <set>12 13// template<class InputIterator,14//          class Compare = less<iter-value-type<InputIterator>>,15//          class Allocator = allocator<iter-value-type<InputIterator>>>16// multiset(InputIterator, InputIterator,17//          Compare = Compare(), Allocator = Allocator())18//   -> multiset<iter-value-type<InputIterator>, Compare, Allocator>;19// template<class Key, class Compare = less<Key>,20//          class Allocator = allocator<Key>>21// multiset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())22//   -> multiset<Key, Compare, Allocator>;23// template<class InputIterator, class Allocator>24// multiset(InputIterator, InputIterator, Allocator)25//   -> multiset<iter-value-type<InputIterator>,26//               less<iter-value-type<InputIterator>>, Allocator>;27// template<class Key, class Allocator>28// multiset(initializer_list<Key>, Allocator)29//   -> multiset<Key, less<Key>, Allocator>;30//31// template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>,32//          class Allocator = allocator<ranges::range_value_t<R>>>33//   multiset(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())34//     -> multiset<ranges::range_value_t<R>, Compare, Allocator>;35//36// template<ranges::input_range R, class Allocator>37//   multiset(from_range_t, R&&, Allocator)38//     -> multiset<ranges::range_value_t<R>, less<ranges::range_value_t<R>>, Allocator>;39 40#include <algorithm> // std::equal41#include <array>42#include <cassert>43#include <climits> // INT_MAX44#include <functional>45#include <set>46#include <type_traits>47 48#include "deduction_guides_sfinae_checks.h"49#include "test_allocator.h"50 51struct NotAnAllocator {52  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }53};54 55int main(int, char**) {56  {57    const int arr[] = {1, 2, 1, INT_MAX, 3};58    std::multiset s(std::begin(arr), std::end(arr));59 60    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);61    const int expected_s[] = {1, 1, 2, 3, INT_MAX};62    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));63  }64 65  {66    const int arr[] = {1, 2, 1, INT_MAX, 3};67    std::multiset s(std::begin(arr), std::end(arr), std::greater<int>());68 69    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int> >);70    const int expected_s[] = {INT_MAX, 3, 2, 1, 1};71    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));72  }73 74  {75    const int arr[] = {1, 2, 1, INT_MAX, 3};76    std::multiset s(std::begin(arr), std::end(arr), std::greater<int>(), test_allocator<int>(0, 42));77 78    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int>, test_allocator<int> >);79    const int expected_s[] = {INT_MAX, 3, 2, 1, 1};80    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));81    assert(s.get_allocator().get_id() == 42);82  }83 84  {85    std::multiset<long> source;86    std::multiset s(source);87    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);88    assert(s.size() == 0);89  }90 91  {92    std::multiset<long> source;93    std::multiset s{source}; // braces instead of parens94    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);95    assert(s.size() == 0);96  }97 98  {99    std::multiset<long> source;100    std::multiset s(source, std::multiset<long>::allocator_type());101    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);102    assert(s.size() == 0);103  }104 105  {106    std::multiset s{1, 2, 1, INT_MAX, 3};107 108    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);109    const int expected_s[] = {1, 1, 2, 3, INT_MAX};110    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));111  }112 113  {114    std::multiset s({1, 2, 1, INT_MAX, 3}, std::greater<int>());115 116    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int> >);117    const int expected_s[] = {INT_MAX, 3, 2, 1, 1};118    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));119  }120 121  {122    std::multiset s({1, 2, 1, INT_MAX, 3}, std::greater<int>(), test_allocator<int>(0, 43));123 124    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int>, test_allocator<int> >);125    const int expected_s[] = {INT_MAX, 3, 2, 1, 1};126    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));127    assert(s.get_allocator().get_id() == 43);128  }129 130  {131    const int arr[] = {1, 2, 1, INT_MAX, 3};132    std::multiset s(std::begin(arr), std::end(arr), test_allocator<int>(0, 44));133 134    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::less<int>, test_allocator<int> >);135    const int expected_s[] = {1, 1, 2, 3, INT_MAX};136    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));137    assert(s.get_allocator().get_id() == 44);138  }139 140  {141    std::multiset s({1, 2, 1, INT_MAX, 3}, test_allocator<int>(0, 45));142 143    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::less<int>, test_allocator<int> >);144    const int expected_s[] = {1, 1, 2, 3, INT_MAX};145    assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s)));146    assert(s.get_allocator().get_id() == 45);147  }148 149  {150    NotAnAllocator a;151    std::multiset s{a}; // multiset(initializer_list<NotAnAllocator>)152    ASSERT_SAME_TYPE(decltype(s), std::multiset<NotAnAllocator>);153    assert(s.size() == 1);154  }155 156  {157    std::multiset<long> source;158    std::multiset s{source, source}; // multiset(initializer_list<multiset<long>>)159    ASSERT_SAME_TYPE(decltype(s), std::multiset<std::multiset<long> >);160    assert(s.size() == 2);161  }162 163  {164    NotAnAllocator a;165    std::multiset s{a, a}; // multiset(initializer_list<NotAnAllocator>)166    ASSERT_SAME_TYPE(decltype(s), std::multiset<NotAnAllocator>);167    assert(s.size() == 2);168  }169 170  {171    int source[3] = {3, 4, 5};172    std::multiset s(source, source + 3); // multiset(InputIterator, InputIterator)173    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);174    assert(s.size() == 3);175  }176 177  {178    int source[3] = {3, 4, 5};179    std::multiset s{source, source + 3}; // multiset(initializer_list<int*>)180    ASSERT_SAME_TYPE(decltype(s), std::multiset<int*>);181    assert(s.size() == 2);182  }183 184#if TEST_STD_VER >= 23185  {186    using Range       = std::array<int, 0>;187    using Comp        = std::greater<int>;188    using DefaultComp = std::less<int>;189    using Alloc       = test_allocator<int>;190 191    { // (from_range, range)192      std::multiset c(std::from_range, Range());193      static_assert(std::is_same_v<decltype(c), std::multiset<int>>);194    }195 196    { // (from_range, range, comp)197      std::multiset c(std::from_range, Range(), Comp());198      static_assert(std::is_same_v<decltype(c), std::multiset<int, Comp>>);199    }200 201    { // (from_range, range, comp, alloc)202      std::multiset c(std::from_range, Range(), Comp(), Alloc());203      static_assert(std::is_same_v<decltype(c), std::multiset<int, Comp, Alloc>>);204    }205 206    { // (from_range, range, alloc)207      std::multiset c(std::from_range, Range(), Alloc());208      static_assert(std::is_same_v<decltype(c), std::multiset<int, DefaultComp, Alloc>>);209    }210  }211#endif212 213  AssociativeContainerDeductionGuidesSfinaeAway<std::multiset, std::multiset<int>>();214 215  return 0;216}217