You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
10 KiB
C
309 lines
10 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkArray.h
|
||
|
|
||
|
-------------------------------------------------------------------------
|
||
|
Copyright 2008 Sandia Corporation.
|
||
|
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||
|
the U.S. Government retains certain rights in this software.
|
||
|
-------------------------------------------------------------------------
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @class vtkArray
|
||
|
* @brief Abstract interface for N-dimensional arrays.
|
||
|
*
|
||
|
*
|
||
|
* vtkArray is the root of a hierarchy of arrays that can be used to
|
||
|
* store data with any number of dimensions. It provides an abstract
|
||
|
* interface for retrieving and setting array attributes that are
|
||
|
* independent of the type of values stored in the array - such as the
|
||
|
* number of dimensions, extents along each dimension, and number of
|
||
|
* values stored in the array.
|
||
|
*
|
||
|
* To get and set array values, the vtkTypedArray template class derives
|
||
|
* from vtkArray and provides type-specific methods for retrieval and
|
||
|
* update.
|
||
|
*
|
||
|
* Two concrete derivatives of vtkTypedArray are provided at the moment:
|
||
|
* vtkDenseArray and vtkSparseArray, which provide dense and sparse
|
||
|
* storage for arbitrary-dimension data, respectively. Toolkit users
|
||
|
* can create their own concrete derivatives that implement alternative
|
||
|
* storage strategies, such as compressed-sparse-row, etc. You could
|
||
|
* also create an array that provided read-only access to 'virtual' data,
|
||
|
* such as an array that returned a Fibonacci sequence, etc.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkTypedArray, vtkDenseArray, vtkSparseArray
|
||
|
*
|
||
|
* @par Thanks:
|
||
|
* Developed by Timothy M. Shead (tshead@sandia.gov) at Sandia National
|
||
|
* Laboratories.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkArray_h
|
||
|
#define vtkArray_h
|
||
|
|
||
|
#include "vtkArrayCoordinates.h"
|
||
|
#include "vtkArrayExtents.h"
|
||
|
#include "vtkCommonCoreModule.h" // For export macro
|
||
|
#include "vtkObject.h"
|
||
|
#include "vtkStdString.h"
|
||
|
#include "vtkVariant.h"
|
||
|
|
||
|
class VTKCOMMONCORE_EXPORT vtkArray : public vtkObject
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkArray, vtkObject);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
typedef vtkArrayExtents::CoordinateT CoordinateT;
|
||
|
typedef vtkArrayExtents::DimensionT DimensionT;
|
||
|
typedef vtkArrayExtents::SizeT SizeT;
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
/// Used with CreateArray() to create dense arrays
|
||
|
DENSE = 0,
|
||
|
/// Used with CreateArray() to create sparse arrays
|
||
|
SPARSE = 1
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Creates a new array where StorageType is one of vtkArray::DENSE
|
||
|
* or vtkArray::SPARSE, and ValueType is one of VTK_CHAR,
|
||
|
* VTK_UNSIGNED_CHAR, VTK_SHORT, VTK_UNSIGNED_SHORT, VTK_INT,
|
||
|
* VTK_UNSIGNED_INT, VTK_LONG, VTK_UNSIGNED_LONG, VTK_DOUBLE,
|
||
|
* VTK_ID_TYPE, or VTK_STRING. The caller is responsible for the
|
||
|
* lifetime of the returned object.
|
||
|
*/
|
||
|
VTK_NEWINSTANCE
|
||
|
static vtkArray* CreateArray(int StorageType, int ValueType);
|
||
|
|
||
|
/**
|
||
|
* Returns true iff the underlying array storage is "dense", i.e. that
|
||
|
* GetSize() and GetNonNullSize() will always return the same value.
|
||
|
* If not, the array is "sparse".
|
||
|
*/
|
||
|
virtual bool IsDense() = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Resizes the array to the given extents (number of dimensions and
|
||
|
* size of each dimension). Note that concrete implementations of
|
||
|
* vtkArray may place constraints on the extents that they will
|
||
|
* store, so you cannot assume that GetExtents() will always return
|
||
|
* the same value passed to Resize().
|
||
|
|
||
|
* The contents of the array are undefined after calling Resize() - you
|
||
|
* should initialize its contents accordingly. In particular,
|
||
|
* dimension-labels will be undefined, dense array values will be
|
||
|
* undefined, and sparse arrays will be empty.
|
||
|
*/
|
||
|
void Resize(const CoordinateT i);
|
||
|
void Resize(const CoordinateT i, const CoordinateT j);
|
||
|
void Resize(const CoordinateT i, const CoordinateT j, const CoordinateT k);
|
||
|
void Resize(const vtkArrayRange& i);
|
||
|
void Resize(const vtkArrayRange& i, const vtkArrayRange& j);
|
||
|
void Resize(const vtkArrayRange& i, const vtkArrayRange& j, const vtkArrayRange& k);
|
||
|
void Resize(const vtkArrayExtents& extents);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Returns the extent (valid coordinate range) along the given
|
||
|
* dimension.
|
||
|
*/
|
||
|
vtkArrayRange GetExtent(DimensionT dimension);
|
||
|
/**
|
||
|
* Returns the extents (the number of dimensions and size along each
|
||
|
* dimension) of the array.
|
||
|
*/
|
||
|
virtual const vtkArrayExtents& GetExtents() = 0;
|
||
|
|
||
|
/**
|
||
|
* Returns the number of dimensions stored in the array. Note that
|
||
|
* this is the same as calling GetExtents().GetDimensions().
|
||
|
*/
|
||
|
DimensionT GetDimensions();
|
||
|
|
||
|
/**
|
||
|
* Returns the number of values stored in the array. Note that this is
|
||
|
* the same as calling GetExtents().GetSize(), and represents the
|
||
|
* maximum number of values that could ever be stored using the current
|
||
|
* extents. This is equal to the number of values stored in a dense
|
||
|
* array, but may be larger than the number of values stored in a
|
||
|
* sparse array.
|
||
|
*/
|
||
|
SizeT GetSize();
|
||
|
|
||
|
/**
|
||
|
* Returns the number of non-null values stored in the array. Note
|
||
|
* that this value will equal GetSize() for dense arrays, and will be
|
||
|
* less-than-or-equal to GetSize() for sparse arrays.
|
||
|
*/
|
||
|
virtual SizeT GetNonNullSize() = 0;
|
||
|
|
||
|
/**
|
||
|
* Sets the array name.
|
||
|
*/
|
||
|
void SetName(const vtkStdString& name);
|
||
|
/**
|
||
|
* Returns the array name.
|
||
|
*/
|
||
|
vtkStdString GetName();
|
||
|
|
||
|
/**
|
||
|
* Sets the label for the i-th array dimension.
|
||
|
*/
|
||
|
void SetDimensionLabel(DimensionT i, const vtkStdString& label);
|
||
|
|
||
|
/**
|
||
|
* Returns the label for the i-th array dimension.
|
||
|
*/
|
||
|
vtkStdString GetDimensionLabel(DimensionT i);
|
||
|
|
||
|
/**
|
||
|
* Returns the coordinates of the n-th value in the array, where n is
|
||
|
* in the range [0, GetNonNullSize()). Note that the order in which
|
||
|
* coordinates are visited is undefined, but is guaranteed to match the
|
||
|
* order in which values are visited using vtkTypedArray::GetValueN()
|
||
|
* and vtkTypedArray::SetValueN().
|
||
|
*/
|
||
|
virtual void GetCoordinatesN(const SizeT n, vtkArrayCoordinates& coordinates) = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Returns the value stored in the array at the given coordinates.
|
||
|
* Note that the number of dimensions in the supplied coordinates must
|
||
|
* match the number of dimensions in the array.
|
||
|
*/
|
||
|
inline vtkVariant GetVariantValue(CoordinateT i);
|
||
|
inline vtkVariant GetVariantValue(CoordinateT i, CoordinateT j);
|
||
|
inline vtkVariant GetVariantValue(CoordinateT i, CoordinateT j, CoordinateT k);
|
||
|
virtual vtkVariant GetVariantValue(const vtkArrayCoordinates& coordinates) = 0;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Returns the n-th value stored in the array, where n is in the
|
||
|
* range [0, GetNonNullSize()). This is useful for efficiently
|
||
|
* visiting every value in the array. Note that the order in which
|
||
|
* values are visited is undefined, but is guaranteed to match the
|
||
|
* order used by vtkArray::GetCoordinatesN().
|
||
|
*/
|
||
|
virtual vtkVariant GetVariantValueN(const SizeT n) = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Overwrites the value stored in the array at the given coordinates.
|
||
|
* Note that the number of dimensions in the supplied coordinates must
|
||
|
* match the number of dimensions in the array.
|
||
|
*/
|
||
|
inline void SetVariantValue(CoordinateT i, const vtkVariant& value);
|
||
|
inline void SetVariantValue(CoordinateT i, CoordinateT j, const vtkVariant& value);
|
||
|
inline void SetVariantValue(CoordinateT i, CoordinateT j, CoordinateT k, const vtkVariant& value);
|
||
|
virtual void SetVariantValue(const vtkArrayCoordinates& coordinates, const vtkVariant& value) = 0;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Overwrites the n-th value stored in the array, where n is in the
|
||
|
* range [0, GetNonNullSize()). This is useful for efficiently
|
||
|
* visiting every value in the array. Note that the order in which
|
||
|
* values are visited is undefined, but is guaranteed to match the
|
||
|
* order used by vtkArray::GetCoordinatesN().
|
||
|
*/
|
||
|
virtual void SetVariantValueN(const SizeT n, const vtkVariant& value) = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Overwrites a value with a value retrieved from another array. Both
|
||
|
* arrays must store the same data types.
|
||
|
*/
|
||
|
virtual void CopyValue(vtkArray* source, const vtkArrayCoordinates& source_coordinates,
|
||
|
const vtkArrayCoordinates& target_coordinates) = 0;
|
||
|
virtual void CopyValue(
|
||
|
vtkArray* source, const SizeT source_index, const vtkArrayCoordinates& target_coordinates) = 0;
|
||
|
virtual void CopyValue(
|
||
|
vtkArray* source, const vtkArrayCoordinates& source_coordinates, const SizeT target_index) = 0;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Returns a new array that is a deep copy of this array.
|
||
|
*/
|
||
|
virtual vtkArray* DeepCopy() = 0;
|
||
|
|
||
|
protected:
|
||
|
vtkArray();
|
||
|
~vtkArray() override;
|
||
|
|
||
|
private:
|
||
|
vtkArray(const vtkArray&) = delete;
|
||
|
void operator=(const vtkArray&) = delete;
|
||
|
|
||
|
/**
|
||
|
* Stores the array name.
|
||
|
*/
|
||
|
vtkStdString Name;
|
||
|
|
||
|
/**
|
||
|
* Implemented in concrete derivatives to update their storage
|
||
|
* when the array is resized.
|
||
|
*/
|
||
|
virtual void InternalResize(const vtkArrayExtents&) = 0;
|
||
|
|
||
|
/**
|
||
|
* Implemented in concrete derivatives to set dimension labels.
|
||
|
*/
|
||
|
virtual void InternalSetDimensionLabel(DimensionT i, const vtkStdString& label) = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Implemented in concrete derivatives to get dimension labels.
|
||
|
*/
|
||
|
virtual vtkStdString InternalGetDimensionLabel(DimensionT i) = 0;
|
||
|
//@}
|
||
|
};
|
||
|
|
||
|
vtkVariant vtkArray::GetVariantValue(CoordinateT i)
|
||
|
{
|
||
|
return this->GetVariantValue(vtkArrayCoordinates(i));
|
||
|
}
|
||
|
|
||
|
vtkVariant vtkArray::GetVariantValue(CoordinateT i, CoordinateT j)
|
||
|
{
|
||
|
return this->GetVariantValue(vtkArrayCoordinates(i, j));
|
||
|
}
|
||
|
|
||
|
vtkVariant vtkArray::GetVariantValue(CoordinateT i, CoordinateT j, CoordinateT k)
|
||
|
{
|
||
|
return this->GetVariantValue(vtkArrayCoordinates(i, j, k));
|
||
|
}
|
||
|
|
||
|
void vtkArray::SetVariantValue(CoordinateT i, const vtkVariant& value)
|
||
|
{
|
||
|
this->SetVariantValue(vtkArrayCoordinates(i), value);
|
||
|
}
|
||
|
|
||
|
void vtkArray::SetVariantValue(CoordinateT i, CoordinateT j, const vtkVariant& value)
|
||
|
{
|
||
|
this->SetVariantValue(vtkArrayCoordinates(i, j), value);
|
||
|
}
|
||
|
|
||
|
void vtkArray::SetVariantValue(CoordinateT i, CoordinateT j, CoordinateT k, const vtkVariant& value)
|
||
|
{
|
||
|
this->SetVariantValue(vtkArrayCoordinates(i, j, k), value);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// VTK-HeaderTest-Exclude: vtkArray.h
|