Iros
 
Loading...
Searching...
No Matches
drop_view.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/util/move.h"
10#include "di/util/store_if.h"
11
12namespace di::container {
13template<concepts::View View>
15 : public ViewInterface<DropView<View>>
16 , public meta::EnableBorrowedContainer<DropView<View>, concepts::BorrowedContainer<View>> {
17private:
18 constexpr static bool need_cache =
20
21 using SSizeType = meta::ContainerSSizeType<View>;
22
23public:
26 = default;
27
28 constexpr DropView(View base, SSizeType count) : m_base(util::move(base)), m_count(count) {}
29
30 constexpr auto base() const& -> View
31 requires(concepts::CopyConstructible<View>)
32 {
33 return m_base;
34 }
35 constexpr auto base() && -> View { return util::move(m_base); }
36
37 constexpr auto begin()
38 requires(!concepts::SimpleView<View> || need_cache)
39 {
40 if constexpr (need_cache) {
41 if (m_begin_cache.value.has_value()) {
42 return m_begin_cache.value.value();
43 }
44 return m_begin_cache.value.emplace(
45 container::next(container::begin(m_base), m_count, container::end(m_base)));
46 } else {
47 return container::next(container::begin(m_base), m_count, container::end(m_base));
48 }
49 }
50
51 constexpr auto begin() const
52 requires(!need_cache)
53 {
54 return container::next(container::begin(m_base), m_count, container::end(m_base));
55 }
56
57 constexpr auto end()
59 {
60 return container::end(m_base);
61 }
62
63 constexpr auto end() const
64 requires(concepts::Container<View const>)
65 {
66 return container::end(m_base);
67 }
68
69 constexpr auto size()
71 {
72 using SizeType = meta::ContainerSizeType<View>;
73 auto size = container::size(m_base);
74 auto count = static_cast<SizeType>(m_count);
75 return size < count ? 0 : size - count;
76 }
77
78 constexpr auto size() const
79 requires(concepts::SizedContainer<View const>)
80 {
82 auto size = container::size(m_base);
83 auto count = static_cast<SizeType>(m_count);
84 return size < count ? 0 : size - count;
85 }
86
87private:
88 View m_base;
89 SSizeType m_count { 0 };
91 m_begin_cache;
92};
93
94template<typename Con>
96}
Definition drop_view.h:16
constexpr auto begin() const
Definition drop_view.h:51
constexpr auto size()
Definition drop_view.h:69
constexpr auto end()
Definition drop_view.h:57
constexpr auto begin()
Definition drop_view.h:37
constexpr DropView(View base, SSizeType count)
Definition drop_view.h:28
constexpr auto base() &&-> View
Definition drop_view.h:35
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition drop_view.h:30
constexpr auto end() const
Definition drop_view.h:63
constexpr auto size() const
Definition drop_view.h:78
Definition view_interface.h:26
Definition view.h:35
Definition enable_borrowed_container.h:7
Definition operations.h:27
Definition random_access_container.h:8
Definition simple_view.h:11
Definition sized_container.h:8
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto next
Definition next.h:35
DropView(Con &&, meta::ContainerSSizeType< Con >) -> DropView< meta::AsView< Con > >
constexpr auto move
Definition move.h:38
constexpr auto size
Definition size.h:54
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::size(util::declval< T >())) ContainerSizeType
Definition container_size_type.h:8
Definition vocab.h:96
Definition store_if.h:7