brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 070fbb0 Raw
109 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_map>12 13// class flat_multimap14 15// key_compare key_comp() const;16// value_compare value_comp() const;17 18#include <cassert>19#include <flat_map>20#include <functional>21#include <utility>22#include <vector>23 24#include "test_macros.h"25 26constexpr bool test() {27  {28    using M    = std::flat_multimap<int, char>;29    using Comp = std::less<int>; // the default30    M m        = {};31    ASSERT_SAME_TYPE(M::key_compare, Comp);32    static_assert(!std::is_same_v<M::value_compare, Comp>);33    ASSERT_SAME_TYPE(decltype(m.key_comp()), Comp);34    ASSERT_SAME_TYPE(decltype(m.value_comp()), M::value_compare);35    Comp kc = m.key_comp();36    assert(kc(1, 2));37    assert(!kc(2, 1));38    auto vc = m.value_comp();39    ASSERT_SAME_TYPE(decltype(vc(std::make_pair(1, 2), std::make_pair(1, 2))), bool);40    assert(vc({1, '2'}, {2, '1'}));41    assert(!vc({2, '1'}, {1, '2'}));42  }43  if (!TEST_IS_CONSTANT_EVALUATED) {44    using Comp = std::function<bool(int, int)>;45    using M    = std::flat_multimap<int, int, Comp>;46    Comp comp  = std::greater<int>();47    M m({}, comp);48    ASSERT_SAME_TYPE(M::key_compare, Comp);49    ASSERT_SAME_TYPE(decltype(m.key_comp()), Comp);50    ASSERT_SAME_TYPE(decltype(m.value_comp()), M::value_compare);51    Comp kc = m.key_comp();52    assert(!kc(1, 2));53    assert(kc(2, 1));54    auto vc = m.value_comp();55    auto a  = std::make_pair(1, 2);56    ASSERT_SAME_TYPE(decltype(vc(a, a)), bool);57    static_assert(!noexcept(vc(a, a)));58    assert(!vc({1, 2}, {2, 1}));59    assert(vc({2, 1}, {1, 2}));60  }61  {62    using Comp = std::less<>;63    using M    = std::flat_multimap<int, int, Comp>;64    M m        = {};65    ASSERT_SAME_TYPE(M::key_compare, Comp);66    ASSERT_SAME_TYPE(decltype(m.key_comp()), Comp);67    ASSERT_SAME_TYPE(decltype(m.value_comp()), M::value_compare);68    Comp kc = m.key_comp();69    assert(kc(1, 2));70    assert(!kc(2, 1));71    auto vc = m.value_comp();72    auto a  = std::make_pair(1, 2);73    ASSERT_SAME_TYPE(decltype(vc(a, a)), bool);74    assert(vc({1, 2}, {2, 1}));75    assert(!vc({2, 1}, {1, 2}));76  }77  if (!TEST_IS_CONSTANT_EVALUATED) {78    using Comp = std::function<bool(const std::vector<int>&, const std::vector<int>&)>;79    using M    = std::flat_multimap<std::vector<int>, int, Comp>;80    Comp comp  = [i = 1](const auto& x, const auto& y) { return x[i] < y[i]; };81    M m({}, comp);82    auto vc = m.value_comp();83    static_assert(sizeof(vc) >= sizeof(Comp));84    comp = nullptr;85    m    = M({}, nullptr);86    assert(m.key_comp() == nullptr);87    // At this point, m.key_comp() is disengaged.88    // But the std::function captured by copy inside `vc` remains valid.89    auto a = std::make_pair(std::vector<int>{2, 1, 4}, 42);90    auto b = std::make_pair(std::vector<int>{1, 2, 3}, 42);91    auto c = std::make_pair(std::vector<int>{0, 3, 2}, 42);92    assert(vc(a, b));93    assert(vc(b, c));94    assert(!vc(b, a));95    assert(!vc(c, b));96  }97 98  return true;99}100 101int main(int, char**) {102  test();103#if TEST_STD_VER >= 26104  static_assert(test());105#endif106 107  return 0;108}109