brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 326cabd Raw
67 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++1710 11// constexpr drop_while_view(V base, Pred pred); // explicit since C++2312 13#include <cassert>14#include <ranges>15#include <type_traits>16#include <utility>17 18#include "MoveOnly.h"19#include "test_convertible.h"20#include "test_macros.h"21 22struct View : std::ranges::view_base {23  MoveOnly mo;24  int* begin() const;25  int* end() const;26};27 28struct Pred {29  bool copied      = false;30  bool moved       = false;31  constexpr Pred() = default;32  constexpr Pred(Pred&&) : moved(true) {}33  constexpr Pred(const Pred&) : copied(true) {}34  bool operator()(int) const;35};36 37// SFINAE tests.38 39#if TEST_STD_VER >= 2340 41static_assert(!test_convertible<std::ranges::drop_while_view<View, Pred>, View, Pred>(),42              "This constructor must be explicit");43 44#else45 46static_assert( test_convertible<std::ranges::drop_while_view<View, Pred>, View, Pred>(),47              "This constructor must not be explicit");48 49#endif // TEST_STD_VER >= 2350 51constexpr bool test() {52  {53    std::ranges::drop_while_view<View, Pred> dwv{View{{}, MoveOnly{5}}, Pred{}};54    assert(dwv.pred().moved);55    assert(!dwv.pred().copied);56    assert(std::move(dwv).base().mo.get() == 5);57  }58  return true;59}60 61int main(int, char**) {62  test();63  static_assert(test());64 65  return 0;66}67