31 thrust::universal_ptr<T> m_data;
32 uninitialized_allocator<T> alloc;
37 for (
size_t i = 0; i < m_size; i++) {
40 alloc.deallocate(m_data, m_capacity);
48 : m_capacity(size), m_size(size), m_data(alloc.allocate(size)) {}
57 size_t capacity()
const {
return m_capacity; }
59 size_t size()
const {
return m_size; }
61 void reserve(
size_t size) {
62 if (size > m_capacity) {
64 thrust::universal_ptr<T> new_data = alloc.allocate(size);
67 for (
size_t i = 0; i < m_size; i++) {
68 new (new_data.get() + i) T(m_data[i]);
79 void resize(
size_t size) {
81 for (
size_t i = size; i < m_size; i++) {
84 }
else if (size > m_capacity) {
90 void push_back(
const T &value) {
91 if (m_size == m_capacity) {
92 reserve(m_capacity == 0 ? 1 : m_capacity * 2);
94 new (m_data.get() + m_size) T(value);
100 m_data[m_size - 1].~T();
105 T &operator[](
size_t index) {
return m_data[index]; }
106 const T &operator[](
size_t index)
const {
return m_data[index]; }
108 T &back() {
return m_data[m_size - 1]; }
110 const T &back()
const {
return m_data[m_size - 1]; }
112 T *begin() {
return m_data.get(); }
114 T *end() {
return m_data.get() + m_size; }
116 thrust::universal_ptr<T> data() {
return m_data; }
118 const thrust::universal_ptr<T> data()
const {
return m_data; }
121 for (
size_t i = 0; i < m_size; i++) {