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