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_set<int, TransparentComparator>;31using NonTransparentSet = std::flat_set<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_set<Key, TransparentComparator, KeyContainer>;41 42 {43 M m = {"alpha", "beta", "epsilon", "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_set<int, TransparentComparator> m(std::sorted_unique, {1, 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 // LWG4239 std::string and C string literal83 using M = std::flat_set<std::string, std::less<>>;84 M m{"alpha", "beta", "epsilon", "eta", "gamma"};85 assert(m.contains("beta"));86 assert(!m.contains("eta2"));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