sandbox
Loading...
Searching...
No Matches
iterable_adaptor.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MEMORY_ITERABLE_ADAPTOR_HPP_
3#define LIBSBX_MEMORY_ITERABLE_ADAPTOR_HPP_
4
5#include <concepts>
6#include <iterator>
7
8namespace sbx::memory {
9
10template<std::forward_iterator Iterator, std::sentinel_for<Iterator> Sentinel = Iterator>
11class iterable_adaptor final {
12
13public:
14
15 using value_type = typename std::iterator_traits<Iterator>::value_type;
16 using iterator = Iterator;
17 using sentinel = Sentinel;
18
19 constexpr iterable_adaptor() noexcept(std::is_nothrow_default_constructible_v<iterator> && std::is_nothrow_default_constructible_v<sentinel>)
20 : _first{},
21 _last{} { }
22
23 constexpr iterable_adaptor(iterator from, sentinel to) noexcept(std::is_nothrow_move_constructible_v<iterator> && std::is_nothrow_move_constructible_v<sentinel>)
24 : _first{std::move(from)},
25 _last{std::move(to)} { }
26
27 [[nodiscard]] constexpr auto begin() const noexcept -> iterator {
28 return _first;
29 }
30
31 [[nodiscard]] constexpr auto end() const noexcept -> sentinel {
32 return _last;
33 }
34
35 [[nodiscard]] constexpr auto cbegin() const noexcept -> iterator {
36 return begin();
37 }
38
39 [[nodiscard]] constexpr auto cend() const noexcept -> sentinel {
40 return end();
41 }
42
43private:
44
45 iterator _first;
46 sentinel _last;
47
48}; // struct iterable_adaptor
49
50template<typename Type>
52
53public:
54
55 using value_type = Type;
56 using pointer = Type *;
57 using reference = Type &;
58
59 constexpr input_iterator_pointer(value_type&& value) noexcept(std::is_nothrow_move_constructible_v<value_type>)
60 : _value{std::move(value)} {}
61
62 [[nodiscard]] constexpr auto operator->() noexcept -> pointer {
63 return std::addressof(_value);
64 }
65
66 [[nodiscard]] constexpr auto operator*() noexcept -> reference {
67 return _value;
68 }
69
70private:
71
72 value_type _value;
73
74}; // struct input_iterator_pointer
75
76} // namespace sbx::memory
77
78#endif // LIBSBX_MEMORY_ITERABLE_ADAPTOR_HPP_
Definition: iterable_adaptor.hpp:51
Definition: iterable_adaptor.hpp:11