18 #ifndef viskores_cont_ArrayHandleConcatenate_h
19 #define viskores_cont_ArrayHandleConcatenate_h
30 template <
typename PortalType1,
typename PortalType2>
31 class VISKORES_ALWAYS_EXPORT ArrayPortalConcatenate
33 using WritableP1 = viskores::internal::PortalSupportsSets<PortalType1>;
34 using WritableP2 = viskores::internal::PortalSupportsSets<PortalType2>;
35 using Writable = std::integral_constant<bool, WritableP1::value && WritableP2::value>;
38 using ValueType =
typename PortalType1::ValueType;
42 ArrayPortalConcatenate()
50 ArrayPortalConcatenate(
const PortalType1& p1,
const PortalType2& p2)
58 template <
typename OtherP1,
typename OtherP2>
59 VISKORES_EXEC_CONT ArrayPortalConcatenate(
const ArrayPortalConcatenate<OtherP1, OtherP2>& src)
60 : portal1(src.GetPortal1())
61 , portal2(src.GetPortal2())
68 return this->portal1.GetNumberOfValues() + this->portal2.GetNumberOfValues();
75 if (index < this->portal1.GetNumberOfValues())
77 return this->portal1.Get(index);
81 return this->portal2.Get(index - this->portal1.GetNumberOfValues());
86 template <
typename Writable_ = Writable,
87 typename =
typename std::enable_if<Writable_::value>::type>
90 if (index < this->portal1.GetNumberOfValues())
92 this->portal1.Set(index, value);
96 this->portal2.Set(index - this->portal1.GetNumberOfValues(), value);
101 const PortalType1& GetPortal1()
const {
return this->portal1; }
104 const PortalType2& GetPortal2()
const {
return this->portal2; }
119 template <
typename StorageTag1,
typename StorageTag2>
127 template <
typename T,
typename ST1,
typename ST2>
130 using SourceStorage1 = viskores::cont::internal::Storage<T, ST1>;
131 using SourceStorage2 = viskores::cont::internal::Storage<T, ST2>;
138 std::size_t NumBuffers1;
139 std::size_t NumBuffers2;
142 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> Buffers1(
143 const std::vector<viskores::cont::internal::Buffer>& buffers)
145 Info info = buffers[0].GetMetaData<Info>();
146 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1,
147 buffers.begin() + 1 + info.NumBuffers1);
150 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> Buffers2(
151 const std::vector<viskores::cont::internal::Buffer>& buffers)
153 Info info = buffers[0].GetMetaData<Info>();
154 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1 + info.NumBuffers1,
161 using ReadPortalType =
162 viskores::internal::ArrayPortalConcatenate<
typename SourceStorage1::ReadPortalType,
163 typename SourceStorage2::ReadPortalType>;
164 using WritePortalType =
165 viskores::internal::ArrayPortalConcatenate<
typename SourceStorage1::WritePortalType,
166 typename SourceStorage2::WritePortalType>;
169 const std::vector<viskores::cont::internal::Buffer>& buffers)
172 SourceStorage1::GetNumberOfComponentsFlat(Buffers1(buffers));
174 SourceStorage2::GetNumberOfComponentsFlat(Buffers2(buffers));
175 if (components1 == components2)
187 const std::vector<viskores::cont::internal::Buffer>& buffers)
189 return (SourceStorage1::GetNumberOfValues(Buffers1(buffers)) +
190 SourceStorage2::GetNumberOfValues(Buffers2(buffers)));
193 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>& buffers,
199 viskores::Id size1 = SourceStorage1::GetNumberOfValues(Buffers1(buffers));
200 if ((startIndex < size1) && (endIndex <= size1))
202 SourceStorage1::Fill(Buffers1(buffers), fillValue, startIndex, endIndex, token);
204 else if (startIndex < size1)
206 SourceStorage1::Fill(Buffers1(buffers), fillValue, startIndex, size1, token);
207 SourceStorage2::Fill(Buffers2(buffers), fillValue, 0, endIndex - size1, token);
211 SourceStorage2::Fill(
212 Buffers2(buffers), fillValue, startIndex - size1, endIndex - size1, token);
217 const std::vector<viskores::cont::internal::Buffer>& buffers,
221 return ReadPortalType(SourceStorage1::CreateReadPortal(Buffers1(buffers), device, token),
222 SourceStorage2::CreateReadPortal(Buffers2(buffers), device, token));
226 const std::vector<viskores::cont::internal::Buffer>& buffers,
230 return WritePortalType(SourceStorage1::CreateWritePortal(Buffers1(buffers), device, token),
231 SourceStorage2::CreateWritePortal(Buffers2(buffers), device, token));
234 VISKORES_CONT static auto CreateBuffers(
const ArrayHandleType1& array1 = ArrayHandleType1{},
235 const ArrayHandleType2& array2 = ArrayHandleType2{})
236 -> decltype(viskores::cont::internal::CreateBuffers())
239 info.NumBuffers1 = array1.GetBuffers().size();
240 info.NumBuffers2 = array2.GetBuffers().size();
241 return viskores::cont::internal::CreateBuffers(info, array1, array2);
245 const std::vector<viskores::cont::internal::Buffer>& buffers)
247 return ArrayHandleType1(Buffers1(buffers));
251 const std::vector<viskores::cont::internal::Buffer>& buffers)
253 return ArrayHandleType2(Buffers2(buffers));
266 template <
typename ArrayHandleType1,
typename ArrayHandleType2>
269 StorageTagConcatenate<typename ArrayHandleType1::StorageTag,
270 typename ArrayHandleType2::StorageTag>>
278 typename ArrayHandleType2::StorageTag>>));
287 template <
typename ArrayHandleType1,
typename ArrayHandleType2>
288 VISKORES_CONT ArrayHandleConcatenate<ArrayHandleType1, ArrayHandleType2>
304 template <
typename AH1,
typename AH2>
305 struct SerializableTypeString<
viskores::cont::ArrayHandleConcatenate<AH1, AH2>>
315 template <
typename T,
typename ST1,
typename ST2>
316 struct SerializableTypeString<
317 viskores::cont::ArrayHandle<T, viskores::cont::StorageTagConcatenate<ST1, ST2>>>
318 : SerializableTypeString<
319 viskores::cont::ArrayHandleConcatenate<viskores::cont::ArrayHandle<T, ST1>,
320 viskores::cont::ArrayHandle<T, ST2>>>
329 template <
typename AH1,
typename AH2>
330 struct Serialization<
viskores::cont::ArrayHandleConcatenate<AH1, AH2>>
337 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
339 auto storage = obj.GetStorage();
340 viskoresdiy::save(bb, storage.GetArray1());
341 viskoresdiy::save(bb, storage.GetArray2());
356 template <
typename T,
typename ST1,
typename ST2>
357 struct Serialization<
358 viskores::cont::ArrayHandle<T, viskores::cont::StorageTagConcatenate<ST1, ST2>>>
359 : Serialization<viskores::cont::ArrayHandleConcatenate<viskores::cont::ArrayHandle<T, ST1>,
360 viskores::cont::ArrayHandle<T, ST2>>>
367 #endif //viskores_cont_ArrayHandleConcatenate_h