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
00068 bool IsDense();
00069 const vtkArrayExtents& GetExtents();
00070 vtkIdType GetNonNullSize();
00071 void GetCoordinatesN(const vtkIdType n, vtkArrayCoordinates& coordinates);
00072 vtkArray* DeepCopy();
00073
00074
00075 const T& GetValue(vtkIdType i);
00076 const T& GetValue(vtkIdType i, vtkIdType j);
00077 const T& GetValue(vtkIdType i, vtkIdType j, vtkIdType k);
00078 const T& GetValue(const vtkArrayCoordinates& coordinates);
00079 const T& GetValueN(const vtkIdType n);
00080 void SetValue(vtkIdType i, const T& value);
00081 void SetValue(vtkIdType i, vtkIdType j, const T& value);
00082 void SetValue(vtkIdType i, vtkIdType j, vtkIdType k, const T& value);
00083 void SetValue(const vtkArrayCoordinates& coordinates, const T& value);
00084 void SetValueN(const vtkIdType n, const T& value);
00085
00086
00087
00089
00092 class MemoryBlock
00093 {
00094 public:
00095 virtual ~MemoryBlock();
00096
00097
00098 virtual T* GetAddress() = 0;
00099 };
00101
00103
00106 class HeapMemoryBlock :
00107 public MemoryBlock
00108 {
00109 public:
00110 HeapMemoryBlock(const vtkArrayExtents& extents);
00111 virtual ~HeapMemoryBlock();
00112 virtual T* GetAddress();
00114
00115 private:
00116 T* Storage;
00117 };
00118
00120
00122 class StaticMemoryBlock :
00123 public MemoryBlock
00124 {
00125 public:
00126 StaticMemoryBlock(T* const storage);
00127 virtual T* GetAddress();
00129
00130 private:
00131 T* Storage;
00132 };
00133
00147 void ExternalStorage(const vtkArrayExtents& extents, MemoryBlock* storage);
00148
00150 void Fill(const T& value);
00151
00154 T& operator[](const vtkArrayCoordinates& coordinates);
00155
00158 const T* GetStorage() const;
00159
00162 T* GetStorage();
00163
00164 protected:
00165 vtkDenseArray();
00166 ~vtkDenseArray();
00167
00168 private:
00169 vtkDenseArray(const vtkDenseArray&);
00170 void operator=(const vtkDenseArray&);
00171
00172 void InternalResize(const vtkArrayExtents& extents);
00173 void InternalSetDimensionLabel(vtkIdType i, const vtkStdString& label);
00174 vtkStdString InternalGetDimensionLabel(vtkIdType i);
00175 inline vtkIdType MapCoordinates(vtkIdType i);
00176 inline vtkIdType MapCoordinates(vtkIdType i, vtkIdType j);
00177 inline vtkIdType MapCoordinates(vtkIdType i, vtkIdType j, vtkIdType k);
00178 inline vtkIdType MapCoordinates(const vtkArrayCoordinates& coordinates);
00179
00180 void Reconfigure(const vtkArrayExtents& extents, MemoryBlock* storage);
00181
00182 typedef vtkDenseArray<T> ThisT;
00183
00185 vtkArrayExtents Extents;
00186
00188 vtkstd::vector<vtkStdString> DimensionLabels;
00189
00191 MemoryBlock* Storage;
00192
00194
00196 T* Begin;
00197 T* End;
00199
00201
00202 vtkstd::vector<vtkIdType> Offsets;
00203
00204
00205 vtkstd::vector<vtkIdType> Strides;
00207 };
00208
00209 #include "vtkDenseArray.txx"
00210
00211 #endif
00212