Medial Code Documentation
Loading...
Searching...
No Matches
ref_resource_view.h
1
4#ifndef XGBOOST_COMMON_REF_RESOURCE_VIEW_H_
5#define XGBOOST_COMMON_REF_RESOURCE_VIEW_H_
6
7#include <algorithm> // for fill_n
8#include <cstdint> // for uint64_t
9#include <cstring> // for memcpy
10#include <memory> // for shared_ptr, make_shared
11#include <type_traits> // for is_reference_v, remove_reference_t, is_same_v
12#include <utility> // for swap, move
13
14#include "io.h" // for ResourceHandler, AlignedResourceReadStream, MallocResource
15#include "xgboost/logging.h"
16#include "xgboost/span.h" // for Span
17
18namespace xgboost::common {
25template <typename T>
27 static_assert(!std::is_reference_v<T>);
28
29 public:
30 using value_type = T; // NOLINT
31 using size_type = std::uint64_t; // NOLINT
32
33 private:
34 value_type* ptr_{nullptr};
35 size_type size_{0};
36 std::shared_ptr<common::ResourceHandler> mem_{nullptr};
37
38 protected:
39 void Init(value_type* ptr, size_type size, std::shared_ptr<common::ResourceHandler> mem) {
40 ptr_ = ptr;
41 size_ = size;
42 mem_ = std::move(mem);
43 }
44
45 public:
46 RefResourceView(value_type* ptr, size_type n, std::shared_ptr<common::ResourceHandler> mem)
47 : ptr_{ptr}, size_{n}, mem_{std::move(mem)} {
48 CHECK_GE(mem_->Size(), n);
49 }
58 RefResourceView(value_type* ptr, size_type n, std::shared_ptr<common::ResourceHandler> mem,
59 T const& init)
60 : RefResourceView{ptr, n, mem} {
61 if (n != 0) {
62 std::fill_n(ptr_, n, init);
63 }
64 }
65
66 ~RefResourceView() = default;
67
68 RefResourceView() = default;
69 RefResourceView(RefResourceView const& that) = delete;
70 RefResourceView& operator=(RefResourceView const& that) = delete;
75 RefResourceView& operator=(RefResourceView&& that) = default;
76
77 [[nodiscard]] size_type size() const { return size_; } // NOLINT
78 [[nodiscard]] size_type size_bytes() const { // NOLINT
79 return Span<const value_type>{data(), size()}.size_bytes();
80 }
81 [[nodiscard]] value_type* data() { return ptr_; }; // NOLINT
82 [[nodiscard]] value_type const* data() const { return ptr_; }; // NOLINT
83 [[nodiscard]] bool empty() const { return size() == 0; } // NOLINT
84
85 [[nodiscard]] auto cbegin() const { return data(); } // NOLINT
86 [[nodiscard]] auto begin() { return data(); } // NOLINT
87 [[nodiscard]] auto begin() const { return cbegin(); } // NOLINT
88 [[nodiscard]] auto cend() const { return data() + size(); } // NOLINT
89 [[nodiscard]] auto end() { return data() + size(); } // NOLINT
90 [[nodiscard]] auto end() const { return cend(); } // NOLINT
91
92 [[nodiscard]] auto const& front() const { return data()[0]; } // NOLINT
93 [[nodiscard]] auto& front() { return data()[0]; } // NOLINT
94 [[nodiscard]] auto const& back() const { return data()[size() - 1]; } // NOLINT
95 [[nodiscard]] auto& back() { return data()[size() - 1]; } // NOLINT
96
97 [[nodiscard]] value_type& operator[](size_type i) { return ptr_[i]; }
98 [[nodiscard]] value_type const& operator[](size_type i) const { return ptr_[i]; }
99
103 auto Resource() const { return mem_; }
104};
105
111template <typename Vec>
112[[nodiscard]] bool ReadVec(common::AlignedResourceReadStream* fi, Vec* vec) {
113 std::uint64_t n{0};
114 if (!fi->Read(&n)) {
115 return false;
116 }
117 if (n == 0) {
118 return true;
119 }
120
121 using T = typename Vec::value_type;
122 auto expected_bytes = sizeof(T) * n;
123
124 auto [ptr, n_bytes] = fi->Consume(expected_bytes);
125 if (n_bytes != expected_bytes) {
126 return false;
127 }
128
129 if constexpr (std::is_same_v<Vec, RefResourceView<T>>) {
130 *vec = RefResourceView<T>{reinterpret_cast<T*>(ptr), n, fi->Share()};
131 } else {
132 vec->resize(n);
133 std::memcpy(vec->data(), ptr, n_bytes);
134 }
135 return true;
136}
137
141template <typename Vec>
142[[nodiscard]] std::size_t WriteVec(AlignedFileWriteStream* fo, Vec const& vec) {
143 std::size_t bytes{0};
144 auto n = static_cast<std::uint64_t>(vec.size());
145 bytes += fo->Write(n);
146 if (n == 0) {
147 return sizeof(n);
148 }
149
150 using T = typename std::remove_reference_t<decltype(vec)>::value_type;
151 bytes += fo->Write(vec.data(), vec.size() * sizeof(T));
152
153 return bytes;
154}
155
159template <typename T>
160[[nodiscard]] RefResourceView<T> MakeFixedVecWithMalloc(std::size_t n_elements, T const& init) {
161 auto resource = std::make_shared<common::MallocResource>(n_elements * sizeof(T));
162 return RefResourceView{resource->DataAs<T>(), n_elements, resource, init};
163}
164
165template <typename T>
167 static_assert(!std::is_reference_v<T>);
168 static_assert(!std::is_const_v<T>);
169 static_assert(std::is_trivially_copyable_v<T>);
170
172 using size_type = typename Upper::size_type; // NOLINT
173 using value_type = typename Upper::value_type; // NOLINT
174
175 public:
177
178 ReallocVector(size_type n, value_type const& init)
180 ReallocVector(ReallocVector const& that) = delete;
181 ReallocVector(ReallocVector&& that) = delete;
182 ReallocVector& operator=(ReallocVector const& that) = delete;
183 ReallocVector& operator=(ReallocVector&& that) = delete;
184
185 void Resize(typename Upper::size_type new_size) {
186 auto resource = std::dynamic_pointer_cast<common::MallocResource>(this->Resource());
187 CHECK(resource);
188 resource->Resize(new_size * sizeof(T));
189 this->Init(resource->template DataAs<T>(), new_size, resource);
190 }
191};
192} // namespace xgboost::common
193#endif // XGBOOST_COMMON_REF_RESOURCE_VIEW_H_
Output stream backed by a file.
Definition io.h:426
Wrap resource into a dmlc stream.
Definition io.h:282
Definition ref_resource_view.h:166
A vector-like type that holds a reference counted resource.
Definition ref_resource_view.h:26
RefResourceView(RefResourceView &&that)=default
We allow move assignment for lazy initialization.
auto Resource() const
Get the underlying resource.
Definition ref_resource_view.h:103
RefResourceView(value_type *ptr, size_type n, std::shared_ptr< common::ResourceHandler > mem, T const &init)
Construct a view on ptr with length n.
Definition ref_resource_view.h:58
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition span.h:424
defines console logging options for xgboost. Use to enforce unified print behavior.
Copyright 2017-2023, XGBoost Contributors.
Definition span.h:77
std::size_t WriteVec(AlignedFileWriteStream *fo, Vec const &vec)
Write a vector to stream.
Definition ref_resource_view.h:142
bool ReadVec(common::AlignedResourceReadStream *fi, Vec *vec)
Read a vector from stream.
Definition ref_resource_view.h:112
RefResourceView< T > MakeFixedVecWithMalloc(std::size_t n_elements, T const &init)
Make a fixed size RefResourceView with malloc resource.
Definition ref_resource_view.h:160
Copyright 2014-2023, XGBoost Contributors.