18 #ifndef viskores_cont_ArrayHandleExtractComponent_h
19 #define viskores_cont_ArrayHandleExtractComponent_h
31 template <
typename PortalType>
32 class VISKORES_ALWAYS_EXPORT ArrayPortalExtractComponent
34 using Writable = viskores::internal::PortalSupportsSets<PortalType>;
37 using VectorType =
typename PortalType::ValueType;
39 using ValueType =
typename Traits::ComponentType;
42 ArrayPortalExtractComponent()
51 , Component(component)
55 ArrayPortalExtractComponent(
const ArrayPortalExtractComponent&) =
default;
56 ArrayPortalExtractComponent(ArrayPortalExtractComponent&&) =
default;
57 ArrayPortalExtractComponent& operator=(
const ArrayPortalExtractComponent&) =
default;
58 ArrayPortalExtractComponent& operator=(ArrayPortalExtractComponent&&) =
default;
61 viskores::Id GetNumberOfValues()
const {
return this->Portal.GetNumberOfValues(); }
66 return Traits::GetComponent(this->Portal.Get(index), this->Component);
69 template <
typename Writable_ = Writable,
70 typename =
typename std::enable_if<Writable_::value>::type>
73 VectorType vec = this->Portal.Get(index);
74 Traits::SetComponent(vec, this->Component, value);
75 this->Portal.Set(index, vec);
79 const PortalType& GetPortal()
const {
return this->Portal; }
91 template <
typename ArrayHandleType>
99 template <
typename ArrayHandleType>
100 class Storage<typename
viskores::
VecTraits<typename ArrayHandleType::ValueType>::ComponentType,
103 using SourceValueType =
typename ArrayHandleType::ValueType;
105 using SourceStorage =
typename ArrayHandleType::StorageType;
109 const std::vector<viskores::cont::internal::Buffer>& buffers)
114 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> SourceBuffers(
115 const std::vector<viskores::cont::internal::Buffer>& buffers)
117 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1, buffers.end());
120 using ReadPortalType =
121 viskores::internal::ArrayPortalExtractComponent<typename SourceStorage::ReadPortalType>;
122 using WritePortalType =
123 viskores::internal::ArrayPortalExtractComponent<typename SourceStorage::WritePortalType>;
126 const std::vector<viskores::cont::internal::Buffer>&)
132 const std::vector<viskores::cont::internal::Buffer>& buffers)
134 return SourceStorage::GetNumberOfValues(SourceBuffers(buffers));
137 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
148 const std::vector<viskores::cont::internal::Buffer>& buffers,
152 SourceStorage::ResizeBuffers(numValues, SourceBuffers(buffers), preserve, token);
156 const std::vector<viskores::cont::internal::Buffer>& buffers,
160 return ReadPortalType(SourceStorage::CreateReadPortal(SourceBuffers(buffers), device, token),
161 ComponentIndex(buffers));
165 const std::vector<viskores::cont::internal::Buffer>& buffers,
169 return WritePortalType(SourceStorage::CreateWritePortal(SourceBuffers(buffers), device, token),
170 ComponentIndex(buffers));
174 const ArrayHandleType& array = ArrayHandleType{})
175 -> decltype(viskores::cont::internal::CreateBuffers())
177 return viskores::cont::internal::CreateBuffers(componentIndex, array);
201 template <
typename ArrayHandleType>
204 typename viskores::VecTraits<typename ArrayHandleType::ValueType>::ComponentType,
205 StorageTagExtractComponent<ArrayHandleType>>
225 return StorageType::ComponentIndex(this->
GetBuffers());
232 typename ArrayHandleType::StorageTag>;
233 return ArrayHandleType(BaseArray(StorageType::SourceBuffers(this->
GetBuffers())));
239 template <
typename ArrayHandleType>
241 const ArrayHandleType& array,
253 template <
typename ArrayHandleType>
259 -> decltype(ArrayExtractComponentImpl<typename ArrayHandleType::StorageTag>{}(
260 std::declval<ArrayHandleType>(),
264 using ValueType =
typename ArrayHandleType::ValueType;
268 return ArrayExtractComponentImpl<typename ArrayHandleType::StorageTag>{}(
269 src.GetArray(), (src.GetComponent() * FLAT_SUB_COMPONENTS) + componentIndex, allowCopy);
288 template <
typename AH>
289 struct SerializableTypeString<
viskores::cont::ArrayHandleExtractComponent<AH>>
298 template <
typename AH>
299 struct SerializableTypeString<
300 viskores::cont::ArrayHandle<typename viskores::VecTraits<typename AH::ValueType>::ComponentType,
301 viskores::cont::StorageTagExtractComponent<AH>>>
302 : SerializableTypeString<viskores::cont::ArrayHandleExtractComponent<AH>>
311 template <
typename AH>
312 struct Serialization<
viskores::cont::ArrayHandleExtractComponent<AH>>
319 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
321 viskoresdiy::save(bb, Type(obj).GetComponent());
322 viskoresdiy::save(bb, Type(obj).GetArray());
336 template <
typename AH>
337 struct Serialization<
338 viskores::cont::ArrayHandle<typename viskores::VecTraits<typename AH::ValueType>::ComponentType,
339 viskores::cont::StorageTagExtractComponent<AH>>>
340 : Serialization<viskores::cont::ArrayHandleExtractComponent<AH>>
346 #endif // viskores_cont_ArrayHandleExtractComponent_h