32 #ifndef VSMC_OPENCL_CL_BUFFER_HPP
33 #define VSMC_OPENCL_CL_BUFFER_HPP
48 template <
typename T,
typename ID = CLDefault>
58 size_(0), flag_(CL_MEM_READ_WRITE), host_ptr_(
VSMC_NULLPTR) {}
64 create_buffer<value_type>(size_, flag_, host_ptr_)) {}
67 size_(other.size_), flag_(other.flag_), host_ptr_(other.host_ptr_),
69 create_buffer<value_type>(size_, flag_, host_ptr_))
73 && (flag_ & CL_MEM_HOST_WRITE_ONLY) != 0
74 && (flag_ & CL_MEM_HOST_READ_ONLY) != 0
77 manager().template copy_buffer<value_type>(
78 other.data_, data_, size_);
85 resize(other.size_, other.flag_, other.host_ptr_);
88 && (flag_ & CL_MEM_HOST_WRITE_ONLY) != 0
89 && (flag_ & CL_MEM_HOST_READ_ONLY) != 0
92 manager().template copy_buffer<value_type>(
93 other.data_, data_, size_);
100 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
102 size_(other.size_), flag_(other.flag_), host_ptr_(other.host_ptr_),
103 data_(cxx11::
move(other.data_))
106 other.flag_ = CL_MEM_READ_WRITE;
108 other.data_ = ::cl::Buffer();
115 if (
this != &other) {
116 swap(size_, other.size_);
117 swap(flag_, other.flag_);
118 swap(host_ptr_, other.host_ptr_);
119 swap(data_, other.data_);
130 size_type
size ()
const {
return size_;}
141 const ::cl::Buffer &
data ()
const {
return data_;}
149 data_ =
manager().template create_buffer<value_type>(
150 size_, flag_, host_ptr_);
155 if (N == size_ && flag == flag_)
160 data_ =
manager().template create_buffer<value_type>(
161 size_, flag_, host_ptr_);
166 if (N == size_ && flag == flag_ && host_ptr == host_ptr_)
172 data_ =
manager().template create_buffer<value_type>(
173 size_, flag_, host_ptr_);
186 #endif // VSMC_OPENCL_CL_BUFFER_HPP
static manager_type & manager()
CLBuffer(size_type N,::cl_mem_flags flag=CL_MEM_READ_WRITE, void *host_ptr=nullptr)
::cl_mem_flags flag() const
const ::cl::Buffer & data() const
Read only access to the raw cl::Buffer object.
remove_reference< T >::type && move(T &&t) noexcept
#define VSMC_NULLPTR
nullptr
CLBuffer< T, ID > & operator=(const CLBuffer< T, ID > &other)
CLBuffer(CLBuffer< T, ID > &&other)
void swap(Array< T, N > &ary1, Array< T, N > &ary2)
Array ADL of swap.
#define VSMC_OPENCL_VERSION
CLManager< ID > manager_type
CLBuffer(const CLBuffer< T, ID > &other)
void resize(size_type N,::cl_mem_flags flag, void *host_ptr)
static CLManager< ID > & instance()
Get an instance of the manager singleton.
void resize(size_type N,::cl_mem_flags flag)