14#ifndef RANGES_V3_RANGE_PRIMITIVES_HPP
15#define RANGES_V3_RANGE_PRIMITIVES_HPP
23#include <range/v3/utility/addressof.hpp>
24#include <range/v3/utility/static_const.hpp>
26#include <range/v3/detail/prologue.hpp>
33 RANGES_INLINE_VAR
constexpr bool disable_sized_range =
false;
39 void size(T &&) =
delete;
41#ifdef RANGES_WORKAROUND_MSVC_895622
49 CPP_requires(has_member_size_,
57 CPP_concept has_member_size =
58 CPP_requires_ref(_size_::has_member_size_, T);
63 CPP_requires(has_non_member_size_,
71 CPP_concept has_non_member_size =
72 CPP_requires_ref(_size_::has_non_member_size_, T);
78 struct _member_result_
81 using invoke =
decltype(+(declval(R &).size()));
83 struct _non_member_result_
86 using invoke =
decltype(+(
size(declval(R &))));
88 struct _distance_result_
91 using invoke = detail::iter_size_t<_begin_::_t<R>>;
99 has_non_member_size<R>,
115 template<
typename R, std::
size_t N>
116 constexpr std::size_t operator()(R (&)[N],
int)
const noexcept
121 template<
typename R, std::
size_t N>
122 constexpr std::size_t operator()(R(&&)[N])
const noexcept
128 template(
typename R)(
129 requires (!disable_sized_range<uncvref_t<R>>) AND
130 has_member_size<R> AND detail::integer_like_<_result_t<R>>)
131 constexpr _result_t<R>
operator()(R && r)
const
132 noexcept(
noexcept(((R &&) r).size()))
134 return ((R &&) r).
size();
138 template(
typename R)(
139 requires (!disable_sized_range<uncvref_t<R>>) AND
140 (!has_member_size<R>) AND has_non_member_size<R> AND
141 detail::integer_like_<_result_t<R>>)
142 constexpr _result_t<R>
operator()(R && r)
const
143 noexcept(
noexcept(
size((R &&) r)))
145 return size((R &&) r);
148 template(
typename R)(
149 requires (!has_member_size<R> || disable_sized_range<uncvref_t<R>>) AND
150 (!has_non_member_size<R> || disable_sized_range<uncvref_t<R>>) AND
151 forward_iterator<_begin_::_t<R>> AND
152 sized_sentinel_for<_end_::_t<R>, _begin_::_t<R>>)
153 constexpr _result_t<R> operator()(R && r) const
154 noexcept(noexcept(ranges::end((R &&) r) - ranges::begin((R &&) r)))
156 using size_type = detail::iter_size_t<_begin_::_t<R>>;
157 return static_cast<size_type
>(ranges::end((R &&) r) -
158 ranges::begin((R &&) r));
186 RANGES_DEFINE_CPO(_size_::fn, size)
196 CPP_requires(has_member_data_,
204 CPP_concept has_member_data =
205 CPP_requires_ref(_data_::has_member_data_, T);
214 using invoke =
decltype(+(declval(R &&).data()));
216 struct _pointer_iterator_
219 using invoke = _begin_::_t<R>;
221 struct _contiguous_iterator_
224 using invoke =
decltype(detail::addressof(*declval(_begin_::_t<R> &&)));
226 struct _other_result_
232 std::is_pointer<_begin_::_t<R>>::value,
234 _contiguous_iterator_>,
248 template(
typename R)(
249 requires has_member_data<R &> AND
250 std::is_pointer<_result_t<R &>>::value)
251 constexpr _result_t<R &> operator()(R & r)
const
252 noexcept(
noexcept(r.data()))
256 template(
typename R)(
257 requires (!has_member_data<R &>) AND
258 std::is_pointer<_begin_::_t<R>>::value)
259 constexpr _result_t<R>
operator()(R && r)
const
260 noexcept(
noexcept(ranges::begin((R &&) r)))
262 return ranges::begin((R &&) r);
264 template(
typename R)(
265 requires (!has_member_data<R &>) AND
266 (!std::is_pointer<_begin_::_t<R>>::value) AND
267 contiguous_iterator<_begin_::_t<R>>)
268 constexpr _result_t<R>
operator()(R && r)
const
270 ranges::begin((R &&) r) == ranges::end((R &&) r)
272 : detail::addressof(*ranges::begin((R &&) r))))
274 return ranges::begin((R &&) r) == ranges::end((R &&) r)
276 : detail::addressof(*ranges::begin((R &&) r));
279#if RANGES_CXX_STD <= RANGES_CXX_STD_14
280 template<
typename charT,
typename Traits,
typename Alloc>
281 constexpr charT * operator()(
282 std::basic_string<charT, Traits, Alloc> & s)
const noexcept
285 return const_cast<charT *
>(detail::as_const(s).data());
291 using _t =
decltype(fn{}(declval(R &&)));
295 RANGES_INLINE_VARIABLE(_data_::fn, data)
303 constexpr _data_::_t<R const &> operator()(R
const & r)
const
304 noexcept(
noexcept(ranges::data(r)))
306 return ranges::data(r);
309 constexpr _data_::_t<R const> operator()(R
const && r)
const
310 noexcept(
noexcept(ranges::data((R
const &&)r)))
312 return ranges::data((R
const &&)r);
322 RANGES_INLINE_VARIABLE(_cdata_::fn, cdata)
331 CPP_requires(has_member_empty_,
334 bool(((T &&) t).
empty())
339 CPP_concept has_member_empty =
340 CPP_requires_ref(_empty_::has_member_empty_, T);
345 CPP_requires(has_size_,
348 ranges::size((T &&) t)
353 CPP_concept has_size =
354 CPP_requires_ref(_empty_::has_size_, T);
360 template(
typename R)(
361 requires has_member_empty<R>)
362 constexpr bool operator()(R && r)
const
363 noexcept(
noexcept(bool(((R &&) r).
empty())))
365 return bool(((R &&) r).
empty());
369 template(
typename R)(
370 requires (!has_member_empty<R>) AND has_size<R>)
371 constexpr bool operator()(R && r)
const
372 noexcept(
noexcept(
bool(ranges::size((R &&) r) == 0)))
374 return bool(ranges::size((R &&) r) == 0);
378 template(
typename R)(
379 requires (!has_member_empty<R>) AND (!has_size<R>) AND
380 forward_iterator<_begin_::_t<R>>)
381 constexpr bool operator()(R && r)
const
382 noexcept(
noexcept(
bool(ranges::begin((R &&) r) == ranges::end((R &&) r))))
384 return bool(ranges::begin((R &&) r) == ranges::end((R &&) r));
392 RANGES_INLINE_VARIABLE(_empty_::fn, empty)
399 using ranges::disable_sized_range;
405#include <range/v3/detail/epilogue.hpp>
typename T::type _t
Type alias for T::type.
Definition meta.hpp:141
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition meta.hpp:541
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition meta.hpp:1696
bool_< 0==size< L >::type::value > empty
An Boolean integral constant wrapper around true if L is an empty type list; false,...
Definition meta.hpp:2231
typename detail::_cond< If >::template invoke< Then, Else > conditional_t
Select one type or another depending on a compile-time Boolean.
Definition meta.hpp:1148