aboutsummaryrefslogtreecommitdiff
path: root/src/streams.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/streams.h')
-rw-r--r--src/streams.h47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/streams.h b/src/streams.h
index e78da31cbc..dbb942f306 100644
--- a/src/streams.h
+++ b/src/streams.h
@@ -128,15 +128,14 @@ private:
size_t nPos;
};
-/** Minimal stream for reading from an existing vector by reference
+/** Minimal stream for reading from an existing byte array by Span.
*/
-class VectorReader
+class SpanReader
{
private:
const int m_type;
const int m_version;
- const std::vector<unsigned char>& m_data;
- size_t m_pos = 0;
+ Span<const unsigned char> m_data;
public:
@@ -146,12 +145,13 @@ public:
* @param[in] data Referenced byte vector to overwrite/append
* @param[in] pos Starting position. Vector index where reads should start.
*/
- VectorReader(int type, int version, const std::vector<unsigned char>& data, size_t pos)
- : m_type(type), m_version(version), m_data(data), m_pos(pos)
+ SpanReader(int type, int version, Span<const unsigned char> data, size_t pos)
+ : m_type(type), m_version(version), m_data(data)
{
- if (m_pos > m_data.size()) {
- throw std::ios_base::failure("VectorReader(...): end of data (m_pos > m_data.size())");
+ if (pos > m_data.size()) {
+ throw std::ios_base::failure("SpanReader(...): end of data (pos > m_data.size())");
}
+ data = data.subspan(pos);
}
/**
@@ -159,15 +159,15 @@ public:
* @param[in] args A list of items to deserialize starting at pos.
*/
template <typename... Args>
- VectorReader(int type, int version, const std::vector<unsigned char>& data, size_t pos,
+ SpanReader(int type, int version, Span<const unsigned char> data, size_t pos,
Args&&... args)
- : VectorReader(type, version, data, pos)
+ : SpanReader(type, version, data, pos)
{
::UnserializeMany(*this, std::forward<Args>(args)...);
}
template<typename T>
- VectorReader& operator>>(T& obj)
+ SpanReader& operator>>(T&& obj)
{
// Unserialize from this stream
::Unserialize(*this, obj);
@@ -177,8 +177,8 @@ public:
int GetVersion() const { return m_version; }
int GetType() const { return m_type; }
- size_t size() const { return m_data.size() - m_pos; }
- bool empty() const { return m_data.size() == m_pos; }
+ size_t size() const { return m_data.size(); }
+ bool empty() const { return m_data.empty(); }
void read(char* dst, size_t n)
{
@@ -187,12 +187,11 @@ public:
}
// Read from the beginning of the buffer
- size_t pos_next = m_pos + n;
- if (pos_next > m_data.size()) {
- throw std::ios_base::failure("VectorReader::read(): end of data");
+ if (n > m_data.size()) {
+ throw std::ios_base::failure("SpanReader::read(): end of data");
}
- memcpy(dst, m_data.data() + m_pos, n);
- m_pos = pos_next;
+ memcpy(dst, m_data.data(), n);
+ m_data = m_data.subspan(n);
}
};
@@ -226,7 +225,7 @@ public:
: nType{nTypeIn},
nVersion{nVersionIn} {}
- explicit CDataStream(Span<const uint8_t> sp, int nTypeIn, int nVersionIn)
+ explicit CDataStream(Span<const value_type> sp, int nTypeIn, int nVersionIn)
: vch(sp.data(), sp.data() + sp.size()),
nType{nTypeIn},
nVersion{nVersionIn} {}
@@ -254,17 +253,17 @@ public:
iterator end() { return vch.end(); }
size_type size() const { return vch.size() - nReadPos; }
bool empty() const { return vch.size() == nReadPos; }
- void resize(size_type n, value_type c=0) { vch.resize(n + nReadPos, c); }
+ void resize(size_type n, value_type c = value_type{}) { vch.resize(n + nReadPos, c); }
void reserve(size_type n) { vch.reserve(n + nReadPos); }
const_reference operator[](size_type pos) const { return vch[pos + nReadPos]; }
reference operator[](size_type pos) { return vch[pos + nReadPos]; }
void clear() { vch.clear(); nReadPos = 0; }
- iterator insert(iterator it, const uint8_t x) { return vch.insert(it, x); }
- void insert(iterator it, size_type n, const uint8_t x) { vch.insert(it, n, x); }
+ iterator insert(iterator it, const value_type x) { return vch.insert(it, x); }
+ void insert(iterator it, size_type n, const value_type x) { vch.insert(it, n, x); }
value_type* data() { return vch.data() + nReadPos; }
const value_type* data() const { return vch.data() + nReadPos; }
- void insert(iterator it, std::vector<uint8_t>::const_iterator first, std::vector<uint8_t>::const_iterator last)
+ void insert(iterator it, std::vector<value_type>::const_iterator first, std::vector<value_type>::const_iterator last)
{
if (last == first) return;
assert(last - first > 0);
@@ -278,7 +277,7 @@ public:
vch.insert(it, first, last);
}
- void insert(iterator it, const char* first, const char* last)
+ void insert(iterator it, const value_type* first, const value_type* last)
{
if (last == first) return;
assert(last - first > 0);