VTK  9.6.20260311
vtkStridedArray.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
54
55#ifndef vtkStridedArray_h
56#define vtkStridedArray_h
57
58#include "vtkCommonCoreModule.h" // for export macro
59#include "vtkCompiler.h" // for VTK_USE_EXTERN_TEMPLATE
60#include "vtkImplicitArray.h"
61#include "vtkStridedImplicitBackend.h" // for the array backend
62
63VTK_ABI_NAMESPACE_BEGIN
64template <class ValueTypeT>
65class VTKCOMMONCORE_EXPORT vtkStridedArray
66#ifndef __VTK_WRAP__
67 : public vtkImplicitArray<vtkStridedImplicitBackend<ValueTypeT>, vtkArrayTypes::VTK_STRIDED_ARRAY>
68{
69 using ImplicitArrayType =
71#else // Fake the superclass for the wrappers.
72 : public vtkDataArray
73{
74 using ImplicitArrayType = vtkDataArray;
75#endif
76public:
79#ifndef __VTK_WRAP__
80 using typename Superclass::ArrayTypeTag;
81 using typename Superclass::DataTypeTag;
82 using typename Superclass::ValueType;
83#else
84 using ValueType = ValueTypeT;
85#endif
86
88
89 // This macro expands to the set of method declarations that
90 // make up the interface of vtkImplicitArray, which is ignored
91 // by the wrappers.
92#if defined(__VTK_WRAP__) || defined(__WRAP_GCCXML__)
94#endif
95
100 {
101 return static_cast<vtkStridedArray<ValueType>*>(Superclass::FastDownCast(source));
102 }
103
105
109 const ValueType* buffer, vtkIdType stride, int components, vtkIdType offset);
110 void ConstructBackend(const ValueType* buffer, vtkIdType stride, int components);
111 void ConstructBackend(const ValueType* buffer, vtkIdType stride);
113
117 const ValueType* GetBuffer() const
118 {
119 return const_cast<vtkStridedArray<ValueType>*>(this)->GetBackend()->GetBuffer();
120 }
121
126 {
127 return const_cast<vtkStridedArray<ValueType>*>(this)->GetBackend()->GetStride();
128 }
129
134 {
135 return const_cast<vtkStridedArray<ValueType>*>(this)->GetBackend()->GetOffset();
136 }
137
138protected:
139 vtkStridedArray() = default;
140 ~vtkStridedArray() override = default;
141
142private:
143 vtkStridedArray(const vtkStridedArray&) = delete;
144 void operator=(const vtkStridedArray&) = delete;
145};
146
147// Declare vtkArrayDownCast implementations for STRIDED arrays:
149
150VTK_ABI_NAMESPACE_END
151
152// This macro is used by the subclasses to create dummy
153// declarations for these functions such that the wrapper
154// can see them. The wrappers ignore vtkStridedArray.
155#define vtkCreateStridedWrappedArrayInterface(T) \
156 vtkCreateImplicitWrappedArrayInterface(T); \
157 void ConstructBackend(const T* buffer, vtkIdType stride, int components, vtkIdType offset); \
158 void ConstructBackend(const T* buffer, vtkIdType stride, int components); \
159 void ConstructBackend(const T* buffer, vtkIdType stride); \
160 const T* GetBuffer() const; \
161 vtkIdType GetStride() const; \
162 vtkIdType GetOffset() const;
163
164#endif // vtkStridedArray_h
165
166// This portion must be OUTSIDE the include blockers. This is used to tell
167// libraries other than vtkCommonCore that instantiations of
168// vtkStridedArray can be found externally. This prevents each library
169// from instantiating these on their own.
170#ifdef VTK_STRIDED_ARRAY_INSTANTIATING
171#define VTK_STRIDED_ARRAY_INSTANTIATE(T) \
172 namespace vtkDataArrayPrivate \
173 { \
174 VTK_ABI_NAMESPACE_BEGIN \
175 VTK_INSTANTIATE_VALUERANGE_ARRAYTYPE(vtkStridedArray<T>, double); \
176 VTK_ABI_NAMESPACE_END \
177 } \
178 VTK_ABI_NAMESPACE_BEGIN \
179 template class VTKCOMMONCORE_EXPORT vtkStridedArray<T>; \
180 VTK_ABI_NAMESPACE_END
181// We only provide these specializations for the 64-bit integer types, since
182// other types can reuse the double-precision mechanism in
183// vtkDataArray::GetRange without losing precision.
184#define VTK_STRIDED_ARRAY_INSTANTIATE_VALUERANGE(T) \
185 namespace vtkDataArrayPrivate \
186 { \
187 VTK_ABI_NAMESPACE_BEGIN \
188 VTK_INSTANTIATE_VALUERANGE_ARRAYTYPE(vtkStridedArray<T>, T); \
189 VTK_ABI_NAMESPACE_END \
190 }
191#elif defined(VTK_USE_EXTERN_TEMPLATE)
192#ifndef VTK_STRIDED_ARRAY_EXTERN
193#define VTK_STRIDED_ARRAY_EXTERN
194#ifdef _MSC_VER
195#pragma warning(push)
196// The following is needed when the vtkStridedArray is declared
197// dllexport and is used from another class in vtkCommonCore
198#pragma warning(disable : 4910) // extern and dllexport incompatible
199#endif
200VTK_ABI_NAMESPACE_BEGIN
201vtkExternTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkStridedArray);
202VTK_ABI_NAMESPACE_END
203
204namespace vtkDataArrayPrivate
205{
206VTK_ABI_NAMESPACE_BEGIN
207
208// These are instantiated in vtkGenericDataArrayValueRange${i}.cxx
213// These are instantiated by vtkStridedArrayInstantiate_double.cxx.inc, e.t.c.
227
228VTK_ABI_NAMESPACE_END
229} // namespace vtkDataArrayPrivate
230
231#ifdef _MSC_VER
232#pragma warning(pop)
233#endif
234#endif // VTK_STRIDED_ARRAY_EXTERN
235
236// The following clause is only for MSVC
237#elif defined(_MSC_VER) && !defined(VTK_BUILD_SHARED_LIBS)
238#pragma warning(push)
239
240// C4091: 'extern ' : ignored on left of 'int' when no variable is declared
241#pragma warning(disable : 4091)
242
243// Compiler-specific extension warning.
244#pragma warning(disable : 4231)
245
246// We need to disable warning 4910 and do an extern dllexport
247// anyway. When deriving new arrays from an
248// instantiation of this template the compiler does an explicit
249// instantiation of the base class. From outside the vtkCommon
250// library we block this using an extern dllimport instantiation.
251// For classes inside vtkCommon we should be able to just do an
252// extern instantiation, but VS 2008 complains about missing
253// definitions. We cannot do an extern dllimport inside vtkCommon
254// since the symbols are local to the dll. An extern dllexport
255// seems to be the only way to convince VS 2008 to do the right
256// thing, so we just disable the warning.
257#pragma warning(disable : 4910) // extern and dllexport incompatible
258
259// Use an "extern explicit instantiation" to give the class a DLL
260// interface. This is a compiler-specific extension.
261VTK_ABI_NAMESPACE_BEGIN
262vtkInstantiateTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkStridedArray);
263VTK_ABI_NAMESPACE_END
264
265#pragma warning(pop)
266
267#endif
268
269// VTK-HeaderTest-Exclude: vtkStridedArray.h
Abstract superclass for all arrays.
std::integral_constant< int, VTK_OPAQUE > DataTypeTag
std::integral_constant< int, vtkArrayTypes::VTK_ABSTRACT_ARRAY > ArrayTypeTag
A utility array for wrapping a strided buffer in implicit arrays.
const ValueType * GetBuffer() const
Get the buffer of the strided backend.
void ConstructBackend(const ValueType *buffer, vtkIdType stride, int components, vtkIdType offset)
Set the parameters for the strided backend.
vtkIdType GetStride() const
Get the stride of the strided backend.
~vtkStridedArray() override=default
static vtkStridedArray< ValueType > * FastDownCast(vtkAbstractArray *source)
A faster alternative to SafeDownCast for downcasting vtkAbstractArrays.
vtkStridedArray()=default
static vtkStridedArray * New()
void ConstructBackend(const ValueType *buffer, vtkIdType stride, int components)
Set the parameters for the strided backend.
void ConstructBackend(const ValueType *buffer, vtkIdType stride)
Set the parameters for the strided backend.
vtkIdType GetOffset() const
Get the offset of the strided backend.
vtkImplicitArrayTypeMacro(SelfType, ImplicitArrayType)
vtkStridedArray< ValueTypeT > SelfType
#define vtkArrayDownCast_TemplateFastCastMacro(ArrayT)
Same as vtkArrayDownCast_FastCastMacro, but treats ArrayT as a single-parameter template (the paramet...
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define VTK_DECLARE_VALUERANGE_ARRAYTYPE(ArrayType, ValueType)
#define vtkCreateImplicitWrappedArrayInterface(T)
#define vtkExternTemplateMacro(decl)
A macro to declare extern templates for all numerical types.
Definition vtkType.h:458
int vtkIdType
Definition vtkType.h:363
#define vtkInstantiateTemplateMacro(decl)
A macro to instantiate a template over all numerical types.
Definition vtkType.h:411
@ VTK_STRIDED_ARRAY
Definition vtkType.h:96