18 #ifndef viskores_cont_ArrayHandleZip_h
19 #define viskores_cont_ArrayHandleZip_h
34 template <
typename PortalTypeFirst,
typename PortalTypeSecond>
37 using ReadableP1 = viskores::internal::PortalSupportsGets<PortalTypeFirst>;
38 using ReadableP2 = viskores::internal::PortalSupportsGets<PortalTypeSecond>;
39 using WritableP1 = viskores::internal::PortalSupportsSets<PortalTypeFirst>;
40 using WritableP2 = viskores::internal::PortalSupportsSets<PortalTypeSecond>;
42 using Readable = std::integral_constant<bool, ReadableP1::value && ReadableP2::value>;
43 using Writable = std::integral_constant<bool, WritableP1::value && WritableP2::value>;
46 using T =
typename PortalTypeFirst::ValueType;
47 using U =
typename PortalTypeSecond::ValueType;
59 ArrayPortalZip(
const PortalTypeFirst& portalfirst,
const PortalTypeSecond& portalsecond)
60 : PortalFirst(portalfirst)
61 , PortalSecond(portalsecond)
69 template <
class OtherF,
class OtherS>
70 VISKORES_CONT ArrayPortalZip(
const ArrayPortalZip<OtherF, OtherS>& src)
71 : PortalFirst(src.GetFirstPortal())
72 , PortalSecond(src.GetSecondPortal())
78 viskores::Id GetNumberOfValues()
const {
return this->PortalFirst.GetNumberOfValues(); }
81 template <
typename Readable_ = Readable,
82 typename =
typename std::enable_if<Readable_::value>::type>
89 template <
typename Writable_ = Writable,
90 typename =
typename std::enable_if<Writable_::value>::type>
93 this->PortalFirst.Set(index, value.first);
94 this->PortalSecond.Set(index, value.second);
98 const PortalTypeFirst& GetFirstPortal()
const {
return this->PortalFirst; }
101 const PortalTypeSecond& GetSecondPortal()
const {
return this->PortalSecond; }
104 PortalTypeFirst PortalFirst;
105 PortalTypeSecond PortalSecond;
116 template <
typename ST1,
typename ST2>
127 template <
typename FirstHandleType,
typename SecondHandleType>
128 struct ArrayHandleZipTraits
145 template <
typename T1,
typename T2,
typename ST1,
typename ST2>
148 using FirstStorage = Storage<T1, ST1>;
149 using SecondStorage = Storage<T2, ST2>;
157 std::size_t SecondBuffersOffset;
160 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> FirstArrayBuffers(
161 const std::vector<viskores::cont::internal::Buffer>& buffers)
163 const Info& info = buffers[0].GetMetaData<Info>();
164 return std::vector<viskores::cont::internal::Buffer>(
165 buffers.begin() + 1, buffers.begin() + info.SecondBuffersOffset);
167 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> SecondArrayBuffers(
168 const std::vector<viskores::cont::internal::Buffer>& buffers)
170 const Info& info = buffers[0].GetMetaData<
Info>();
171 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + info.SecondBuffersOffset,
176 using ReadPortalType =
177 viskores::exec::internal::ArrayPortalZip<
typename FirstStorage::ReadPortalType,
178 typename SecondStorage::ReadPortalType>;
179 using WritePortalType =
180 viskores::exec::internal::ArrayPortalZip<
typename FirstStorage::WritePortalType,
181 typename SecondStorage::WritePortalType>;
183 static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
184 const FirstArrayType& firstArray = FirstArrayType{},
185 const SecondArrayType& secondArray = SecondArrayType{})
188 info.SecondBuffersOffset = 1 + firstArray.GetBuffers().size();
189 return viskores::cont::internal::CreateBuffers(info, firstArray, secondArray);
193 const std::vector<viskores::cont::internal::Buffer>&)
200 const std::vector<viskores::cont::internal::Buffer>& buffers,
204 FirstStorage::ResizeBuffers(numValues, FirstArrayBuffers(buffers), preserve, token);
205 SecondStorage::ResizeBuffers(numValues, SecondArrayBuffers(buffers), preserve, token);
209 const std::vector<viskores::cont::internal::Buffer>& buffers)
211 viskores::Id numValues = FirstStorage::GetNumberOfValues(FirstArrayBuffers(buffers));
212 VISKORES_ASSERT(numValues == SecondStorage::GetNumberOfValues(SecondArrayBuffers(buffers)));
216 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>& buffers,
217 const ValueType& fillValue,
222 FirstStorage::Fill(FirstArrayBuffers(buffers), fillValue.first, startIndex, endIndex, token);
223 SecondStorage::Fill(SecondArrayBuffers(buffers), fillValue.second, startIndex, endIndex, token);
227 const std::vector<viskores::cont::internal::Buffer>& buffers,
231 return ReadPortalType(
232 FirstStorage::CreateReadPortal(FirstArrayBuffers(buffers), device, token),
233 SecondStorage::CreateReadPortal(SecondArrayBuffers(buffers), device, token));
237 const std::vector<viskores::cont::internal::Buffer>& buffers,
241 return WritePortalType(
242 FirstStorage::CreateWritePortal(FirstArrayBuffers(buffers), device, token),
243 SecondStorage::CreateWritePortal(SecondArrayBuffers(buffers), device, token));
246 static FirstArrayType GetFirstArray(
const std::vector<viskores::cont::internal::Buffer>& buffers)
248 return FirstArrayType(FirstArrayBuffers(buffers));
250 static SecondArrayType GetSecondArray(
251 const std::vector<viskores::cont::internal::Buffer>& buffers)
253 return SecondArrayType(SecondArrayBuffers(buffers));
262 template <
typename FirstHandleType,
typename SecondHandleType>
264 :
public internal::ArrayHandleZipTraits<FirstHandleType, SecondHandleType>
::Superclass
282 ArrayHandleZip(
const FirstHandleType& firstArray,
const SecondHandleType& secondArray)
292 return StorageType::GetSecondArray(this->
GetBuffers());
299 template <
typename FirstHandleType,
typename SecondHandleType>
301 const FirstHandleType& first,
302 const SecondHandleType& second)
317 template <
typename AH1,
typename AH2>
318 struct SerializableTypeString<
viskores::cont::ArrayHandleZip<AH1, AH2>>
328 template <
typename T1,
typename T2,
typename ST1,
typename ST2>
329 struct SerializableTypeString<
330 viskores::cont::ArrayHandle<viskores::Pair<T1, T2>, viskores::cont::StorageTagZip<ST1, ST2>>>
331 : SerializableTypeString<viskores::cont::ArrayHandleZip<viskores::cont::ArrayHandle<T1, ST1>,
332 viskores::cont::ArrayHandle<T2, ST2>>>
341 template <
typename AH1,
typename AH2>
342 struct Serialization<
viskores::cont::ArrayHandleZip<AH1, AH2>>
349 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
351 auto storage = obj.GetStorage();
352 viskoresdiy::save(bb, storage.GetFirstArray());
353 viskoresdiy::save(bb, storage.GetSecondArray());
368 template <
typename T1,
typename T2,
typename ST1,
typename ST2>
369 struct Serialization<
370 viskores::cont::ArrayHandle<viskores::Pair<T1, T2>, viskores::cont::StorageTagZip<ST1, ST2>>>
371 : Serialization<viskores::cont::ArrayHandleZip<viskores::cont::ArrayHandle<T1, ST1>,
372 viskores::cont::ArrayHandle<T2, ST2>>>
379 #endif //viskores_cont_ArrayHandleZip_h