7 template<
class ElementType>
28 bool resize(
const uint arraySize,
const uint eleSize);
31 bool resize(
uint num);
33 template<
typename ET2>
34 bool resize(
const ArrayList<ET2, DeviceType::GPU>& src);
36 DYN_FUNC
inline uint size()
const {
return mLists.size(); }
37 DYN_FUNC
inline uint elementSize()
const {
return mElements.size(); }
39 GPU_FUNC
inline List<ElementType>& operator [] (
unsigned int id) {
43 GPU_FUNC
inline List<ElementType>& operator [] (
unsigned int id)
const {
47 DYN_FUNC
inline bool isCPU()
const {
return false; }
48 DYN_FUNC
inline bool isGPU()
const {
return true; }
49 DYN_FUNC
inline bool isEmpty()
const {
return mIndex.size() == 0; }
53 void assign(
const ArrayList<ElementType, DeviceType::GPU>& src);
54 void assign(
const ArrayList<ElementType, DeviceType::CPU>& src);
55 void assign(
const std::vector<std::vector<ElementType>>& src);
57 friend std::ostream& operator<<(std::ostream& out,
const ArrayList<ElementType, DeviceType::GPU>& aList)
59 ArrayList<ElementType, DeviceType::CPU> hList;
73 ArrayList<ElementType, DeviceType::GPU>& operator=(
const ArrayList<ElementType, DeviceType::GPU>&) =
delete;
82 template<
typename ElementType>
85 template<
class ElementType>
88 mIndex.assign(src.index());
91 mLists.assign(src.lists());
94 for (
int i = 0; i < src.size(); i++)
100 template<
class ElementType>
108 template<
class ElementType>
109 bool ArrayList<ElementType, DeviceType::GPU>::resize(
const DArray<uint>& counts)
111 if (counts.size() == 0)
120 if (mIndex.size() != counts.size())
122 mIndex.resize(counts.size());
123 mLists.resize(counts.size());
126 mIndex.assign(counts);
129 uint total_num = reduce.accumulate(mIndex.begin(), mIndex.size());
136 mElements.resize(total_num);
144 template<
class ElementType>
150 if (mIndex.size() != arraySize)
152 mIndex.resize(arraySize);
153 mLists.resize(arraySize);
157 hIndex.resize(arraySize);
159 for (
size_t i = 0; i < arraySize; i++)
161 hIndex[i] = (
uint)accNum;
165 mIndex.assign(hIndex);
167 mElements.resize(arraySize*eleSize);
174 template<
typename ElementType>
175 template<
typename ET2>
177 uint arraySize = src.size();
178 if (mIndex.size() != arraySize)
180 mIndex.resize(arraySize);
181 mLists.resize(arraySize);
184 mIndex.assign(src.index());
185 mElements.resize(src.elementSize());
192 template<
class ElementType>
195 mIndex.assign(src.index());
196 mElements.assign(src.elements());
198 mLists.assign(src.lists());
204 template<
class ElementType>
207 mIndex.assign(src.index());
208 mElements.assign(src.elements());
210 mLists.assign(src.lists());
216 template<
class ElementType>
219 size_t indNum = src.size();
225 for (
int i = 0; i < src.size(); i++)
227 hIndex[i] = (
uint)eleNum;
228 eleNum += src[i].size();
230 for (
int j = 0; j < src[i].size(); j++)
232 hElements.pushBack(src[i][j]);
237 lists.resize(indNum);
239 mIndex.assign(hIndex);
240 mElements.assign(hElements);
244 for (
int i = 0; i < src.size(); i++)
246 size_t num_i = src[i].size();
248 lst.
assign(stAdr + eleNum, num_i, num_i);
251 eleNum += src[i].size();
254 mLists.assign(lists);
257 template<
class ElementType>
268 template<
class ElementType>
CArray< List< ElementType > > mLists
CArray< ElementType > mElements
Be aware do not use this structure on GPU if the data size is large.
DYN_FUNC void assign(T *beg, int num, int buffer_size)
void exclusive(T *output, const T *input, size_t length, bool bcao=true)
This is an implementation of AdditiveCCD based on peridyno.
Array< T, DeviceType::GPU > DArray
void parallel_allocate_for_list(void *lists, void *elements, size_t ele_size, DArray< uint > &index)
void parallel_init_for_list(void *lists, void *elements, size_t ele_size, DArray< uint > &index)
ArrayList< ElementType, DeviceType::GPU > DArrayList
Array< T, DeviceType::CPU > CArray