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
16namespace 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 */
21struct 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 */
66struct 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