Medial Code Documentation
Loading...
Searching...
No Matches
io.h
Go to the documentation of this file.
1
7#ifndef RABIT_INTERNAL_IO_H_
8#define RABIT_INTERNAL_IO_H_
9
10#include <algorithm>
11#include <cstddef> // for size_t
12#include <cstdio>
13#include <cstring> // for memcpy
14#include <limits>
15#include <numeric>
16#include <string>
17#include <vector>
18
20#include "rabit/serializable.h"
21
22namespace rabit::utils {
29 public:
30 // similar to SEEK_END in libc
31 static std::size_t constexpr kSeekEnd = std::numeric_limits<std::size_t>::max();
32
33 public:
40 MemoryFixSizeBuffer(void *p_buffer, std::size_t buffer_size)
41 : p_buffer_(reinterpret_cast<char *>(p_buffer)), buffer_size_(buffer_size) {}
42 ~MemoryFixSizeBuffer() override = default;
43
44 std::size_t Read(void *ptr, std::size_t size) override {
45 std::size_t nread = std::min(buffer_size_ - curr_ptr_, size);
46 if (nread != 0) std::memcpy(ptr, p_buffer_ + curr_ptr_, nread);
47 curr_ptr_ += nread;
48 return nread;
49 }
50 void Write(const void *ptr, std::size_t size) override {
51 if (size == 0) return;
52 CHECK_LE(curr_ptr_ + size, buffer_size_);
53 std::memcpy(p_buffer_ + curr_ptr_, ptr, size);
54 curr_ptr_ += size;
55 }
56 void Seek(std::size_t pos) override {
57 if (pos == kSeekEnd) {
59 } else {
60 curr_ptr_ = static_cast<std::size_t>(pos);
61 }
62 }
66 std::size_t Tell() override { return curr_ptr_; }
67 [[nodiscard]] virtual bool AtEnd() const { return curr_ptr_ == buffer_size_; }
68
69 protected:
71 char *p_buffer_{nullptr};
73 std::size_t buffer_size_{0};
75 std::size_t curr_ptr_{0};
76};
77
80 public:
81 explicit MemoryBufferStream(std::string *p_buffer)
82 : p_buffer_(p_buffer) {
83 curr_ptr_ = 0;
84 }
85 ~MemoryBufferStream() override = default;
86 size_t Read(void *ptr, size_t size) override {
87 utils::Assert(curr_ptr_ <= p_buffer_->length(),
88 "read can not have position excceed buffer length");
89 size_t nread = std::min(p_buffer_->length() - curr_ptr_, size);
90 if (nread != 0) std::memcpy(ptr, &(*p_buffer_)[0] + curr_ptr_, nread);
91 curr_ptr_ += nread;
92 return nread;
93 }
94 void Write(const void *ptr, size_t size) override {
95 if (size == 0) return;
96 if (curr_ptr_ + size > p_buffer_->length()) {
97 p_buffer_->resize(curr_ptr_+size);
98 }
99 std::memcpy(&(*p_buffer_)[0] + curr_ptr_, ptr, size);
100 curr_ptr_ += size;
101 }
102 void Seek(size_t pos) override {
103 curr_ptr_ = static_cast<size_t>(pos);
104 }
105 size_t Tell() override {
106 return curr_ptr_;
107 }
108 virtual bool AtEnd() const {
109 return curr_ptr_ == p_buffer_->length();
110 }
111
112 private:
114 std::string *p_buffer_;
116 size_t curr_ptr_;
117}; // class MemoryBufferStream
118} // namespace rabit::utils
119#endif // RABIT_INTERNAL_IO_H_
interface of i/o stream that support seek
Definition io.h:109
namespace for helper utils of the project
Definition io.h:22
void Assert(bool exp, const char *fmt,...)
assert a condition is true, use this to handle debug information
Definition utils.h:79
defines serializable interface of rabit
a in memory buffer that can be read and write as stream interface
Definition io.h:79
void Write(const void *ptr, size_t size) override
writes data to a stream
Definition io.h:94
size_t Tell() override
tell the position of the stream
Definition io.h:105
void Seek(size_t pos) override
seek to certain position of the file
Definition io.h:102
size_t Read(void *ptr, size_t size) override
reads data from a stream
Definition io.h:86
Fixed size memory buffer as a stream.
Definition io.h:28
std::size_t buffer_size_
current pointer
Definition io.h:73
MemoryFixSizeBuffer(void *p_buffer, std::size_t buffer_size)
Ctor.
Definition io.h:40
char * p_buffer_
in memory buffer
Definition io.h:71
std::size_t Tell() override
Current position in the buffer (stream).
Definition io.h:66
std::size_t curr_ptr_
current pointer
Definition io.h:75
simple utils to support the code