Iros
 
Loading...
Searching...
No Matches
vector_reader.h
Go to the documentation of this file.
1#pragma once
2
13#include "di/meta/operations.h"
14#include "di/meta/util.h"
15#include "di/types/byte.h"
16#include "di/types/in_place.h"
17#include "di/util/move.h"
22
23namespace di::io {
24template<concepts::InputContainer T = container::Vector<byte>>
25requires(concepts::ContainerOf<T, byte>)
27private:
28 template<typename U = void>
29 using Result = vocab::Result<U>;
30
32 using Sent = meta::ContainerSentinel<T>;
33
34public:
38 = default;
39
40 constexpr explicit VectorReader(T&& container)
41 : m_container(di::forward<T>(container)), m_iterator(begin(m_container)), m_sentinel(end(m_container)) {}
42
43 template<typename... Args>
44 requires(ConstructibleFrom<T, Args...>)
45 constexpr explicit VectorReader(InPlace, Args&&... args)
46 : m_container(di::forward<Args>(args)...), m_iterator(begin(m_container)), m_sentinel(end(m_container)) {}
47
48 constexpr auto container() & -> T& { return m_container; }
49 constexpr auto container() const& -> T const& { return m_container; }
50 constexpr auto container() && -> T&& { return di::move(*this).m_container; }
51
52 constexpr auto read_some(Span<byte> bytes) -> Result<usize> {
53 auto* bytes_it = bytes.data();
54 auto max_to_read = bytes.size();
55 auto nread = 0ZU;
56 for (; nread < max_to_read && m_iterator != m_sentinel; ++m_iterator, ++nread) {
57 *bytes_it++ = *m_iterator;
58 }
59 return nread;
60 }
61
62private:
63 T m_container {};
64 It m_iterator {};
65 Sent m_sentinel {};
66};
67
68template<typename T>
70}
71
72namespace di {
74}
Definition vector_reader.h:26
constexpr VectorReader(InPlace, Args &&... args)
Definition vector_reader.h:45
constexpr auto read_some(Span< byte > bytes) -> Result< usize >
Definition vector_reader.h:52
constexpr VectorReader(T &&container)
Definition vector_reader.h:40
constexpr auto container() &-> T &
Definition vector_reader.h:48
constexpr auto container() const &-> T const &
Definition vector_reader.h:49
constexpr auto container() &&-> T &&
Definition vector_reader.h:50
Definition span_forward_declaration.h:10
Definition operations.h:24
Definition reader.h:7
VectorReader(T &&) -> VectorReader< T >
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Expected< T, Error > Result
Definition result.h:8
Definition zstring_parser.h:9
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
Definition in_place.h:4