tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
ranges_iter_move.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2024 Tobias Hienzsch
3
4#ifndef TETL_ITERATOR_RANGES_ITER_MOVE_HPP
5#define TETL_ITERATOR_RANGES_ITER_MOVE_HPP
6
7#include <etl/_type_traits/is_class.hpp>
8#include <etl/_type_traits/is_enum.hpp>
9#include <etl/_type_traits/is_lvalue_reference.hpp>
10#include <etl/_type_traits/remove_cvref.hpp>
11#include <etl/_utility/forward.hpp>
12#include <etl/_utility/move.hpp>
13
14namespace etl::ranges {
15
16namespace iter_move_cpo {
17
18auto iter_move() -> void = delete;
19
20template <typename T>
21concept adl_iter_move = (is_class_v<remove_cvref_t<T>> or is_enum_v<remove_cvref_t<T>>)
22 and requires(T&& t) { iter_move(etl::forward<T>(t)); };
23
24template <typename T>
25concept can_move = not adl_iter_move<T> and requires(T&& t) {
26 *t;
27 requires is_lvalue_reference_v<decltype(*t)>;
28};
29
30template <typename T>
31concept can_deref = not adl_iter_move<T> and !can_move<T> and requires(T&& t) {
32 *t;
33 requires(!is_lvalue_reference_v<decltype(*t)>);
34};
35
36struct fn {
37 template <adl_iter_move Iter>
38 [[nodiscard]] constexpr auto operator()(Iter&& i) const noexcept(noexcept(iter_move(etl::forward<Iter>(i))))
39 -> decltype(auto)
40 {
41 return iter_move(etl::forward<Iter>(i));
42 }
43
44 template <can_move Iter>
45 [[nodiscard]] constexpr auto operator()(Iter&& i) const noexcept(noexcept(etl::move(*etl::forward<Iter>(i))))
46 -> decltype(etl::move(*etl::forward<Iter>(i)))
47 {
48 return etl::move(*etl::forward<Iter>(i));
49 }
50
51 template <can_deref Iter>
52 [[nodiscard]] constexpr auto operator()(Iter&& i) const noexcept(noexcept(*etl::forward<Iter>(i)))
53 -> decltype(*etl::forward<Iter>(i))
54 {
55 return *etl::forward<Iter>(i);
56 }
57};
58
59} // namespace iter_move_cpo
60
61inline namespace cpo {
62/// \ingroup iterator
63inline constexpr auto iter_move = iter_move_cpo::fn{};
64} // namespace cpo
65
66} // namespace etl::ranges
67
68#endif // TETL_ITERATOR_RANGES_ITER_MOVE_HPP
constexpr auto iter_move
Definition ranges_iter_move.hpp:63
Definition ranges_iter_move.hpp:61
Definition ranges_in_fun_result.hpp:12
Definition adjacent_find.hpp:9