194461822SHui Xie //===---------------------------------------------------------------------===// 294461822SHui Xie // 394461822SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 494461822SHui Xie // See https://llvm.org/LICENSE.txt for license information. 594461822SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 694461822SHui Xie // 794461822SHui Xie //===---------------------------------------------------------------------===// 894461822SHui Xie 994461822SHui Xie #ifndef _LIBCPP___FWD_SUBRANGE_H 1094461822SHui Xie #define _LIBCPP___FWD_SUBRANGE_H 1194461822SHui Xie 12f9d6d6fbSNikolas Klauser #include <__concepts/copyable.h> 1394461822SHui Xie #include <__config> 14*d6832a61SLouis Dionne #include <__cstddef/size_t.h> 15f9d6d6fbSNikolas Klauser #include <__iterator/concepts.h> 1694461822SHui Xie 1794461822SHui Xie #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1894461822SHui Xie # pragma GCC system_header 1994461822SHui Xie #endif 2094461822SHui Xie 2194461822SHui Xie #if _LIBCPP_STD_VER >= 20 2294461822SHui Xie 2394461822SHui Xie _LIBCPP_BEGIN_NAMESPACE_STD 2494461822SHui Xie 2594461822SHui Xie namespace ranges { 2694461822SHui Xie 273583bf3aSNikolas Klauser enum class subrange_kind : bool { unsized, sized }; 2894461822SHui Xie 2994461822SHui Xie template <input_or_output_iterator _Iter, sentinel_for<_Iter> _Sent, subrange_kind _Kind> 3094461822SHui Xie requires(_Kind == subrange_kind::sized || !sized_sentinel_for<_Sent, _Iter>) 3194461822SHui Xie class _LIBCPP_TEMPLATE_VIS subrange; 3294461822SHui Xie 33f9d6d6fbSNikolas Klauser template <size_t _Index, class _Iter, class _Sent, subrange_kind _Kind> 34f9d6d6fbSNikolas Klauser requires((_Index == 0 && copyable<_Iter>) || _Index == 1) 35f9d6d6fbSNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr auto get(const subrange<_Iter, _Sent, _Kind>&); 36f9d6d6fbSNikolas Klauser 37f9d6d6fbSNikolas Klauser template <size_t _Index, class _Iter, class _Sent, subrange_kind _Kind> 38f9d6d6fbSNikolas Klauser requires(_Index < 2) 39f9d6d6fbSNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr auto get(subrange<_Iter, _Sent, _Kind>&&); 40f9d6d6fbSNikolas Klauser 4194461822SHui Xie } // namespace ranges 4294461822SHui Xie 43f9d6d6fbSNikolas Klauser using ranges::get; 44f9d6d6fbSNikolas Klauser 4594461822SHui Xie _LIBCPP_END_NAMESPACE_STD 4694461822SHui Xie 4794461822SHui Xie #endif // _LIBCPP_STD_VER >= 20 4894461822SHui Xie 4994461822SHui Xie #endif // _LIBCPP___FWD_SUBRANGE_H 50