7#ifndef XGBOOST_COMMON_IO_H_
8#define XGBOOST_COMMON_IO_H_
27#include "xgboost/string_view.h"
41 size_t Read(
void* dptr,
size_t size)
override;
42 virtual size_t PeekRead(
void* dptr,
size_t size);
44 void Write(
const void*,
size_t)
override {
45 LOG(FATAL) <<
"Not implemented";
52 size_t buffer_ptr_{0};
66 size_t Read(
void* dptr,
size_t size)
override;
67 size_t PeekRead(
void* dptr,
size_t size)
override;
68 [[nodiscard]] std::size_t Size()
const {
return buffer_.size(); }
69 [[nodiscard]] std::size_t Tell()
const {
return pointer_; }
70 void Seek(
size_t pos);
72 void Write(
const void*,
size_t)
override {
73 LOG(FATAL) <<
"Not implemented";
80 void Take(std::string* out);
105std::string
FileExtension(std::string fname,
bool lower =
true);
113 fixed_size->Seek(common::MemoryFixSizeBuffer::kSeekEnd);
114 size_t size = fixed_size->Tell();
117 CHECK_EQ(fixed_size->Read(&buffer[0], size), size);
127inline std::string
ReadAll(std::string
const &path) {
128 std::ifstream stream(path);
129 if (!stream.is_open()) {
130 LOG(FATAL) <<
"Could not open file " << path;
132 std::string content{std::istreambuf_iterator<char>(stream), std::istreambuf_iterator<char>()};
133 if (content.empty()) {
134 LOG(FATAL) <<
"Empty file " << path;
149 enum Kind : std::uint8_t {
158 virtual void* Data() = 0;
159 template <
typename T>
160 [[nodiscard]] T* DataAs() {
161 return reinterpret_cast<T*
>(this->Data());
164 [[nodiscard]]
virtual std::size_t Size()
const = 0;
165 [[nodiscard]]
auto Type()
const {
return kind_; }
181 return this->Type() == that.Type();
189 void Clear()
noexcept(
true) {
199 void* Data()
override {
return ptr_; }
200 [[nodiscard]] std::size_t Size()
const override {
return n_; }
209 template <
bool force_malloc = false>
210 void Resize(std::size_t n_bytes, std::byte init = std::byte{0}) {
218 bool need_copy{
false};
219 void* new_ptr{
nullptr};
221 if constexpr (!force_malloc) {
222 new_ptr = std::realloc(ptr_, n_bytes);
227 new_ptr = std::malloc(n_bytes);
232 LOG(FATAL) <<
"bad_malloc: Failed to allocate " << n_bytes <<
" bytes.";
236 std::copy_n(
reinterpret_cast<std::byte*
>(ptr_), n_,
reinterpret_cast<std::byte*
>(new_ptr));
239 std::fill_n(
reinterpret_cast<std::byte*
>(new_ptr) + n_, n_bytes - n_, init);
254 std::unique_ptr<MMAPFile> handle_;
258 MmapResource(std::string path, std::size_t offset, std::size_t length);
261 [[nodiscard]]
void* Data()
override;
262 [[nodiscard]] std::size_t Size()
const override;
283 std::shared_ptr<ResourceHandler> resource_;
284 std::size_t curr_ptr_{0};
287 static std::size_t
constexpr kSeekEnd = std::numeric_limits<std::size_t>::max();
291 : resource_{std::move(resource)} {}
293 [[nodiscard]] std::shared_ptr<ResourceHandler> Share()
noexcept(
true) {
return resource_; }
300 [[nodiscard]]
auto Consume(std::size_t n_bytes)
noexcept(
true) {
301 auto res_size = resource_->Size();
302 auto data =
reinterpret_cast<std::byte*
>(resource_->Data());
303 auto ptr = data + curr_ptr_;
307 auto aligned_forward = std::min(res_size - curr_ptr_, aligned_n_bytes);
308 std::size_t forward = std::min(res_size - curr_ptr_, n_bytes);
310 curr_ptr_ += aligned_forward;
312 return std::pair{ptr, forward};
315 template <
typename T>
316 [[nodiscard]]
auto Consume(T* out)
noexcept(
false) -> std::enable_if_t<std::is_pod_v<T>,
bool> {
317 auto [ptr, size] = this->
Consume(
sizeof(T));
318 if (size !=
sizeof(T)) {
321 CHECK_EQ(
reinterpret_cast<std::uintptr_t
>(ptr) % std::alignment_of_v<T>, 0);
322 *out = *
reinterpret_cast<T*
>(ptr);
326 [[nodiscard]]
virtual std::size_t Tell() noexcept(true) {
return curr_ptr_; }
330 [[nodiscard]] std::size_t
Read(
void* ptr, std::size_t n_bytes)
noexcept(
true) {
331 auto [res_ptr, forward] = this->
Consume(n_bytes);
333 std::memcpy(ptr, res_ptr, forward);
342 template <
typename T>
343 [[nodiscard]]
auto Read(T* out)
noexcept(
false) -> std::enable_if_t<std::is_pod_v<T>,
bool> {
351 template <
typename T>
352 [[nodiscard]]
bool Read(std::vector<T>* out)
noexcept(
true) {
359 auto n_bytes =
sizeof(T) * n;
360 if (this->
Read(out->data(), n_bytes) != n_bytes) {
389 ~PrivateMmapConstStream() noexcept(false) override;
397 [[nodiscard]]
virtual std::size_t DoWrite(
const void* ptr,
398 std::size_t n_bytes)
noexcept(
true) = 0;
403 [[nodiscard]] std::size_t Write(
const void* ptr, std::size_t n_bytes)
noexcept(
false) {
405 auto w_n_bytes = this->DoWrite(ptr, n_bytes);
406 CHECK_EQ(w_n_bytes, n_bytes);
407 auto remaining = aligned_n_bytes - n_bytes;
410 std::memset(padding.data(),
'\0', padding.size());
411 w_n_bytes = this->DoWrite(padding.data(), remaining);
412 CHECK_EQ(w_n_bytes, remaining);
414 return aligned_n_bytes;
417 template <
typename T>
418 [[nodiscard]] std::enable_if_t<std::is_pod_v<T>, std::size_t> Write(T
const& v) {
419 return this->Write(&v,
sizeof(T));
427 std::unique_ptr<dmlc::Stream> pimpl_;
430 [[nodiscard]] std::size_t DoWrite(
const void* ptr, std::size_t n_bytes)
noexcept(
true)
override;
442 std::unique_ptr<MemoryBufferStream> pimpl_;
445 [[nodiscard]] std::size_t DoWrite(
const void* ptr, std::size_t n_bytes)
noexcept(
true)
override;
451 [[nodiscard]] std::size_t Tell()
const noexcept(
true);
interface of stream I/O for serialization
Definition io.h:30
Output stream backed by a file.
Definition io.h:426
Output stream backed by memory buffer.
Definition io.h:441
Wrap resource into a dmlc stream.
Definition io.h:282
bool Read(std::vector< T > *out) noexcept(true)
Read a vector.
Definition io.h:352
std::size_t Read(void *ptr, std::size_t n_bytes) noexcept(true)
Read n_bytes of data, output is copied into ptr.
Definition io.h:330
auto Read(T *out) noexcept(false) -> std::enable_if_t< std::is_pod_v< T >, bool >
Read a primitive type.
Definition io.h:343
auto Consume(std::size_t n_bytes) noexcept(true)
Consume n_bytes of data, no copying is performed.
Definition io.h:300
Base class for write stream with alignment defined by IOAlignment().
Definition io.h:395
A simple class used to consume ‘dmlc::Stream’ all at once.
Definition io.h:61
void Take(std::string *out)
Take the buffer from ‘FixedSizeStream’. The one in ‘FixedSizeStream’ will be cleared out.
Definition io.cc:116
void Write(const void *, size_t) override
writes data to a stream
Definition io.h:72
size_t Read(void *dptr, size_t size) override
reads data from a stream
Definition io.cc:93
void Resize(std::size_t n_bytes, std::byte init=std::byte{0})
Resize the resource to n_bytes.
Definition io.h:210
A class for wrapping mmap as a resource for RAII.
Definition io.h:253
Input stream that support additional PeekRead operation, besides read.
Definition io.h:37
void Write(const void *, size_t) override
writes data to a stream
Definition io.h:44
size_t Read(void *dptr, size_t size) override
reads data from a stream
Definition io.cc:46
Private mmap file as a read-only stream.
Definition io.h:377
PrivateMmapConstStream(std::string path, std::size_t offset, std::size_t length)
Construct a private mmap stream.
Definition io.h:386
Handler for one-shot resource.
Definition io.h:146
bool IsSameType(ResourceHandler const &that) const
Wether two resources have the same type.
Definition io.h:180
defines serializable interface of dmlc
Copyright 2017-2023, XGBoost Contributors.
Definition span.h:77
std::string ReadAll(dmlc::Stream *fi, PeekableInStream *fp)
Read the whole buffer from dmlc stream.
Definition io.h:110
std::string FileExtension(std::string fname, bool lower)
Get file extension from file name.
Definition io.cc:192
constexpr std::size_t IOAlignment()
Definition io.h:268
std::string LoadSequentialFile(std::string uri, bool stream)
Helper function for loading consecutive file to avoid dmlc Stream when possible.
Definition io.cc:142
This file defines rabit's Allreduce/Broadcast interface The rabit engine contains the actual implemen...
a in memory buffer that can be read and write as stream interface
Definition io.h:79
Fixed size memory buffer as a stream.
Definition io.h:28
Definition string_view.h:15
Copyright 2015-2023 by XGBoost Contributors.