Iros
 
Loading...
Searching...
No Matches
take_view.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/util.h"
10#include "di/util/move.h"
11
12namespace di::container {
13template<concepts::View View>
15 : public ViewInterface<TakeView<View>>
16 , public meta::EnableBorrowedContainer<TakeView<View>, concepts::BorrowedContainer<View>> {
17private:
18 template<bool is_const>
20
21 template<bool is_const>
23
24 template<bool is_const>
26
27 template<bool is_const>
29
30 template<bool is_const>
31 class Sentinel {
32 public:
33 Sentinel() = default;
34
35 constexpr explicit Sentinel(Sent<is_const> sentinel) : m_sentinel(sentinel) {}
36
37 constexpr Sentinel(Sentinel<!is_const> other)
38 requires(is_const && concepts::ConvertibleTo<Sent<false>, Sent<true>>)
39 : m_sentinel(util::move(other.base())) {}
40
41 constexpr auto base() const { return m_sentinel; }
42
43 private:
44 constexpr friend auto operator==(CountedIterator<Iter<is_const>> const& a, Sentinel const& b) -> bool {
45 return a.count() == 0 || a.base() == b.base();
46 }
47
48 template<bool other_is_const = !is_const>
49 requires(concepts::SentinelFor<Sent<is_const>, Iter<other_is_const>>)
50 constexpr friend auto operator==(CountedIterator<Iter<other_is_const>> const& a, Sentinel const& b) -> bool {
51 return a.count() == 0 || a.base() == b.base();
52 }
53
54 Sent<is_const> m_sentinel;
55 };
56
57public:
60 = default;
61
62 constexpr TakeView(View base, SSizeType<false> count) : m_base(util::move(base)), m_count(count) {}
63
64 constexpr auto base() const& -> View
65 requires(concepts::CopyConstructible<View>)
66 {
67 return m_base;
68 }
69 constexpr auto base() && -> View { return util::move(m_base); }
70
71 constexpr auto begin()
73 {
74 if constexpr (concepts::SizedContainer<View>) {
76 return container::begin(m_base);
77 } else {
78 return CountedIterator(container::begin(m_base), static_cast<SSizeType<false>>(this->size()));
79 }
80 } else {
81 return CountedIterator(container::begin(m_base), m_count);
82 }
83 }
84
85 constexpr auto begin() const
86 requires(concepts::Container<View const>)
87 {
90 return container::begin(m_base);
91 } else {
92 return CountedIterator(container::begin(m_base), static_cast<SSizeType<true>>(this->size()));
93 }
94 } else {
95 return CountedIterator(container::begin(m_base), m_count);
96 }
97 }
98
99 constexpr auto end()
101 {
102 if constexpr (concepts::SizedContainer<View>) {
104 return container::begin(m_base) + static_cast<SSizeType<false>>(this->size());
105 } else {
106 return default_sentinel;
107 }
108 } else {
109 return Sentinel<false>(container::end(m_base));
110 }
111 }
112
113 constexpr auto end() const
114 requires(concepts::Container<View const>)
115 {
118 return container::begin(m_base) + static_cast<SSizeType<true>>(this->size());
119 } else {
120 return default_sentinel;
121 }
122 } else {
123 return Sentinel<true>(container::end(m_base));
124 }
125 }
126
127 constexpr auto size()
129 {
130 using SizeType = decltype(container::size(m_base));
131 return container::min(container::size(m_base), static_cast<SizeType>(m_count));
132 }
133
134 constexpr auto size() const
135 requires(concepts::SizedContainer<View const>)
136 {
137 using SizeType = decltype(container::size(m_base));
138 return container::min(container::size(m_base), static_cast<SizeType>(m_count));
139 }
140
141private:
142 View m_base;
143 SSizeType<false> m_count { 0 };
144};
145
146template<typename Con>
148}
Definition counted_iterator.h:18
Definition take_view.h:16
constexpr auto size()
Definition take_view.h:127
constexpr auto begin() const
Definition take_view.h:85
constexpr auto end() const
Definition take_view.h:113
constexpr TakeView(View base, SSizeType< false > count)
Definition take_view.h:62
constexpr auto begin()
Definition take_view.h:71
constexpr auto size() const
Definition take_view.h:134
constexpr auto end()
Definition take_view.h:99
constexpr auto base() &&-> View
Definition take_view.h:69
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition take_view.h:64
Definition view_interface.h:26
Definition view.h:35
Definition enable_borrowed_container.h:7
Definition operations.h:99
Definition operations.h:27
Definition random_access_container.h:8
Definition sentinel_for.h:9
Definition simple_view.h:11
Definition sized_container.h:8
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto min
Definition min.h:47
constexpr auto move
Definition move.h:38
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto size
Definition size.h:54
TakeView(Con &&, meta::ContainerSSizeType< Con >) -> TakeView< meta::AsView< Con > >
constexpr auto default_sentinel
Definition default_sentinel.h:6
constexpr auto count
Definition count.h:37
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
Conditional< is_const, T const, T > MaybeConst
Definition util.h:9
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Definition vocab.h:96