brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 3222762 Raw
100 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 11// <flat_set>12 13// template<class K> bool contains(const K& x) const;14 15#include <cassert>16#include <flat_set>17#include <functional>18#include <string>19#include <utility>20#include <deque>21 22#include "MinSequenceContainer.h"23#include "../helpers.h"24#include "test_macros.h"25#include "min_allocator.h"26 27// Constraints: The qualified-id Compare::is_transparent is valid and denotes a type.28template <class M>29concept CanContains     = requires(M m, Transparent<int> k) { m.contains(k); };30using TransparentSet    = std::flat_multiset<int, TransparentComparator>;31using NonTransparentSet = std::flat_multiset<int, NonTransparentComparator>;32static_assert(CanContains<TransparentSet>);33static_assert(CanContains<const TransparentSet>);34static_assert(!CanContains<NonTransparentSet>);35static_assert(!CanContains<const NonTransparentSet>);36 37template <class KeyContainer>38constexpr void test_one() {39  using Key = typename KeyContainer::value_type;40  using M   = std::flat_multiset<Key, TransparentComparator, KeyContainer>;41 42  {43    M m = {"alpha", "beta", "beta", "epsilon", "eta", "eta", "gamma"};44    ASSERT_SAME_TYPE(decltype(m.contains(Transparent<std::string>{"abc"})), bool);45    ASSERT_SAME_TYPE(decltype(std::as_const(m).contains(Transparent<std::string>{"b"})), bool);46    assert(m.contains(Transparent<std::string>{"alpha"}) == true);47    assert(m.contains(Transparent<std::string>{"beta"}) == true);48    assert(m.contains(Transparent<std::string>{"epsilon"}) == true);49    assert(m.contains(Transparent<std::string>{"eta"}) == true);50    assert(m.contains(Transparent<std::string>{"gamma"}) == true);51    assert(m.contains(Transparent<std::string>{"al"}) == false);52    assert(m.contains(Transparent<std::string>{""}) == false);53    assert(m.contains(Transparent<std::string>{"g"}) == false);54  }55  {56    // empty57    M m;58    assert(m.contains(Transparent<std::string>{"gamma"}) == false);59    assert(m.contains(Transparent<std::string>{"al"}) == false);60  }61}62 63constexpr bool test() {64  test_one<std::vector<std::string>>();65#ifndef __cpp_lib_constexpr_deque66  if (!TEST_IS_CONSTANT_EVALUATED)67#endif68    test_one<std::deque<std::string>>();69  test_one<MinSequenceContainer<std::string>>();70  test_one<std::vector<std::string, min_allocator<std::string>>>();71 72  {73    bool transparent_used = false;74    TransparentComparator c(transparent_used);75    std::flat_multiset<int, TransparentComparator> m(std::sorted_equivalent, {1, 1, 2, 2, 3}, c);76    assert(!transparent_used);77    auto b = m.contains(Transparent<int>{3});78    assert(b);79    assert(transparent_used);80  }81  {82    // std::string and C string literal83    using M = std::flat_multiset<std::string, std::less<>>;84    M m     = {"alpha", "beta", "beta", "epsilon", "eta", "gamma"};85    assert(m.contains("beta"));86    assert(!m.contains("charlie"));87  }88 89  return true;90}91 92int main(int, char**) {93  test();94#if TEST_STD_VER >= 2695  static_assert(test());96#endif97 98  return 0;99}100