Iros
 
Loading...
Searching...
No Matches
ref_view.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/language.h"
11#include "di/meta/util.h"
12#include "di/util/declval.h"
13#include "di/util/forward.h"
15
16namespace di::container {
17template<concepts::Container Cont>
18requires(concepts::Object<Cont>)
20 : public ViewInterface<RefView<Cont>>
21 , public meta::EnableBorrowedContainer<RefView<Cont>> {
22private:
23 template<typename X>
24 constexpr static void delete_rvalues(X&);
25
26public:
27 template<typename X>
28 constexpr static void delete_rvalues(X&&) = delete;
29
30 template<typename T>
31 requires(!concepts::DecaySameAs<T, RefView> && requires { delete_rvalues(util::declval<T>()); })
32 constexpr RefView(T&& container) : m_container(static_cast<Cont&>(util::forward<T>(container))) {}
33
34 constexpr auto base() const -> Cont& { return m_container.get(); }
35
36 constexpr auto begin() const { return container::begin(m_container.get()); }
37 constexpr auto end() const { return container::end(m_container.get()); }
38
39 constexpr auto empty() const -> bool
40 requires(concepts::HasEmptyContainer<Cont>)
41 {
42 return container::empty(m_container.get());
43 }
44
45 constexpr auto size() const
46 requires(concepts::SizedContainer<Cont>)
47 {
48 return container::size(m_container.get());
49 }
50
51 constexpr auto data() const
52 requires(concepts::ContiguousContainer<Cont>)
53 {
54 return container::data(m_container.get());
55 }
56
57private:
58 template<typename T, typename U>
62 return container::reconstruct(in_place_type<Cont>, util::forward<T>(t), util::forward<U>(u));
63 }
64
66};
67
68template<typename Cont>
70}
Definition ref_view.h:21
constexpr auto end() const
Definition ref_view.h:37
constexpr auto base() const -> Cont &
Definition ref_view.h:34
static constexpr void delete_rvalues(X &&)=delete
constexpr auto size() const
Definition ref_view.h:45
constexpr auto data() const
Definition ref_view.h:51
constexpr auto begin() const
Definition ref_view.h:36
constexpr auto empty() const -> bool requires(concepts::HasEmptyContainer< Cont >)
Definition ref_view.h:39
constexpr friend auto tag_invoke(types::Tag< container::reconstruct >, InPlaceType< RefView >, T &&t, U &&u)
Definition ref_view.h:61
constexpr RefView(T &&container)
Definition ref_view.h:32
Definition view_interface.h:26
Definition reference_wrapper.h:14
Definition util.h:59
Definition invoke.h:58
Definition core.h:114
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto empty
Definition empty.h:45
constexpr auto reconstruct
Definition reconstruct.h:75
constexpr auto size
Definition size.h:54
constexpr auto data
Definition data.h:51
constexpr auto end
Definition end.h:47
RefView(Cont &) -> RefView< Cont >
constexpr auto begin
Definition begin.h:44
Definition merge_interfaces.h:6
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto in_place_type
Definition in_place_type.h:12
Definition enable_borrowed_container.h:9
Definition in_place_type.h:5