File indexing completed on 2026-05-03 08:13:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___CXX03___RANGES_SIZE_H
0011 #define _LIBCPP___CXX03___RANGES_SIZE_H
0012
0013 #include <__cxx03/__concepts/arithmetic.h>
0014 #include <__cxx03/__concepts/class_or_enum.h>
0015 #include <__cxx03/__config>
0016 #include <__cxx03/__iterator/concepts.h>
0017 #include <__cxx03/__iterator/iterator_traits.h>
0018 #include <__cxx03/__ranges/access.h>
0019 #include <__cxx03/__type_traits/decay.h>
0020 #include <__cxx03/__type_traits/make_signed.h>
0021 #include <__cxx03/__type_traits/make_unsigned.h>
0022 #include <__cxx03/__type_traits/remove_cvref.h>
0023 #include <__cxx03/__utility/auto_cast.h>
0024 #include <__cxx03/__utility/declval.h>
0025 #include <__cxx03/cstddef>
0026
0027 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0028 # pragma GCC system_header
0029 #endif
0030
0031 _LIBCPP_BEGIN_NAMESPACE_STD
0032
0033 #if _LIBCPP_STD_VER >= 20
0034
0035 namespace ranges {
0036 template <class>
0037 inline constexpr bool disable_sized_range = false;
0038 }
0039
0040
0041
0042 namespace ranges {
0043 namespace __size {
0044 void size() = delete;
0045
0046 template <class _Tp>
0047 concept __size_enabled = !disable_sized_range<remove_cvref_t<_Tp>>;
0048
0049 template <class _Tp>
0050 concept __member_size = __size_enabled<_Tp> && requires(_Tp&& __t) {
0051 { _LIBCPP_AUTO_CAST(__t.size()) } -> __integer_like;
0052 };
0053
0054 template <class _Tp>
0055 concept __unqualified_size =
0056 __size_enabled<_Tp> && !__member_size<_Tp> && __class_or_enum<remove_cvref_t<_Tp>> && requires(_Tp&& __t) {
0057 { _LIBCPP_AUTO_CAST(size(__t)) } -> __integer_like;
0058 };
0059
0060 template <class _Tp>
0061 concept __difference =
0062 !__member_size<_Tp> && !__unqualified_size<_Tp> && __class_or_enum<remove_cvref_t<_Tp>> && requires(_Tp&& __t) {
0063 { ranges::begin(__t) } -> forward_iterator;
0064 { ranges::end(__t) } -> sized_sentinel_for<decltype(ranges::begin(std::declval<_Tp>()))>;
0065 };
0066
0067 struct __fn {
0068
0069 template <class _Tp, size_t _Sz>
0070 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_t operator()(_Tp (&&)[_Sz]) const noexcept {
0071 return _Sz;
0072 }
0073
0074
0075 template <class _Tp, size_t _Sz>
0076 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_t operator()(_Tp (&)[_Sz]) const noexcept {
0077 return _Sz;
0078 }
0079
0080
0081 template <__member_size _Tp>
0082 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __integer_like auto operator()(_Tp&& __t) const
0083 noexcept(noexcept(_LIBCPP_AUTO_CAST(__t.size()))) {
0084 return _LIBCPP_AUTO_CAST(__t.size());
0085 }
0086
0087
0088 template <__unqualified_size _Tp>
0089 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __integer_like auto operator()(_Tp&& __t) const
0090 noexcept(noexcept(_LIBCPP_AUTO_CAST(size(__t)))) {
0091 return _LIBCPP_AUTO_CAST(size(__t));
0092 }
0093
0094
0095 template <__difference _Tp>
0096 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t) const
0097 noexcept(noexcept(std::__to_unsigned_like(ranges::end(__t) - ranges::begin(__t))))
0098 -> decltype(std::__to_unsigned_like(ranges::end(__t) - ranges::begin(__t))) {
0099 return std::__to_unsigned_like(ranges::end(__t) - ranges::begin(__t));
0100 }
0101 };
0102
0103 }
0104
0105 inline namespace __cpo {
0106 inline constexpr auto size = __size::__fn{};
0107 }
0108 }
0109
0110
0111
0112 namespace ranges {
0113 namespace __ssize {
0114 struct __fn {
0115 template <class _Tp>
0116 requires requires(_Tp&& __t) { ranges::size(__t); }
0117 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr integral auto operator()(_Tp&& __t) const
0118 noexcept(noexcept(ranges::size(__t))) {
0119 using _Signed = make_signed_t<decltype(ranges::size(__t))>;
0120 if constexpr (sizeof(ptrdiff_t) > sizeof(_Signed))
0121 return static_cast<ptrdiff_t>(ranges::size(__t));
0122 else
0123 return static_cast<_Signed>(ranges::size(__t));
0124 }
0125 };
0126 }
0127
0128 inline namespace __cpo {
0129 inline constexpr auto ssize = __ssize::__fn{};
0130 }
0131 }
0132
0133 #endif
0134
0135 _LIBCPP_END_NAMESPACE_STD
0136
0137 #endif