1 | /*! |
2 | * Copyright (c) 2015 by Contributors |
3 | * \file memory_io.h |
4 | * \brief defines binary serialization class to serialize things into/from memory region. |
5 | */ |
6 | #ifndef DMLC_MEMORY_IO_H_ |
7 | #define DMLC_MEMORY_IO_H_ |
8 | |
9 | #include <cstring> |
10 | #include <string> |
11 | #include <algorithm> |
12 | #include "./base.h" |
13 | #include "./io.h" |
14 | #include "./logging.h" |
15 | |
16 | namespace dmlc { |
17 | /*! |
18 | * \brief A Stream that operates on fixed region of memory |
19 | * This class allows us to read/write from/to a fixed memory region. |
20 | */ |
21 | struct MemoryFixedSizeStream : public SeekStream { |
22 | public: |
23 | /*! |
24 | * \brief constructor |
25 | * \param p_buffer the head pointer of the memory region. |
26 | * \param buffer_size the size of the memorybuffer |
27 | */ |
28 | MemoryFixedSizeStream(void *p_buffer, size_t buffer_size) |
29 | : p_buffer_(reinterpret_cast<char*>(p_buffer)), |
30 | buffer_size_(buffer_size) { |
31 | curr_ptr_ = 0; |
32 | } |
33 | virtual size_t Read(void *ptr, size_t size) { |
34 | CHECK(curr_ptr_ + size <= buffer_size_); |
35 | size_t nread = std::min(buffer_size_ - curr_ptr_, size); |
36 | if (nread != 0) std::memcpy(ptr, p_buffer_ + curr_ptr_, nread); |
37 | curr_ptr_ += nread; |
38 | return nread; |
39 | } |
40 | virtual void Write(const void *ptr, size_t size) { |
41 | if (size == 0) return; |
42 | CHECK(curr_ptr_ + size <= buffer_size_); |
43 | std::memcpy(p_buffer_ + curr_ptr_, ptr, size); |
44 | curr_ptr_ += size; |
45 | } |
46 | virtual void Seek(size_t pos) { |
47 | curr_ptr_ = static_cast<size_t>(pos); |
48 | } |
49 | virtual size_t Tell(void) { |
50 | return curr_ptr_; |
51 | } |
52 | |
53 | private: |
54 | /*! \brief in memory buffer */ |
55 | char *p_buffer_; |
56 | /*! \brief current pointer */ |
57 | size_t buffer_size_; |
58 | /*! \brief current pointer */ |
59 | size_t curr_ptr_; |
60 | }; // class MemoryFixedSizeStream |
61 | |
62 | /*! |
63 | * \brief A in memory stream that is backed by std::string. |
64 | * This class allows us to read/write from/to a std::string. |
65 | */ |
66 | struct MemoryStringStream : public dmlc::SeekStream { |
67 | public: |
68 | /*! |
69 | * \brief constructor |
70 | * \param p_buffer the pointer to the string. |
71 | */ |
72 | explicit MemoryStringStream(std::string *p_buffer) |
73 | : p_buffer_(p_buffer) { |
74 | curr_ptr_ = 0; |
75 | } |
76 | virtual size_t Read(void *ptr, size_t size) { |
77 | CHECK(curr_ptr_ <= p_buffer_->length()); |
78 | size_t nread = std::min(p_buffer_->length() - curr_ptr_, size); |
79 | if (nread != 0) std::memcpy(ptr, &(*p_buffer_)[0] + curr_ptr_, nread); |
80 | curr_ptr_ += nread; |
81 | return nread; |
82 | } |
83 | virtual void Write(const void *ptr, size_t size) { |
84 | if (size == 0) return; |
85 | if (curr_ptr_ + size > p_buffer_->length()) { |
86 | p_buffer_->resize(curr_ptr_+size); |
87 | } |
88 | std::memcpy(&(*p_buffer_)[0] + curr_ptr_, ptr, size); |
89 | curr_ptr_ += size; |
90 | } |
91 | virtual void Seek(size_t pos) { |
92 | curr_ptr_ = static_cast<size_t>(pos); |
93 | } |
94 | virtual size_t Tell(void) { |
95 | return curr_ptr_; |
96 | } |
97 | |
98 | private: |
99 | /*! \brief in memory buffer */ |
100 | std::string *p_buffer_; |
101 | /*! \brief current pointer */ |
102 | size_t curr_ptr_; |
103 | }; // class MemoryStringStream |
104 | } // namespace dmlc |
105 | #endif // DMLC_MEMORY_IO_H_ |
106 | |