27static_assert(
sizeof(std::complex<float>) == 2 *
sizeof(
float),
28 "complex<float> must be layout-compatible with float[2]");
29static_assert(
sizeof(std::complex<double>) == 2 *
sizeof(
double),
30 "complex<double> must be layout-compatible with double[2]");
49 : element_count_(element_count), backend_(std::move(backend)), data_(nullptr) {
51 throw std::runtime_error(
"GPUDeviceBuffer: backend must not be null");
53 if (element_count_ > 0) {
54 data_ =
static_cast<T*
>(backend_->allocate_unified(element_count_ *
sizeof(T)));
67 : element_count_(other.element_count_)
68 , backend_(std::move(other.backend_))
69 , data_(other.data_) {
70 other.element_count_ = 0;
71 other.data_ =
nullptr;
81 element_count_ = other.element_count_;
82 backend_ = std::move(other.backend_);
84 other.element_count_ = 0;
85 other.data_ =
nullptr;
105 const T*
data() const noexcept {
113 return element_count_;
120 return element_count_ *
sizeof(T);
124 void release() noexcept {
125 if (data_ && backend_) {
126 backend_->deallocate(data_);
132 size_t element_count_;
133 std::shared_ptr<GPUDeviceBackend> backend_;
size_t size_bytes() const noexcept
GPUDeviceBuffer & operator=(const GPUDeviceBuffer &)=delete
const T * data() const noexcept
GPUDeviceBuffer(size_t element_count, std::shared_ptr< GPUDeviceBackend > backend)
GPUDeviceBuffer & operator=(GPUDeviceBuffer &&other) noexcept
GPUDeviceBuffer(const GPUDeviceBuffer &)=delete
GPUDeviceBuffer(GPUDeviceBuffer &&other) noexcept
size_t size() const noexcept