1*fe6060f1SDimitry Andric // -*- C++ -*- 2*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 3*fe6060f1SDimitry Andric // 4*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*fe6060f1SDimitry Andric // 8*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 9*fe6060f1SDimitry Andric #ifndef _LIBCPP___RANGES_ALL_H 10*fe6060f1SDimitry Andric #define _LIBCPP___RANGES_ALL_H 11*fe6060f1SDimitry Andric 12*fe6060f1SDimitry Andric #include <__config> 13*fe6060f1SDimitry Andric #include <__iterator/concepts.h> 14*fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h> 15*fe6060f1SDimitry Andric #include <__ranges/access.h> 16*fe6060f1SDimitry Andric #include <__ranges/concepts.h> 17*fe6060f1SDimitry Andric #include <__ranges/ref_view.h> 18*fe6060f1SDimitry Andric #include <__ranges/subrange.h> 19*fe6060f1SDimitry Andric #include <__utility/__decay_copy.h> 20*fe6060f1SDimitry Andric #include <__utility/declval.h> 21*fe6060f1SDimitry Andric #include <__utility/forward.h> 22*fe6060f1SDimitry Andric #include <type_traits> 23*fe6060f1SDimitry Andric 24*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25*fe6060f1SDimitry Andric #pragma GCC system_header 26*fe6060f1SDimitry Andric #endif 27*fe6060f1SDimitry Andric 28*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS 29*fe6060f1SDimitry Andric #include <__undef_macros> 30*fe6060f1SDimitry Andric 31*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 32*fe6060f1SDimitry Andric 33*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_RANGES) 34*fe6060f1SDimitry Andric 35*fe6060f1SDimitry Andric namespace views { 36*fe6060f1SDimitry Andric 37*fe6060f1SDimitry Andric namespace __all { 38*fe6060f1SDimitry Andric struct __fn { 39*fe6060f1SDimitry Andric template<class _Tp> 40*fe6060f1SDimitry Andric requires ranges::view<decay_t<_Tp>> 41*fe6060f1SDimitry Andric _LIBCPP_HIDE_FROM_ABI 42*fe6060f1SDimitry Andric constexpr auto operator()(_Tp&& __t) const 43*fe6060f1SDimitry Andric noexcept(noexcept(_VSTD::__decay_copy(_VSTD::forward<_Tp>(__t)))) 44*fe6060f1SDimitry Andric { 45*fe6060f1SDimitry Andric return _VSTD::forward<_Tp>(__t); 46*fe6060f1SDimitry Andric } 47*fe6060f1SDimitry Andric 48*fe6060f1SDimitry Andric template<class _Tp> 49*fe6060f1SDimitry Andric requires (!ranges::view<decay_t<_Tp>>) && 50*fe6060f1SDimitry Andric requires (_Tp&& __t) { ranges::ref_view{_VSTD::forward<_Tp>(__t)}; } 51*fe6060f1SDimitry Andric _LIBCPP_HIDE_FROM_ABI 52*fe6060f1SDimitry Andric constexpr auto operator()(_Tp&& __t) const 53*fe6060f1SDimitry Andric noexcept(noexcept(ranges::ref_view{_VSTD::forward<_Tp>(__t)})) 54*fe6060f1SDimitry Andric { 55*fe6060f1SDimitry Andric return ranges::ref_view{_VSTD::forward<_Tp>(__t)}; 56*fe6060f1SDimitry Andric } 57*fe6060f1SDimitry Andric 58*fe6060f1SDimitry Andric template<class _Tp> 59*fe6060f1SDimitry Andric requires (!ranges::view<decay_t<_Tp>> && 60*fe6060f1SDimitry Andric !requires (_Tp&& __t) { ranges::ref_view{_VSTD::forward<_Tp>(__t)}; } && 61*fe6060f1SDimitry Andric requires (_Tp&& __t) { ranges::subrange{_VSTD::forward<_Tp>(__t)}; }) 62*fe6060f1SDimitry Andric _LIBCPP_HIDE_FROM_ABI 63*fe6060f1SDimitry Andric constexpr auto operator()(_Tp&& __t) const 64*fe6060f1SDimitry Andric noexcept(noexcept(ranges::subrange{_VSTD::forward<_Tp>(__t)})) 65*fe6060f1SDimitry Andric { 66*fe6060f1SDimitry Andric return ranges::subrange{_VSTD::forward<_Tp>(__t)}; 67*fe6060f1SDimitry Andric } 68*fe6060f1SDimitry Andric }; 69*fe6060f1SDimitry Andric } 70*fe6060f1SDimitry Andric 71*fe6060f1SDimitry Andric inline namespace __cpo { 72*fe6060f1SDimitry Andric inline constexpr auto all = __all::__fn{}; 73*fe6060f1SDimitry Andric } // namespace __cpo 74*fe6060f1SDimitry Andric 75*fe6060f1SDimitry Andric template<ranges::viewable_range _Range> 76*fe6060f1SDimitry Andric using all_t = decltype(views::all(declval<_Range>())); 77*fe6060f1SDimitry Andric 78*fe6060f1SDimitry Andric } // namespace views 79*fe6060f1SDimitry Andric 80*fe6060f1SDimitry Andric #endif // !defined(_LIBCPP_HAS_NO_RANGES) 81*fe6060f1SDimitry Andric 82*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 83*fe6060f1SDimitry Andric 84*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS 85*fe6060f1SDimitry Andric 86*fe6060f1SDimitry Andric #endif // _LIBCPP___RANGES_ALL_H 87