5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_TYPE_TRAITS_ITERATOR_CATEGORY_TRAITS_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_TYPE_TRAITS_ITERATOR_CATEGORY_TRAITS_HPP_
11#include "arene/base/constraints/constraints.hpp"
12#include "arene/base/stdlib_choice/declval.hpp"
13#include "arene/base/stdlib_choice/enable_if.hpp"
14#include "arene/base/stdlib_choice/is_assignable.hpp"
15#include "arene/base/stdlib_choice/is_base_of.hpp"
16#include "arene/base/stdlib_choice/is_convertible.hpp"
17#include "arene/base/stdlib_choice/is_copy_assignable.hpp"
18#include "arene/base/stdlib_choice/is_copy_constructible.hpp"
19#include "arene/base/stdlib_choice/is_default_constructible.hpp"
20#include "arene/base/stdlib_choice/is_integral.hpp"
21#include "arene/base/stdlib_choice/is_pointer.hpp"
22#include "arene/base/stdlib_choice/is_reference.hpp"
23#include "arene/base/stdlib_choice/is_same.hpp"
24#include "arene/base/stdlib_choice/is_signed.hpp"
25#include "arene/base/stdlib_choice/iterator_tags.hpp"
26#include "arene/base/stdlib_choice/iterator_traits.hpp"
27#include "arene/base/stdlib_choice/remove_cv.hpp"
28#include "arene/base/stdlib_choice/remove_reference.hpp"
29#include "arene/base/type_manipulation/give_qualifiers_to.hpp"
30#include "arene/base/type_manipulation/static_if.hpp"
31#include "arene/base/type_traits/comparison_traits.hpp"
32#include "arene/base/type_traits/remove_cvref.hpp"
37namespace iterator_category_detail {
49template <
typename T,
typename = constraints<>>
50constexpr bool is_basic_iterator_v =
false;
55constexpr bool is_basic_iterator_v<
58 typename std::iterator_traits<T>::iterator_category,
59 std::enable_if_t<std::is_copy_constructible<T>::value>,
60 std::enable_if_t<std::is_copy_assignable<T>::value>,
61 std::enable_if_t<std::is_same<T&,
decltype(++std::declval<T&>())>::value>,
62 decltype(*std::declval<T&>())&,
63 decltype(*std::declval<T&>()++)&>> =
true;
68template <
typename T,
typename = constraints<>>
69constexpr bool has_output_iterator_category_v =
false;
74constexpr bool has_output_iterator_category_v<
76 constraints<std::enable_if_t<
77 std::is_base_of<std::output_iterator_tag,
typename std::iterator_traits<T>::iterator_category>::value>>> =
true;
84template <
class T1,
class T2,
class X>
85using add_cv_union_t = arene::base::give_qualifiers_to<T2, arene::base::give_qualifiers_to<T1, X>>;
92template <
typename T1,
typename T2,
typename = constraints<>>
93class simple_common_lvalue_reference {};
100template <
typename T1,
typename T2>
101class simple_common_lvalue_reference<
104 constraints<std::enable_if_t<std::is_reference<
105 decltype(
false ? std::declval<add_cv_union_t<T1, T2, T1>&>() : std::declval<add_cv_union_t<T1, T2, T2>&>())>::
110 decltype(
false ? std::declval<add_cv_union_t<T1, T2, T1>&>() : std::declval<add_cv_union_t<T1, T2, T2>&>());
118template <
typename T1,
typename T2>
119using simple_common_lvalue_reference_t =
typename simple_common_lvalue_reference<T1, T2>::type;
126template <
typename T1,
typename T2,
typename = constraints<>>
127class simple_common_reference {};
134template <
typename T1,
typename T2>
135using simple_common_reference_t =
typename simple_common_reference<T1, T2>::type;
142template <
typename T1,
typename T2>
143class simple_common_reference<T1&, T2&, constraints<simple_common_lvalue_reference_t<T1&, T2&>>> {
146 using type = simple_common_lvalue_reference_t<T1&, T2&>;
154template <
typename T1,
typename T2>
155class simple_common_reference<
160 std::is_convertible<T1&&, std::remove_reference_t<simple_common_reference_t<T1&, T2&>>&&>::value>,
162 std::is_convertible<T2&&, std::remove_reference_t<simple_common_reference_t<T1&, T2&>>&&>::value>>> {
165 using type = std::remove_reference_t<simple_common_reference_t<T1&, T2&>>&&;
173template <
typename A,
typename B>
174class simple_common_reference<
177 constraints<std::enable_if_t<std::is_convertible<B&&, simple_common_reference_t<A&, B
const&>>::value>>> {
180 using type = simple_common_reference_t<A&, B
const&>;
188template <
typename A,
typename B>
189class simple_common_reference<B&&, A&> :
public simple_common_reference<A&, B&&> {};
199template <
typename T,
typename U,
typename = constraints<>>
200constexpr bool have_common_type_v =
false;
205template <
typename T,
typename U>
206constexpr bool have_common_type_v<
210 std::enable_if_t<std::is_reference<T>::value && std::is_reference<U>::value>,
211 simple_common_reference_t<T, U>>> =
true;
216template <
typename T,
typename U>
217constexpr bool have_common_type_v<
221 std::enable_if_t<!(std::is_reference<T>::value && std::is_reference<U>::value)>,
222 decltype(
false ? std::declval<T>() : std::declval<U>())>> =
true;
229template <
typename T,
typename = constraints<>>
230constexpr bool has_valid_pointer_trait_v =
231 std::is_same<
typename std::iterator_traits<T>::pointer,
void>::value || std::is_pointer<T>::value;
236constexpr bool has_valid_pointer_trait_v<T, constraints<
decltype(std::declval<T&>().operator->())>> =
237 std::is_same<
typename std::iterator_traits<T>::pointer,
decltype(std::declval<T&>().operator->())>::value;
244template <
typename T,
typename = constraints<>>
245constexpr bool is_output_iterator_v =
false;
258template <
typename T,
typename = constraints<>>
259constexpr bool is_input_iterator_v =
false;
289template <
typename T,
typename = constraints<>>
290constexpr bool is_forward_iterator_v =
false;
311template <
typename T,
typename = constraints<>>
312constexpr bool is_bidirectional_iterator_v =
false;
331template <
typename T,
typename = constraints<>>
332constexpr bool is_random_access_iterator_v =
false;
375constexpr bool is_iterator_v =
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10