Viskores  1.0
ArrayHandleReverse.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_ArrayHandleReverse_h
20 #define viskores_cont_ArrayHandleReverse_h
21 
26 
27 namespace viskores
28 {
29 namespace cont
30 {
31 
32 namespace internal
33 {
34 
35 template <typename PortalType>
36 class VISKORES_ALWAYS_EXPORT ArrayPortalReverse
37 {
38  using Writable = viskores::internal::PortalSupportsSets<PortalType>;
39 
40 public:
41  using ValueType = typename PortalType::ValueType;
42 
44  ArrayPortalReverse()
45  : portal()
46  {
47  }
48 
50  ArrayPortalReverse(const PortalType& p)
51  : portal(p)
52  {
53  }
54 
55  template <typename OtherPortal>
56  VISKORES_EXEC_CONT ArrayPortalReverse(const ArrayPortalReverse<OtherPortal>& src)
57  : portal(src.GetPortal())
58  {
59  }
60 
62  viskores::Id GetNumberOfValues() const { return this->portal.GetNumberOfValues(); }
63 
65  ValueType Get(viskores::Id index) const
66  {
67  return this->portal.Get(portal.GetNumberOfValues() - index - 1);
68  }
69 
70  template <typename Writable_ = Writable,
71  typename = typename std::enable_if<Writable_::value>::type>
72  VISKORES_EXEC_CONT void Set(viskores::Id index, const ValueType& value) const
73  {
74  this->portal.Set(portal.GetNumberOfValues() - index - 1, value);
75  }
76 
77 private:
78  PortalType portal;
79 };
80 }
81 
82 template <typename StorageTag>
83 class VISKORES_ALWAYS_EXPORT StorageTagReverse
84 {
85 };
86 
87 namespace internal
88 {
89 
90 template <typename T, typename ST>
91 class Storage<T, StorageTagReverse<ST>>
92 {
93  using SourceStorage = Storage<T, ST>;
94 
95 public:
96  using ArrayHandleType = viskores::cont::ArrayHandle<T, ST>;
97  using ReadPortalType = ArrayPortalReverse<typename ArrayHandleType::ReadPortalType>;
98  using WritePortalType = ArrayPortalReverse<typename ArrayHandleType::WritePortalType>;
99 
100  VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers()
101  {
102  return SourceStorage::CreateBuffers();
103  }
104 
105  VISKORES_CONT static void ResizeBuffers(
106  viskores::Id numValues,
107  const std::vector<viskores::cont::internal::Buffer>& buffers,
108  viskores::CopyFlag preserve,
109  viskores::cont::Token& token)
110  {
111  SourceStorage::ResizeBuffers(numValues, buffers, preserve, token);
112  }
113 
114  VISKORES_CONT static viskores::IdComponent GetNumberOfComponentsFlat(
115  const std::vector<viskores::cont::internal::Buffer>& buffers)
116  {
117  return SourceStorage::GetNumberOfComponentsFlat(buffers);
118  }
119 
120  VISKORES_CONT static viskores::Id GetNumberOfValues(
121  const std::vector<viskores::cont::internal::Buffer>& buffers)
122  {
123  return SourceStorage::GetNumberOfValues(buffers);
124  }
125 
126  VISKORES_CONT static void Fill(const std::vector<viskores::cont::internal::Buffer>& buffers,
127  const T& fillValue,
128  viskores::Id startIndex,
129  viskores::Id endIndex,
130  viskores::cont::Token& token)
131  {
132  viskores::Id numValues = GetNumberOfValues(buffers);
133  SourceStorage::Fill(buffers, fillValue, numValues - endIndex, numValues - startIndex, token);
134  }
135 
136  VISKORES_CONT static ReadPortalType CreateReadPortal(
137  const std::vector<viskores::cont::internal::Buffer>& buffers,
139  viskores::cont::Token& token)
140  {
141  return ReadPortalType(SourceStorage::CreateReadPortal(buffers, device, token));
142  }
143 
144  VISKORES_CONT static WritePortalType CreateWritePortal(
145  const std::vector<viskores::cont::internal::Buffer>& buffers,
147  viskores::cont::Token& token)
148  {
149  return WritePortalType(SourceStorage::CreateWritePortal(buffers, device, token));
150  }
151 }; // class storage
152 
153 } // namespace internal
154 
161 template <typename ArrayHandleType>
163  : public viskores::cont::ArrayHandle<typename ArrayHandleType::ValueType,
164  StorageTagReverse<typename ArrayHandleType::StorageTag>>
165 
166 {
167 public:
171  (viskores::cont::ArrayHandle<typename ArrayHandleType::ValueType,
173 
174  ArrayHandleReverse(const ArrayHandleType& handle)
175  : Superclass(handle.GetBuffers())
176  {
177  }
178 
179  VISKORES_CONT ArrayHandleType GetSourceArray() const
180  {
182  this->GetBuffers());
183  }
184 };
185 
189 template <typename HandleType>
191 {
192  return ArrayHandleReverse<HandleType>(handle);
193 }
194 
195 namespace internal
196 {
197 
198 // Superclass will inherit the ArrayExtractComponentImplInefficient property if
199 // the sub-storage is inefficient (thus making everything inefficient).
200 template <typename StorageTag>
201 struct ArrayExtractComponentImpl<viskores::cont::StorageTagReverse<StorageTag>>
202  : viskores::cont::internal::ArrayExtractComponentImpl<StorageTag>
203 {
204  template <typename T>
205  using StrideArrayType =
207 
208  template <typename T>
209  StrideArrayType<T> operator()(
211  viskores::IdComponent componentIndex,
212  viskores::CopyFlag allowCopy) const
213  {
215  StrideArrayType<T> subArray =
216  ArrayExtractComponentImpl<StorageTag>{}(srcArray.GetSourceArray(), componentIndex, allowCopy);
217  // Reverse the array by starting at the end and striding backward
218  return StrideArrayType<T>(subArray.GetBasicArray(),
219  srcArray.GetNumberOfValues(),
220  -subArray.GetStride(),
221  subArray.GetOffset() +
222  (subArray.GetStride() * (subArray.GetNumberOfValues() - 1)),
223  subArray.GetModulo(),
224  subArray.GetDivisor());
225  }
226 };
227 
228 } // namespace internal
229 
230 }
231 } // namespace viskores::cont
232 
233 //=============================================================================
234 // Specializations of serialization related classes
236 namespace viskores
237 {
238 namespace cont
239 {
240 
241 template <typename AH>
242 struct SerializableTypeString<viskores::cont::ArrayHandleReverse<AH>>
243 {
244  static VISKORES_CONT const std::string& Get()
245  {
246  static std::string name = "AH_Reverse<" + SerializableTypeString<AH>::Get() + ">";
247  return name;
248  }
249 };
250 
251 template <typename T, typename ST>
252 struct SerializableTypeString<viskores::cont::ArrayHandle<T, viskores::cont::StorageTagReverse<ST>>>
253  : SerializableTypeString<viskores::cont::ArrayHandleReverse<viskores::cont::ArrayHandle<T, ST>>>
254 {
255 };
256 }
257 } // viskores::cont
258 
259 namespace mangled_diy_namespace
260 {
261 
262 template <typename AH>
263 struct Serialization<viskores::cont::ArrayHandleReverse<AH>>
264 {
265 private:
268 
269 public:
270  static VISKORES_CONT void save(BinaryBuffer& bb, const Type& obj)
271  {
272  viskoresdiy::save(bb, obj.GetSourceArray());
273  }
274 
275  static VISKORES_CONT void load(BinaryBuffer& bb, BaseType& obj)
276  {
277  AH array;
278  viskoresdiy::load(bb, array);
280  }
281 };
282 
283 template <typename T, typename ST>
284 struct Serialization<viskores::cont::ArrayHandle<T, viskores::cont::StorageTagReverse<ST>>>
285  : Serialization<viskores::cont::ArrayHandleReverse<viskores::cont::ArrayHandle<T, ST>>>
286 {
287 };
288 
289 } // diy
291 
292 #endif // viskores_cont_ArrayHandleReverse_h
viskores::exec::arg::load
T load(const U &u, viskores::Id v)
Definition: FetchTagArrayDirectIn.h:44
ArrayHandle.h
ArrayExtractComponent.h
viskores::cont::ArrayHandleReverse::GetSourceArray
ArrayHandleType GetSourceArray() const
Definition: ArrayHandleReverse.h:179
viskores::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:313
viskores::IdComponent
viskores::Int32 IdComponent
Base type to use to index small lists.
Definition: Types.h:202
VISKORES_EXEC_CONT
#define VISKORES_EXEC_CONT
Definition: ExportMacros.h:60
mangled_diy_namespace
Definition: Particle.h:373
viskores::cont::ArrayHandleStride
An ArrayHandle that accesses a basic array with strides and offsets.
Definition: ArrayHandleStride.h:343
viskores::cont::ArrayHandleReverse
Reverse the order of an array, on demand.
Definition: ArrayHandleReverse.h:162
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
viskores
Groups connected points that have the same field value.
Definition: Atomic.h:27
viskores::cont::make_ArrayHandleReverse
ArrayHandleReverse< HandleType > make_ArrayHandleReverse(const HandleType &handle)
make_ArrayHandleReverse is convenience function to generate an ArrayHandleReverse.
Definition: ArrayHandleReverse.h:190
viskores::cont::StorageTagReverse
Definition: ArrayHandleReverse.h:83
viskores::cont::DeviceAdapterId
An object used to specify a device.
Definition: DeviceAdapterTag.h:66
viskores::cont::ArrayHandleReverse::ArrayHandleReverse
ArrayHandleReverse(const ArrayHandleType &handle)
Definition: ArrayHandleReverse.h:174
VISKORES_ARRAY_HANDLE_SUBCLASS
#define VISKORES_ARRAY_HANDLE_SUBCLASS(classname, fullclasstype, superclass)
Macro to make default methods in ArrayHandle subclasses.
Definition: ArrayHandle.h:256
ErrorBadValue.h
viskores::cont::ArrayHandleReverse::Superclass
typename viskores::cont::detail::GetTypeInParentheses< void(viskores::cont::ArrayHandle< typename ArrayHandleType::ValueType, StorageTagReverse< typename ArrayHandleType::StorageTag > >) >::type Superclass
Definition: ArrayHandleReverse.h:172
viskores::Get
auto Get(const viskores::Tuple< Ts... > &tuple)
Retrieve the object from a viskores::Tuple at the given index.
Definition: Tuple.h:89
ErrorBadType.h
viskores::CopyFlag
CopyFlag
Identifier used to specify whether a function should deep copy data.
Definition: Flags.h:25
viskores::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:43
viskores::cont::ArrayHandle< ArrayHandleType::ValueType, StorageTagReverse< ArrayHandleType::StorageTag > >::GetBuffers
const std::vector< viskores::cont::internal::Buffer > & GetBuffers() const
Returns the internal Buffer structures that hold the data.
Definition: ArrayHandle.h:738