Viskores  1.0
ArraySetValues.h
Go to the documentation of this file.
1 //============================================================================
2 // The contents of this file are covered by the Viskores license. See
3 // LICENSE.txt for details.
4 //
5 // By contributing to this file, all contributors agree to the Developer
6 // Certificate of Origin Version 1.1 (DCO 1.1) as stated in DCO.txt.
7 //============================================================================
8 
9 //============================================================================
10 // Copyright (c) Kitware, Inc.
11 // All rights reserved.
12 // See LICENSE.txt for details.
13 //
14 // This software is distributed WITHOUT ANY WARRANTY; without even
15 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 // PURPOSE. See the above copyright notice for more information.
17 //============================================================================
18 
19 #ifndef viskores_cont_ArraySetValues_h
20 #define viskores_cont_ArraySetValues_h
21 
23 
26 
27 #include <initializer_list>
28 #include <vector>
29 
30 namespace viskores
31 {
32 namespace cont
33 {
34 
35 namespace internal
36 {
37 
38 VISKORES_CONT_EXPORT void ArraySetValuesImpl(const viskores::cont::UnknownArrayHandle& ids,
41  std::false_type extractComponentInefficient);
42 
43 template <typename IdsArrayHandle, typename ValuesArrayHandle, typename DataArrayHandle>
44 void ArraySetValuesImpl(const IdsArrayHandle& ids,
45  const ValuesArrayHandle& values,
46  const DataArrayHandle& data,
47  std::true_type viskoresNotUsed(extractComponentInefficient))
48 {
49  // Fallback implementation using control portals when device operations would be inefficient
50  viskores::Id numValues = ids.GetNumberOfValues();
51  VISKORES_ASSERT(values.GetNumberOfValues() == numValues);
52 
53  auto idsPortal = ids.ReadPortal();
54  auto valuesPortal = values.ReadPortal();
55  auto dataPortal = data.WritePortal();
56 
57  for (viskores::Id index = 0; index < numValues; ++index)
58  {
59  dataPortal.Set(idsPortal.Get(index), valuesPortal.Get(index));
60  }
61 }
62 
63 } // namespace internal
64 
120 template <typename SIds, typename T, typename SValues, typename SData>
124 {
125  using DataArrayHandle = viskores::cont::ArrayHandle<T, SData>;
126  using InefficientExtract =
127  viskores::cont::internal::ArrayExtractComponentIsInefficient<DataArrayHandle>;
128  internal::ArraySetValuesImpl(ids, values, data, InefficientExtract{});
129 }
130 
132 template <typename SIds, typename TIn, typename SValues, typename TOut, typename SData>
137 {
139  tempValues.Allocate(values.GetNumberOfValues());
140  auto inp = values.ReadPortal();
141  auto outp = tempValues.WritePortal();
142  for (viskores::Id i = 0; i < values.GetNumberOfValues(); ++i)
143  {
144  outp.Set(i, static_cast<TIn>(inp.Get(i)));
145  }
146 
148  ArraySetValues(ids, tempValues, castArray.GetSourceArray());
149 }
150 
151 template <typename SIds, typename T, typename SData, typename Alloc>
153  const std::vector<T, Alloc>& values,
155 {
156  const auto valuesAH = viskores::cont::make_ArrayHandle(values, viskores::CopyFlag::Off);
157  ArraySetValues(ids, valuesAH, data);
158 }
159 
160 template <typename T, typename SIds, typename SValues, typename SData>
161 VISKORES_CONT void ArraySetValues(const std::vector<viskores::Id, SIds>& ids,
164 {
166  ArraySetValues(idsAH, values, data);
167 }
168 
169 template <typename T, typename AllocId, typename AllocVal, typename SData>
170 VISKORES_CONT void ArraySetValues(const std::vector<viskores::Id, AllocId>& ids,
171  const std::vector<T, AllocVal>& values,
173 {
175  const auto valuesAH = viskores::cont::make_ArrayHandle(values, viskores::CopyFlag::Off);
176  ArraySetValues(idsAH, valuesAH, data);
177 }
178 
179 template <typename T, typename SData, typename Alloc>
180 VISKORES_CONT void ArraySetValues(const std::initializer_list<viskores::Id>& ids,
181  const std::vector<T, Alloc>& values,
183 {
184  const auto idsAH = viskores::cont::make_ArrayHandle(
185  ids.begin(), static_cast<viskores::Id>(ids.size()), viskores::CopyFlag::Off);
186  const auto valuesAH = viskores::cont::make_ArrayHandle(values, viskores::CopyFlag::Off);
187  ArraySetValues(idsAH, valuesAH, data);
188 }
189 
190 template <typename T, typename SData>
191 VISKORES_CONT void ArraySetValues(const std::initializer_list<viskores::Id>& ids,
192  const std::initializer_list<T>& values,
194 {
195  const auto idsAH = viskores::cont::make_ArrayHandle(
196  ids.begin(), static_cast<viskores::Id>(ids.size()), viskores::CopyFlag::Off);
197  const auto valuesAH = viskores::cont::make_ArrayHandle(
198  values.begin(), static_cast<viskores::Id>(values.size()), viskores::CopyFlag::Off);
199  ArraySetValues(idsAH, valuesAH, data);
200 }
201 
202 template <typename T, typename SValues, typename SData>
203 VISKORES_CONT void ArraySetValues(const std::initializer_list<viskores::Id>& ids,
206 {
207  const auto idsAH = viskores::cont::make_ArrayHandle(
208  ids.begin(), static_cast<viskores::Id>(ids.size()), viskores::CopyFlag::Off);
209  ArraySetValues(idsAH, values, data);
210 }
211 
212 template <typename T, typename SData>
214  const viskores::Id numIds,
215  const std::vector<T>& values,
217 {
218  VISKORES_ASSERT(numIds == static_cast<viskores::Id>(values.size()));
219  const auto idsAH = viskores::cont::make_ArrayHandle(ids, numIds, viskores::CopyFlag::Off);
220  const auto valuesAH =
221  viskores::cont::make_ArrayHandle(values.data(), values.size(), viskores::CopyFlag::Off);
222  ArraySetValues(idsAH, valuesAH, data);
223 }
224 
225 template <typename T, typename SData>
227  const viskores::Id numIds,
228  const T* values,
229  const viskores::Id numValues,
231 {
232  VISKORES_ASSERT(numIds == numValues);
233  const auto idsAH = viskores::cont::make_ArrayHandle(ids, numIds, viskores::CopyFlag::Off);
234  const auto valuesAH =
236  ArraySetValues(idsAH, valuesAH, data);
237 }
238 
239 template <typename T, typename SData>
241  const viskores::Id numIds,
244 {
245  VISKORES_ASSERT(numIds == values.GetNumberOfValues());
246  const auto idsAH = viskores::cont::make_ArrayHandle(ids, numIds, viskores::CopyFlag::Off);
247  ArraySetValues(idsAH, values, data);
248 }
249 
255 template <typename T, typename SData>
257  const T& value,
259 {
261  const auto valueAH = viskores::cont::make_ArrayHandle(&value, 1, viskores::CopyFlag::Off);
262  ArraySetValues(idAH, valueAH, data);
263 }
264 
266 
267 } // namespace cont
268 } // namespace viskores
269 
270 #endif //viskores_cont_ArraySetValues_h
ArrayHandle.h
viskores::cont::ArrayHandle::ReadPortal
ReadPortalType ReadPortal() const
Get an array portal that can be used in the control environment.
Definition: ArrayHandle.h:447
viskores::cont::StorageTagCast
Definition: ArrayHandleCast.h:36
viskores::CopyFlag::Off
@ Off
viskores::cont::ArraySetValues
void ArraySetValues(const viskores::cont::ArrayHandle< viskores::Id, SIds > &ids, const viskores::cont::ArrayHandle< T, SValues > &values, const viskores::cont::ArrayHandle< T, SData > &data)
Set a small set of values in an ArrayHandle with minimal device transfers.
Definition: ArraySetValues.h:121
viskores::cont::ArrayHandleCast
Cast the values of an array to the specified type, on demand.
Definition: ArrayHandleCast.h:151
viskoresNotUsed
#define viskoresNotUsed(parameter_name)
Simple macro to identify a parameter as unused.
Definition: ExportMacros.h:136
viskores::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:313
viskores::cont::ArrayHandleCast::GetSourceArray
ArrayHandleType GetSourceArray() const
Returns the ArrayHandle that is being transformed.
Definition: ArrayHandleCast.h:179
viskores::Id
viskores::Int64 Id
Base type to use to index arrays.
Definition: Types.h:235
VISKORES_CONT
#define VISKORES_CONT
Definition: ExportMacros.h:65
UnknownArrayHandle.h
viskores
Groups connected points that have the same field value.
Definition: Atomic.h:27
viskores::cont::ArrayHandle< T, viskores::cont::StorageTagBasic >::Allocate
void Allocate(viskores::Id numberOfValues, viskores::CopyFlag preserve, viskores::cont::Token &token) const
Allocates an array large enough to hold the given number of values.
Definition: ArrayHandle.h:504
viskores::cont::ArrayHandleBasic
Basic array storage for an array handle.
Definition: ArrayHandleBasic.h:120
viskores::cont::ArrayHandle::GetNumberOfValues
viskores::Id GetNumberOfValues() const
Returns the number of entries in the array.
Definition: ArrayHandle.h:482
VISKORES_ASSERT
#define VISKORES_ASSERT(condition)
Definition: Assert.h:51
viskores::cont::ArrayHandle< T, viskores::cont::StorageTagBasic >::WritePortal
WritePortalType WritePortal() const
Get an array portal that can be used in the control environment.
Definition: ArrayHandle.h:468
viskores::cont::UnknownArrayHandle
An ArrayHandle of an unknown value type and storage.
Definition: UnknownArrayHandle.h:451
viskores::cont::make_ArrayHandle
viskores::cont::ArrayHandleBasic< T > make_ArrayHandle(const T *array, viskores::Id numberOfValues, viskores::CopyFlag copy)
A convenience function for creating an ArrayHandle from a standard C array.
Definition: ArrayHandleBasic.h:285
viskores::cont::ArraySetValue
void ArraySetValue(viskores::Id id, const T &value, const viskores::cont::ArrayHandle< T, SData > &data)
Set a single value in an ArrayHandle at the specified index.
Definition: ArraySetValues.h:256
viskores_cont_export.h