LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
SpanStream.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_SPAN_STREAM_H
17#define LIEF_SPAN_STREAM_H
18
19#include <cstdint>
20#include <vector>
21#include <array>
22#include <cstddef>
23#include <memory>
24
25#include "LIEF/errors.hpp"
26#include "LIEF/span.hpp"
27#include "LIEF/visibility.h"
29
30namespace LIEF {
31class VectorStream;
33 public:
34 using BinaryStream::p;
37
38 static result<SpanStream> from_vector(const std::vector<uint8_t>& data) {
39 return SpanStream(data);
40 }
41
42 template<size_t N>
43 static result<SpanStream> from_array(const std::array<uint8_t, N>& data) {
44 return SpanStream(data.data(), N);
45 }
46
48 SpanStream(data.data(), data.size()) {}
49
51 SpanStream(data.data(), data.size()) {}
52
53 SpanStream(const uint8_t* p, size_t size) :
55 data_{p, p + size} {}
56
57 SpanStream(const std::vector<uint8_t>& data) :
58 SpanStream(data.data(), data.size()) {}
59
60 std::unique_ptr<SpanStream> clone() const {
61 return std::unique_ptr<SpanStream>(new SpanStream(*this));
62 }
63
64 SpanStream() = delete;
65
66 SpanStream(const SpanStream& other) = default;
67 SpanStream& operator=(const SpanStream& other) = default;
68
69 SpanStream(SpanStream&& other) noexcept = default;
70 SpanStream& operator=(SpanStream&& other) noexcept = default;
71
72 uint64_t size() const override {
73 return data_.size();
74 }
75
76 const uint8_t* p() const override {
77 return data_.data() + this->pos();
78 }
79
80 const uint8_t* start() const override {
81 return data_.data();
82 }
83
84 const uint8_t* end() const override {
85 return data_.data() + size();
86 }
87
88 std::vector<uint8_t> content() const {
89 return {data_.begin(), data_.end()};
90 }
91
92 result<SpanStream> slice(size_t offset, size_t size) const {
93 if (offset > data_.size() || (offset + size) > data_.size()) {
95 }
96 return data_.subspan(offset, size);
97 }
98 result<SpanStream> slice(size_t offset) const {
99 if (offset > data_.size()) {
101 }
102 return data_.subspan(offset, data_.size() - offset);
103 }
104
105 std::unique_ptr<VectorStream> to_vector() const;
106
107 static bool classof(const BinaryStream& stream) {
108 return stream.type() == BinaryStream::STREAM_TYPE::SPAN;
109 }
110
111 ~SpanStream() override = default;
112
113 protected:
114 result<const void*> read_at(uint64_t offset, uint64_t size,
115 uint64_t /*va*/) const override {
116 const uint64_t stream_size = this->size();
117 if (offset > stream_size || (offset + size) > stream_size) {
119 }
120 return data_.data() + offset;
121 }
123};
124}
125
126#endif
STREAM_TYPE
Definition BinaryStream.hpp:37
@ SPAN
Definition BinaryStream.hpp:41
virtual const uint8_t * p() const
Definition BinaryStream.hpp:271
size_t pos() const
Definition BinaryStream.hpp:181
virtual uint8_t * start()
Definition BinaryStream.hpp:275
BinaryStream(STREAM_TYPE type)
Definition BinaryStream.hpp:47
STREAM_TYPE type() const
Definition BinaryStream.hpp:52
virtual uint8_t * end()
Definition BinaryStream.hpp:283
~SpanStream() override=default
std::unique_ptr< VectorStream > to_vector() const
SpanStream & operator=(SpanStream &&other) noexcept=default
SpanStream & operator=(const SpanStream &other)=default
SpanStream()=delete
SpanStream(const SpanStream &other)=default
const uint8_t * p() const override
Definition SpanStream.hpp:76
SpanStream(const uint8_t *p, size_t size)
Definition SpanStream.hpp:53
static bool classof(const BinaryStream &stream)
Definition SpanStream.hpp:107
std::unique_ptr< SpanStream > clone() const
Definition SpanStream.hpp:60
SpanStream(span< uint8_t > data)
Definition SpanStream.hpp:50
result< SpanStream > slice(size_t offset, size_t size) const
Definition SpanStream.hpp:92
static result< SpanStream > from_vector(const std::vector< uint8_t > &data)
Definition SpanStream.hpp:38
static result< SpanStream > from_array(const std::array< uint8_t, N > &data)
Definition SpanStream.hpp:43
const uint8_t * start() const override
Definition SpanStream.hpp:80
SpanStream(const std::vector< uint8_t > &data)
Definition SpanStream.hpp:57
SpanStream(SpanStream &&other) noexcept=default
const uint8_t * end() const override
Definition SpanStream.hpp:84
result< SpanStream > slice(size_t offset) const
Definition SpanStream.hpp:98
uint64_t size() const override
Definition SpanStream.hpp:72
std::vector< uint8_t > content() const
Definition SpanStream.hpp:88
SpanStream(span< const uint8_t > data)
Definition SpanStream.hpp:47
Definition VectorStream.hpp:29
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:77
@ read_out_of_bound
Definition errors.hpp:33
@ read_error
Definition errors.hpp:25
tl::unexpected< lief_errors > make_error_code(lief_errors e)
Create a standard error code from lief_errors.
Definition errors.hpp:53
LIEF namespace.
Definition Abstract/Binary.hpp:40
tcb::span< ElementType, Extent > span
Definition span.hpp:22
#define LIEF_API
Definition visibility.h:45