//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17

// class std::ranges::subrange;

#include <ranges>

#include <cassert>
#include <cstddef>

#include "test_iterators.h"

using FI = forward_iterator<int*>;
FI fi{nullptr};
int *ptr = nullptr;

static_assert(std::same_as<decltype(std::ranges::subrange(fi, fi)),
                           std::ranges::subrange<FI, FI, std::ranges::subrange_kind::unsized>>);
static_assert(std::same_as<decltype(std::ranges::subrange(ptr, ptr, 0)),
                           std::ranges::subrange<int*, int*, std::ranges::subrange_kind::sized>>);
static_assert(std::same_as<decltype(std::ranges::subrange(ptr, nullptr, 0)),
                           std::ranges::subrange<int*, std::nullptr_t, std::ranges::subrange_kind::sized>>);

struct ForwardRange {
  forward_iterator<int*> begin() const;
  forward_iterator<int*> end() const;
};
template<>
inline constexpr bool std::ranges::enable_borrowed_range<ForwardRange> = true;

struct SizedRange {
  int *begin();
  int *end();
};
template<>
inline constexpr bool std::ranges::enable_borrowed_range<SizedRange> = true;

static_assert(std::same_as<decltype(std::ranges::subrange(ForwardRange())),
                           std::ranges::subrange<FI, FI, std::ranges::subrange_kind::unsized>>);
static_assert(std::same_as<decltype(std::ranges::subrange(SizedRange())),
                           std::ranges::subrange<int*, int*, std::ranges::subrange_kind::sized>>);
static_assert(std::same_as<decltype(std::ranges::subrange(SizedRange(), 8)),
                           std::ranges::subrange<int*, int*, std::ranges::subrange_kind::sized>>);
