18 #ifndef viskores_cont_ArrayHandleRecombineVec_h
19 #define viskores_cont_ArrayHandleRecombineVec_h
37 template <
typename SourcePortalType>
38 class ArrayPortalRecombineVec;
40 template <
typename PortalType>
47 friend viskores::internal::ArrayPortalRecombineVec<PortalType>;
51 using ComponentType =
typename std::remove_const<typename PortalType::ValueType>::type;
53 RecombineVec(
const RecombineVec&) =
default;
68 viskores::internal::ArrayPortalValueReference<PortalType> operator[](
71 return viskores::internal::ArrayPortalValueReference<PortalType>(this->Portals[cIndex],
75 template <
typename T, viskores::IdComponent DestSize>
81 dest[cIndex] = this->Portals[cIndex].Get(this->Index);
94 if ((&this->Portals[0] != &src.Portals[0]) || (this->Index != src.Index))
105 template <
typename T>
112 VISKORES_EXEC_CONT operator ComponentType()
const {
return this->Portals[0].Get(this->Index); }
114 template <viskores::IdComponent N>
118 this->CopyInto(result);
122 template <
typename T>
126 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
129 (*this)[cIndex] += VTraits::GetComponent(src, cIndex);
133 template <
typename T>
137 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
140 (*this)[cIndex] -= VTraits::GetComponent(src, cIndex);
144 template <
typename T>
148 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
151 (*this)[cIndex] *= VTraits::GetComponent(src, cIndex);
155 template <
typename T>
159 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
162 (*this)[cIndex] /= VTraits::GetComponent(src, cIndex);
166 template <
typename T>
170 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
173 (*this)[cIndex] %= VTraits::GetComponent(src, cIndex);
177 template <
typename T>
181 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
184 (*this)[cIndex] &= VTraits::GetComponent(src, cIndex);
188 template <
typename T>
192 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
195 (*this)[cIndex] |= VTraits::GetComponent(src, cIndex);
199 template <
typename T>
203 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
206 (*this)[cIndex] ^= VTraits::GetComponent(src, cIndex);
210 template <
typename T>
214 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
217 (*this)[cIndex] >>= VTraits::GetComponent(src, cIndex);
221 template <
typename T>
225 VISKORES_ASSERT(this->GetNumberOfComponents() == VTraits::GetNumberOfComponents(src));
228 (*this)[cIndex] <<= VTraits::GetComponent(src, cIndex);
234 template <
typename T>
239 if (numComponents > 1)
241 if (numComponents > this->GetNumberOfComponents())
243 numComponents = this->GetNumberOfComponents();
247 this->Portals[cIndex].Set(this->Index,
248 static_cast<ComponentType
>(VTraits::GetComponent(src, cIndex)));
256 this->Portals[cIndex].Set(this->Index,
257 static_cast<ComponentType
>(VTraits::GetComponent(src, 0)));
265 template <
typename PortalType>
266 struct TypeTraits<
viskores::internal::RecombineVec<PortalType>>
269 using VecType = viskores::internal::RecombineVec<PortalType>;
270 using ComponentType =
typename VecType::ComponentType;
279 return viskores::internal::RecombineVec<PortalType>{};
283 template <
typename PortalType>
284 struct VecTraits<
viskores::internal::RecombineVec<PortalType>>
286 using VecType = viskores::internal::RecombineVec<PortalType>;
294 return vector.GetNumberOfComponents();
300 return vector[componentIndex];
307 vector[componentIndex] = component;
310 template <viskores::IdComponent destSize>
321 template <
typename SourcePortalType>
322 class ArrayPortalRecombineVec
328 const SourcePortalType* Portals;
332 using ValueType = viskores::internal::RecombineVec<SourcePortalType>;
334 ArrayPortalRecombineVec() =
default;
337 , NumberOfComponents(numComponents)
343 return this->Portals[0].GetNumberOfValues();
348 return ValueType({ this->Portals, this->NumberOfComponents }, index);
353 if ((value.GetIndex() == index) && (value.Portals.GetPointer() == this->Portals))
360 this->DoCopy(index, value);
364 template <
typename T>
367 this->DoCopy(index, value);
371 template <
typename T>
375 VISKORES_ASSERT(Traits::GetNumberOfComponents(value) == this->NumberOfComponents);
378 this->Portals[cIndex].Set(index, Traits::GetComponent(value, cIndex));
394 struct StorageTagRecombineVec
401 struct RecombineVecMetaData
403 mutable std::vector<viskores::cont::internal::Buffer> PortalBuffers;
404 std::vector<std::size_t> ArrayBufferOffsets;
406 RecombineVecMetaData() =
default;
408 RecombineVecMetaData(
const RecombineVecMetaData& src) { *
this = src; }
410 RecombineVecMetaData& operator=(
const RecombineVecMetaData& src)
412 this->ArrayBufferOffsets = src.ArrayBufferOffsets;
414 this->PortalBuffers.clear();
421 template <
typename T>
422 using RecombinedPortalType = viskores::internal::ArrayPortalMultiplexer<
423 typename viskores::cont::internal::Storage<T, viskores::cont::StorageTagStride>::ReadPortalType,
424 typename viskores::cont::internal::Storage<T, viskores::cont::StorageTagStride>::WritePortalType>;
426 template <
typename T>
427 using RecombinedValueType = viskores::internal::RecombineVec<RecombinedPortalType<T>>;
431 template <
typename ReadWritePortal>
432 class Storage<
viskores::internal::RecombineVec<ReadWritePortal>,
433 viskores::cont::internal::StorageTagRecombineVec>
435 using ComponentType =
typename ReadWritePortal::ValueType;
436 using SourceStorage =
437 viskores::cont::internal::Storage<ComponentType, viskores::cont::StorageTagStride>;
441 (std::is_same<ReadWritePortal, detail::RecombinedPortalType<ComponentType>>::value));
443 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> BuffersForComponent(
444 const std::vector<viskores::cont::internal::Buffer>& buffers,
447 auto& metaData = buffers[0].GetMetaData<detail::RecombineVecMetaData>();
448 std::size_t index =
static_cast<std::size_t
>(componentIndex);
449 return std::vector<viskores::cont::internal::Buffer>(
450 buffers.begin() + metaData.ArrayBufferOffsets[index],
451 buffers.begin() + metaData.ArrayBufferOffsets[index + 1]);
455 using ReadPortalType = viskores::internal::ArrayPortalRecombineVec<ReadWritePortal>;
456 using WritePortalType = viskores::internal::ArrayPortalRecombineVec<ReadWritePortal>;
459 const std::vector<viskores::cont::internal::Buffer>& buffers)
462 buffers[0].GetMetaData<detail::RecombineVecMetaData>().ArrayBufferOffsets.size() - 1);
466 const std::vector<viskores::cont::internal::Buffer>& buffers)
470 SourceStorage::GetNumberOfComponentsFlat(BuffersForComponent(buffers, 0));
471 return numComponents * numSubComponents;
475 const std::vector<viskores::cont::internal::Buffer>& buffers)
477 return SourceStorage::GetNumberOfValues(BuffersForComponent(buffers, 0));
482 const std::vector<viskores::cont::internal::Buffer>& buffers,
489 SourceStorage::ResizeBuffers(
490 numValues, BuffersForComponent(buffers, component), preserve, token);
494 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
495 const viskores::internal::RecombineVec<ReadWritePortal>&,
504 const std::vector<viskores::cont::internal::Buffer>& buffers,
513 viskores::cont::internal::Buffer portalBuffer;
523 buffers[0].GetMetaData<detail::RecombineVecMetaData>().PortalBuffers.push_back(portalBuffer);
526 ReadWritePortal* portals =
527 reinterpret_cast<ReadWritePortal*
>(portalBuffer.WritePointerHost(token));
530 portals[cIndex] = ReadWritePortal(
531 SourceStorage::CreateReadPortal(BuffersForComponent(buffers, cIndex), device, token));
536 return ReadPortalType(
537 reinterpret_cast<const ReadWritePortal*
>(portalBuffer.ReadPointerDevice(device, token)),
542 const std::vector<viskores::cont::internal::Buffer>& buffers,
551 viskores::cont::internal::Buffer portalBuffer;
561 buffers[0].GetMetaData<detail::RecombineVecMetaData>().PortalBuffers.push_back(portalBuffer);
564 ReadWritePortal* portals =
565 reinterpret_cast<ReadWritePortal*
>(portalBuffer.WritePointerHost(token));
568 portals[cIndex] = ReadWritePortal(
569 SourceStorage::CreateWritePortal(BuffersForComponent(buffers, cIndex), device, token));
574 return WritePortalType(
575 reinterpret_cast<const ReadWritePortal*
>(portalBuffer.ReadPointerDevice(device, token)),
580 const std::vector<viskores::cont::internal::Buffer>& buffers,
583 return ArrayType(BuffersForComponent(buffers, componentIndex));
586 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers()
588 detail::RecombineVecMetaData metaData;
589 metaData.ArrayBufferOffsets.push_back(1);
590 return viskores::cont::internal::CreateBuffers(metaData);
593 VISKORES_CONT static void AppendComponent(std::vector<viskores::cont::internal::Buffer>& buffers,
594 const ArrayType& array)
597 buffers.insert(buffers.end(), array.GetBuffers().begin(), array.GetBuffers().end());
599 buffers[0].GetMetaData<detail::RecombineVecMetaData>().ArrayBufferOffsets.push_back(
625 template <
typename ComponentType>
628 viskores::cont::internal::StorageTagRecombineVec>
635 viskores::cont::internal::StorageTagRecombineVec>));
646 return StorageType::GetNumberOfComponents(this->
GetBuffers());
657 return StorageType::ArrayForComponent(this->
GetBuffers(), componentIndex);
667 std::vector<viskores::cont::internal::Buffer> buffers = this->
GetBuffers();
668 StorageType::AppendComponent(buffers, array);
677 struct ArrayExtractComponentImpl<
viskores::cont::internal::StorageTagRecombineVec>
679 template <
typename RecombineVec>
684 viskores::cont::internal::StorageTagRecombineVec>& src,
688 using ComponentType =
typename RecombineVec::ComponentType;
693 array.GetComponentArray(componentIndex / subComponents),
694 componentIndex % subComponents,
700 template <
typename S>
701 struct ArrayRangeComputeImpl;
703 template <
typename S>
704 struct ArrayRangeComputeMagnitudeImpl;
706 template <
typename T,
typename S>
710 bool computeFiniteRange,
713 return viskores::cont::internal::ArrayRangeComputeImpl<S>{}(
714 input, maskArray, computeFiniteRange, device);
717 template <
typename T,
typename S>
721 bool computeFiniteRange,
724 return viskores::cont::internal::ArrayRangeComputeMagnitudeImpl<S>{}(
725 input, maskArray, computeFiniteRange, device);
729 struct VISKORES_CONT_EXPORT ArrayRangeComputeImpl<
viskores::cont::internal::StorageTagRecombineVec>
731 template <
typename RecombineVecType>
734 viskores::cont::internal::StorageTagRecombineVec>& input_,
736 bool computeFiniteRange,
739 auto input =
static_cast<
743 result.Allocate(input.GetNumberOfComponents());
745 if (input.GetNumberOfValues() < 1)
751 auto resultPortal = result.WritePortal();
754 auto rangeAH = ArrayRangeComputeImplCaller(
755 input.GetComponentArray(i), maskArray, computeFiniteRange, device);
756 resultPortal.Set(i, rangeAH.ReadPortal().Get(0));
763 template <
typename ArrayHandleType>
764 struct ArrayValueIsNested;
766 template <
typename RecombineVecType>
767 struct ArrayValueIsNested<
768 viskores::cont::ArrayHandle<RecombineVecType, viskores::cont::internal::StorageTagRecombineVec>>
770 static constexpr
bool Value =
false;
774 struct VISKORES_CONT_EXPORT
775 ArrayRangeComputeMagnitudeImpl<
viskores::cont::internal::StorageTagRecombineVec>
777 template <
typename RecombineVecType>
780 viskores::cont::internal::StorageTagRecombineVec>& input_,
782 bool computeFiniteRange,
785 auto input =
static_cast<
788 if (input.GetNumberOfValues() < 1)
792 if (input.GetNumberOfComponents() == 1)
794 return ArrayRangeComputeMagnitudeImplCaller(
795 input.GetComponentArray(0), maskArray, computeFiniteRange, device);
798 return ArrayRangeComputeMagnitudeGeneric(input_, maskArray, computeFiniteRange, device);
807 #endif //viskores_cont_ArrayHandleRecombineVec_h