5 #ifndef VCCC_RANGES_BEGIN_HPP_
6 #define VCCC_RANGES_BEGIN_HPP_
25 using vccc::detail::return_category;
27 template<
typename T,
bool = std::is_array<remove_cvref_t<T>>::value>
28 struct begin_array_check : std::false_type {
29 using category = return_category<0>;
32 struct begin_array_check<T, true> : std::true_type {
33 using category = return_category<1, decltype(std::declval<T>() + 0)>;
36 template<
typename T,
typename =
void>
37 struct begin_member_check : std::false_type {
38 using category = return_category<0>;
42 : input_or_output_iterator<decltype(vccc_decay_copy(std::declval<T>().begin()))> {
43 using category = return_category<2, decltype(vccc_decay_copy(std::declval<T>().begin()))>;
46 template<
typename T,
typename =
void>
47 struct begin_global_check : std::false_type {
48 using category = return_category<0>;
52 : input_or_output_iterator<decltype(vccc_decay_copy(begin(std::declval<T>())))> {
53 using category = return_category<3, decltype(vccc_decay_copy(begin(std::declval<T>())))>;
57 struct begin_category_impl_2 : begin_global_check<T> {};
59 struct begin_category_impl_2<T, true> : begin_member_check<T> {};
62 struct begin_category_impl : begin_category_impl_2<T> {};
64 struct begin_category_impl<T, true> : begin_array_check<T> {};
70 std::is_lvalue_reference<T>,
71 enable_borrowed_range<remove_cvref_t<T>>
73 typename begin_category_impl<T>::category,
77 template<
typename T,
typename R>
78 constexpr R ranges_begin(T&& t, return_category<1, R>) {
79 static_assert(
is_complete<std::remove_all_extents_t<std::remove_reference_t<T>>>::
value,
"Array element must be complete type");
83 template<
typename T,
typename R>
84 constexpr R ranges_begin(T&& t, return_category<2, R>) {
88 template<
typename T,
typename R>
89 constexpr R ranges_begin(T&& t, return_category<3, R>) {
93 struct begin_niebloid {
95 constexpr
typename begin_category<T&&>::return_type
96 operator()(T&& t)
const {
97 return ranges_begin(std::forward<T>(t), detail::begin_category<T&&>{});
120 using namespace niebloid;
#define vccc_decay_copy(x)
Definition: decay_copy.hpp:12
constexpr VCCC_INLINE_OR_STATIC detail::begin_niebloid begin
returns an iterator to the beginning of a range
Definition: begin.hpp:116
decltype(detail::is_complete_impl(std::declval< T * >())) is_complete
Definition: is_complete.hpp:23
#define VCCC_INLINE_OR_STATIC
Definition: inline_or_static.hpp:9
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35