7#ifndef BOTAN_BUFFER_SLICER_H_
8#define BOTAN_BUFFER_SLICER_H_
10#include <botan/assert.h>
11#include <botan/concepts.h>
12#include <botan/secmem.h>
13#include <botan/strong_type.h>
14#include <botan/types.h>
25 explicit BufferSlicer(std::span<const uint8_t> buffer) : m_remaining(buffer) {}
27 template <concepts::contiguous_container ContainerT>
28 auto copy(
const size_t count) {
29 const auto result =
take(count);
30 return ContainerT(result.begin(), result.end());
37 std::span<const uint8_t>
take(
const size_t count) {
39 auto result = m_remaining.first(count);
40 m_remaining = m_remaining.subspan(count);
44 template <
size_t count>
45 std::span<const uint8_t, count>
take() {
47 auto result = m_remaining.first<count>();
48 m_remaining = m_remaining.subspan(count);
52 template <concepts::contiguous_strong_type T>
60 const auto data =
take(sink.size());
61 std::copy(data.begin(), data.end(), sink.begin());
66 size_t remaining()
const {
return m_remaining.size(); }
68 bool empty()
const {
return m_remaining.empty(); }
71 std::span<const uint8_t> m_remaining;
#define BOTAN_STATE_CHECK(expr)
void skip(const size_t count)
auto copy_as_secure_vector(const size_t count)
void copy_into(std::span< uint8_t > sink)
BufferSlicer(std::span< const uint8_t > buffer)
std::span< const uint8_t, count > take()
auto copy(const size_t count)
std::span< const uint8_t > take(const size_t count)
StrongSpan< const T > take(const size_t count)
auto copy_as_vector(const size_t count)