18 #ifndef viskores_cont_ArrayHandlePermutation_h
19 #define viskores_cont_ArrayHandlePermutation_h
30 template <
typename IndexPortalType,
typename ValuePortalType>
31 class VISKORES_ALWAYS_EXPORT ArrayPortalPermutation
33 using Writable = viskores::internal::PortalSupportsSets<ValuePortalType>;
36 using ValueType =
typename ValuePortalType::ValueType;
39 ArrayPortalPermutation()
46 ArrayPortalPermutation(
const IndexPortalType& indexPortal,
const ValuePortalType& valuePortal)
47 : IndexPortal(indexPortal)
48 , ValuePortal(valuePortal)
57 template <
typename OtherIP,
typename OtherVP>
58 VISKORES_EXEC_CONT ArrayPortalPermutation(
const ArrayPortalPermutation<OtherIP, OtherVP>& src)
59 : IndexPortal(src.GetIndexPortal())
60 , ValuePortal(src.GetValuePortal())
65 viskores::Id GetNumberOfValues()
const {
return this->IndexPortal.GetNumberOfValues(); }
70 viskores::Id permutedIndex = this->IndexPortal.Get(index);
71 return this->ValuePortal.Get(permutedIndex);
74 template <
typename Writable_ = Writable,
75 typename =
typename std::enable_if<Writable_::value>::type>
78 viskores::Id permutedIndex = this->IndexPortal.Get(index);
79 this->ValuePortal.Set(permutedIndex, value);
83 const IndexPortalType& GetIndexPortal()
const {
return this->IndexPortal; }
86 const ValuePortalType& GetValuePortal()
const {
return this->ValuePortal; }
89 IndexPortalType IndexPortal;
90 ValuePortalType ValuePortal;
100 template <
typename IndexStorageTag,
typename ValueStorageTag>
108 template <
typename T,
typename IndexStorageTag,
typename ValueStorageTag>
112 (viskores::cont::internal::IsValidArrayHandle<viskores::Id, IndexStorageTag>::value),
113 "Invalid index storage tag.");
115 (viskores::cont::internal::IsValidArrayHandle<T, ValueStorageTag>::value),
116 "Invalid value storage tag.");
118 using IndexStorage = viskores::cont::internal::Storage<viskores::Id, IndexStorageTag>;
119 using ValueStorage = viskores::cont::internal::Storage<T, ValueStorageTag>;
126 std::size_t ValueBufferOffset;
129 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> IndexBuffers(
130 const std::vector<viskores::cont::internal::Buffer>& buffers)
132 Info info = buffers[0].GetMetaData<Info>();
133 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1,
134 buffers.begin() + info.ValueBufferOffset);
136 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> ValueBuffers(
137 const std::vector<viskores::cont::internal::Buffer>& buffers)
139 Info info = buffers[0].GetMetaData<Info>();
140 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + info.ValueBufferOffset,
147 using ReadPortalType =
148 viskores::internal::ArrayPortalPermutation<
typename IndexStorage::ReadPortalType,
149 typename ValueStorage::ReadPortalType>;
150 using WritePortalType =
151 viskores::internal::ArrayPortalPermutation<
typename IndexStorage::ReadPortalType,
152 typename ValueStorage::WritePortalType>;
155 const std::vector<viskores::cont::internal::Buffer>& buffers)
157 return ValueStorage::GetNumberOfComponentsFlat(ValueBuffers(buffers));
161 const std::vector<viskores::cont::internal::Buffer>& buffers)
163 return IndexStorage::GetNumberOfValues(IndexBuffers(buffers));
166 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
176 const std::vector<viskores::cont::internal::Buffer>& buffers,
180 return ReadPortalType(IndexStorage::CreateReadPortal(IndexBuffers(buffers), device, token),
181 ValueStorage::CreateReadPortal(ValueBuffers(buffers), device, token));
185 const std::vector<viskores::cont::internal::Buffer>& buffers,
190 return WritePortalType(IndexStorage::CreateReadPortal(IndexBuffers(buffers), device, token),
191 ValueStorage::CreateWritePortal(ValueBuffers(buffers), device, token));
194 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
195 const IndexArray& indexArray = IndexArray{},
196 const ValueArray& valueArray = ValueArray{})
199 info.ValueBufferOffset = 1 + indexArray.GetBuffers().size();
200 return viskores::cont::internal::CreateBuffers(info, indexArray, valueArray);
204 const std::vector<viskores::cont::internal::Buffer>& buffers)
206 return IndexArray(IndexBuffers(buffers));
210 const std::vector<viskores::cont::internal::Buffer>& buffers)
212 return ValueArray(ValueBuffers(buffers));
241 template <
typename IndexArrayHandleType,
typename ValueArrayHandleType>
244 typename ValueArrayHandleType::ValueType,
245 viskores::cont::StorageTagPermutation<typename IndexArrayHandleType::StorageTag,
246 typename ValueArrayHandleType::StorageTag>>
254 (std::is_same<viskores::Id, typename IndexArrayHandleType::ValueType>::value),
255 "Permutation array in ArrayHandlePermutation must have viskores::Id value type.");
262 typename ValueArrayHandleType::ValueType,
264 typename ValueArrayHandleType::StorageTag>>));
269 const ValueArrayHandleType& valueArray)
281 return StorageType::GetIndexArray(this->
GetBuffers());
291 return StorageType::GetValueArray(this->
GetBuffers());
298 template <
typename IndexArrayHandleType,
typename ValueArrayHandleType>
316 template <
typename IdxAH,
typename ValAH>
317 struct SerializableTypeString<
viskores::cont::ArrayHandlePermutation<IdxAH, ValAH>>
327 template <
typename T,
typename IdxST,
typename ValST>
328 struct SerializableTypeString<
329 viskores::cont::ArrayHandle<T, viskores::cont::StorageTagPermutation<IdxST, ValST>>>
330 : SerializableTypeString<
331 viskores::cont::ArrayHandlePermutation<viskores::cont::ArrayHandle<viskores::Id, IdxST>,
332 viskores::cont::ArrayHandle<T, ValST>>>
341 template <
typename IdxAH,
typename ValAH>
342 struct Serialization<
viskores::cont::ArrayHandlePermutation<IdxAH, ValAH>>
349 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
351 viskoresdiy::save(bb, Type(obj).GetIndexArray());
352 viskoresdiy::save(bb, Type(obj).GetValueArray());
367 template <
typename T,
typename IdxST,
typename ValST>
368 struct Serialization<
369 viskores::cont::ArrayHandle<T, viskores::cont::StorageTagPermutation<IdxST, ValST>>>
371 viskores::cont::ArrayHandlePermutation<viskores::cont::ArrayHandle<viskores::Id, IdxST>,
372 viskores::cont::ArrayHandle<T, ValST>>>
379 #endif //viskores_cont_ArrayHandlePermutation_h