@@ -128,15 +128,14 @@ class CVectorWriter
128128 size_t nPos;
129129};
130130
131- /* * Minimal stream for reading from an existing vector by reference
131+ /* * Minimal stream for reading from an existing byte array by Span.
132132 */
133- class VectorReader
133+ class SpanReader
134134{
135135private:
136136 const int m_type;
137137 const int m_version;
138- const std::vector<unsigned char >& m_data;
139- size_t m_pos = 0 ;
138+ Span<const unsigned char > m_data;
140139
141140public:
142141
@@ -146,28 +145,29 @@ class VectorReader
146145 * @param[in] data Referenced byte vector to overwrite/append
147146 * @param[in] pos Starting position. Vector index where reads should start.
148147 */
149- VectorReader (int type, int version, const std::vector< unsigned char >& data, size_t pos)
150- : m_type(type), m_version(version), m_data(data), m_pos(pos)
148+ SpanReader (int type, int version, Span< const unsigned char > data, size_t pos)
149+ : m_type(type), m_version(version), m_data(data)
151150 {
152- if (m_pos > m_data.size ()) {
153- throw std::ios_base::failure (" VectorReader (...): end of data (m_pos > m_data.size())" );
151+ if (pos > m_data.size ()) {
152+ throw std::ios_base::failure (" SpanReader (...): end of data (pos > m_data.size())" );
154153 }
154+ data = data.subspan (pos);
155155 }
156156
157157 /* *
158158 * (other params same as above)
159159 * @param[in] args A list of items to deserialize starting at pos.
160160 */
161161 template <typename ... Args>
162- VectorReader (int type, int version, const std::vector< unsigned char >& data, size_t pos,
162+ SpanReader (int type, int version, Span< const unsigned char > data, size_t pos,
163163 Args&&... args)
164- : VectorReader (type, version, data, pos)
164+ : SpanReader (type, version, data, pos)
165165 {
166166 ::UnserializeMany (*this , std::forward<Args>(args)...);
167167 }
168168
169169 template <typename T>
170- VectorReader & operator >>(T&& obj)
170+ SpanReader & operator >>(T&& obj)
171171 {
172172 // Unserialize from this stream
173173 ::Unserialize (*this , obj);
@@ -177,8 +177,8 @@ class VectorReader
177177 int GetVersion () const { return m_version; }
178178 int GetType () const { return m_type; }
179179
180- size_t size () const { return m_data.size () - m_pos ; }
181- bool empty () const { return m_data.size () == m_pos ; }
180+ size_t size () const { return m_data.size (); }
181+ bool empty () const { return m_data.empty () ; }
182182
183183 void read (char * dst, size_t n)
184184 {
@@ -187,12 +187,11 @@ class VectorReader
187187 }
188188
189189 // Read from the beginning of the buffer
190- size_t pos_next = m_pos + n;
191- if (pos_next > m_data.size ()) {
192- throw std::ios_base::failure (" VectorReader::read(): end of data" );
190+ if (n > m_data.size ()) {
191+ throw std::ios_base::failure (" SpanReader::read(): end of data" );
193192 }
194- memcpy (dst, m_data.data () + m_pos , n);
195- m_pos = pos_next ;
193+ memcpy (dst, m_data.data (), n);
194+ m_data = m_data. subspan (n) ;
196195 }
197196};
198197
0 commit comments