00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00051 #ifndef __vtkDenseArray_h
00052 #define __vtkDenseArray_h
00053
00054 #include "vtkArrayCoordinates.h"
00055 #include "vtkObjectFactory.h"
00056 #include "vtkTypedArray.h"
00057 #include "vtkTypeTemplate.h"
00058
00059 template<typename T>
00060 class vtkDenseArray :
00061 public vtkTypeTemplate<vtkDenseArray<T>, vtkTypedArray<T> >
00062 {
00063 public:
00064 static vtkDenseArray<T>* New();
00065 void PrintSelf(ostream &os, vtkIndent indent);
00066
00067 typedef typename vtkArray::CoordinateT CoordinateT;
00068 typedef typename vtkArray::DimensionT DimensionT;
00069 typedef typename vtkArray::SizeT SizeT;
00070
00071
00072 bool IsDense();
00073 const vtkArrayExtents& GetExtents();
00074 SizeT GetNonNullSize();
00075 void GetCoordinatesN(const SizeT n, vtkArrayCoordinates& coordinates);
00076 vtkArray* DeepCopy();
00077
00078
00079 const T& GetValue(CoordinateT i);
00080 const T& GetValue(CoordinateT i, CoordinateT j);
00081 const T& GetValue(CoordinateT i, CoordinateT j, CoordinateT k);
00082 const T& GetValue(const vtkArrayCoordinates& coordinates);
00083 const T& GetValueN(const SizeT n);
00084 void SetValue(CoordinateT i, const T& value);
00085 void SetValue(CoordinateT i, CoordinateT j, const T& value);
00086 void SetValue(CoordinateT i, CoordinateT j, CoordinateT k, const T& value);
00087 void SetValue(const vtkArrayCoordinates& coordinates, const T& value);
00088 void SetValueN(const SizeT n, const T& value);
00089
00090
00091
00093
00096 class MemoryBlock
00097 {
00098 public:
00099 virtual ~MemoryBlock();
00100
00101
00102 virtual T* GetAddress() = 0;
00103 };
00105
00107
00110 class HeapMemoryBlock :
00111 public MemoryBlock
00112 {
00113 public:
00114 HeapMemoryBlock(const vtkArrayExtents& extents);
00115 virtual ~HeapMemoryBlock();
00116 virtual T* GetAddress();
00118
00119 private:
00120 T* Storage;
00121 };
00122
00124
00126 class StaticMemoryBlock :
00127 public MemoryBlock
00128 {
00129 public:
00130 StaticMemoryBlock(T* const storage);
00131 virtual T* GetAddress();
00133
00134 private:
00135 T* Storage;
00136 };
00137
00151 void ExternalStorage(const vtkArrayExtents& extents, MemoryBlock* storage);
00152
00154 void Fill(const T& value);
00155
00158 T& operator[](const vtkArrayCoordinates& coordinates);
00159
00162 const T* GetStorage() const;
00163
00166 T* GetStorage();
00167
00168 protected:
00169 vtkDenseArray();
00170 ~vtkDenseArray();
00171
00172 private:
00173 vtkDenseArray(const vtkDenseArray&);
00174 void operator=(const vtkDenseArray&);
00175
00176 void InternalResize(const vtkArrayExtents& extents);
00177 void InternalSetDimensionLabel(DimensionT i, const vtkStdString& label);
00178 vtkStdString InternalGetDimensionLabel(DimensionT i);
00179 inline vtkIdType MapCoordinates(CoordinateT i);
00180 inline vtkIdType MapCoordinates(CoordinateT i, CoordinateT j);
00181 inline vtkIdType MapCoordinates(CoordinateT i, CoordinateT j, CoordinateT k);
00182 inline vtkIdType MapCoordinates(const vtkArrayCoordinates& coordinates);
00183
00184 void Reconfigure(const vtkArrayExtents& extents, MemoryBlock* storage);
00185
00186 typedef vtkDenseArray<T> ThisT;
00187
00189 vtkArrayExtents Extents;
00190
00192 std::vector<vtkStdString> DimensionLabels;
00193
00195 MemoryBlock* Storage;
00196
00198
00200 T* Begin;
00201 T* End;
00203
00205
00206 std::vector<vtkIdType> Offsets;
00207
00208
00209 std::vector<vtkIdType> Strides;
00210 };
00212
00213 #include "vtkDenseArray.txx"
00214
00215 #endif
00216