MRPT  1.9.9
archiveFrom_std_vector.h
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2018, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 #pragma once
10 
12 #include <vector>
13 #include <cstdint>
14 #include <cstring>
15 
16 namespace mrpt::serialization
17 {
18 /** Specialization for std::vector, suitable for read/write, using the
19  * `vector<uint8_t>` as the underlaying stream container. Writing always happen
20  * at the end of the vector. Reading starts at the beggining upon construction
21  * of this wrapper class (via `archiveFrom()`).
22  */
23 template <>
24 class CArchiveStreamBase<std::vector<uint8_t>> : public CArchive
25 {
26  std::vector<uint8_t>& m_v;
27  int m_pos_read{0};
28 
29  public:
30  CArchiveStreamBase(std::vector<uint8_t>& v) : m_v(v) {}
31  protected:
32  size_t write(const void* d, size_t n) override
33  {
34  const size_t idx = m_v.size();
35  m_v.resize(idx + n);
36  ::memcpy(&m_v[idx], d, n);
37  return n;
38  }
39  size_t read(void* d, size_t n) override
40  {
41  const int avail = static_cast<int>(m_v.size()) - m_pos_read;
42  if (avail < static_cast<int>(n))
43  throw std::runtime_error(
44  "CArchiveStreamBase: EOF reading from std::vector!");
45  ::memcpy(d, &m_v[m_pos_read], n);
46  m_pos_read += n;
47  return n;
48  };
49 };
50 /** Read-only version of the wrapper. See archiveFrom() */
51 template <>
52 class CArchiveStreamBase<const std::vector<uint8_t>> : public CArchive
53 {
54  const std::vector<uint8_t>& m_v;
55  int m_pos_read{0};
56 
57  public:
58  CArchiveStreamBase(const std::vector<uint8_t>& v) : m_v(v) {}
59  protected:
60  size_t write(const void* d, size_t n) override
61  {
62  throw std::runtime_error(
63  "CArchiveStreamBase: Attempt to write to read-only vector.");
64  }
65  size_t read(void* d, size_t n) override
66  {
67  const int avail = static_cast<int>(m_v.size()) - m_pos_read;
68  if (avail < static_cast<int>(n))
69  throw std::runtime_error(
70  "CArchiveStreamBase: EOF reading from std::vector!");
71  ::memcpy(d, &m_v[m_pos_read], n);
72  m_pos_read += n;
73  return n;
74  };
75 };
76 }
77 
size_t read(void *d, size_t n) override
Reads a block of bytes.
GLenum GLsizei n
Definition: glext.h:5074
STL namespace.
size_t read(void *d, size_t n) override
Reads a block of bytes.
CArchive for mrpt::io::CStream classes (use as template argument).
Definition: CArchive.h:540
const GLdouble * v
Definition: glext.h:3678
Virtual base class for "archives": classes abstracting I/O streams.
Definition: CArchive.h:52
size_t write(const void *d, size_t n) override
Writes a block of bytes.
size_t write(const void *d, size_t n) override
Writes a block of bytes.
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy".
Definition: os.cpp:356



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: 7d5e6d718 Fri Aug 24 01:51:28 2018 +0200 at lun nov 2 08:35:50 CET 2020