tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
indirectly_readable_traits.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP
5#define TETL_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP
6
7#include <etl/_concepts/same_as.hpp>
8#include <etl/_type_traits/is_array.hpp>
9#include <etl/_type_traits/is_object.hpp>
10#include <etl/_type_traits/remove_cv.hpp>
11#include <etl/_type_traits/remove_extent.hpp>
12
13namespace etl {
14
15namespace detail {
16
17template <typename>
18struct maybe_value_type { };
19
20template <typename T>
21 requires etl::is_object_v<T>
22struct maybe_value_type<T> {
23 using value_type = etl::remove_cv_t<T>;
24};
25
26template <typename T>
27concept has_member_value_type = requires { typename T::value_type; };
28
29template <typename T>
30concept has_member_element_type = requires { typename T::element_type; };
31
32} // namespace detail
33
34template <typename I>
36
37template <typename T>
39
40template <typename T>
41struct indirectly_readable_traits<T*> : detail::maybe_value_type<T> { };
42
43template <typename I>
44 requires etl::is_array_v<I>
46 using value_type = etl::remove_cv_t<etl::remove_extent_t<I>>;
47};
48
49template <detail::has_member_value_type T>
50struct indirectly_readable_traits<T> : detail::maybe_value_type<typename T::value_type> { };
51
52template <detail::has_member_element_type T>
53struct indirectly_readable_traits<T> : detail::maybe_value_type<typename T::element_type> { };
54
55template <detail::has_member_value_type T>
56 requires detail::has_member_element_type<T>
57struct indirectly_readable_traits<T> { };
58
59template <detail::has_member_value_type T>
60 requires(
61 detail::has_member_element_type<T>
62 and etl::same_as<etl::remove_cv_t<typename T::element_type>, etl::remove_cv_t<typename T::value_type>>
63 )
64struct indirectly_readable_traits<T> : detail::maybe_value_type<typename T::value_type> { };
65
66} // namespace etl
67
68#endif // TETL_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP
Definition adjacent_find.hpp:9
Definition indirectly_readable_traits.hpp:35