1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkArray.cxx
5
6 -------------------------------------------------------------------------
7 Copyright 2008 Sandia Corporation.
8 Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 the U.S. Government retains certain rights in this software.
10 -------------------------------------------------------------------------
11
12 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
13 All rights reserved.
14 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
15
16 This software is distributed WITHOUT ANY WARRANTY; without even
17 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
18 PURPOSE. See the above copyright notice for more information.
19
20 =========================================================================*/
21
22 #include "vtkArray.h"
23 #include "vtkDenseArray.h"
24 #include "vtkSparseArray.h"
25 #include "vtkVariant.h"
26
27 #include <algorithm>
28
29 //
30 // Standard functions
31 //
32
33
34 //----------------------------------------------------------------------------
35
36 vtkArray::vtkArray() = default;
37
38 //----------------------------------------------------------------------------
39
40 vtkArray::~vtkArray() = default;
41
42 //----------------------------------------------------------------------------
43
PrintSelf(ostream & os,vtkIndent indent)44 void vtkArray::PrintSelf(ostream &os, vtkIndent indent)
45 {
46 Superclass::PrintSelf(os, indent);
47
48 os << indent << "Name: " << this->Name << endl;
49
50 os << indent << "Dimensions: " << this->GetDimensions() << endl;
51 os << indent << "Extents: " << this->GetExtents() << endl;
52
53 os << indent << "DimensionLabels:";
54 for(DimensionT i = 0; i != this->GetDimensions(); ++i)
55 os << " " << this->GetDimensionLabel(i);
56 os << endl;
57
58 os << indent << "Size: " << this->GetSize() << endl;
59 os << indent << "NonNullSize: " << this->GetNonNullSize() << endl;
60 }
61
CreateArray(int StorageType,int ValueType)62 vtkArray* vtkArray::CreateArray(int StorageType, int ValueType)
63 {
64 switch(StorageType)
65 {
66 case DENSE:
67 {
68 switch(ValueType)
69 {
70 case VTK_CHAR:
71 return vtkDenseArray<char>::New();
72 case VTK_SIGNED_CHAR:
73 return vtkDenseArray<signed char>::New();
74 case VTK_UNSIGNED_CHAR:
75 return vtkDenseArray<unsigned char>::New();
76 case VTK_SHORT:
77 return vtkDenseArray<short>::New();
78 case VTK_UNSIGNED_SHORT:
79 return vtkDenseArray<unsigned short>::New();
80 case VTK_INT:
81 return vtkDenseArray<int>::New();
82 case VTK_UNSIGNED_INT:
83 return vtkDenseArray<unsigned int>::New();
84 case VTK_LONG:
85 return vtkDenseArray<long>::New();
86 case VTK_UNSIGNED_LONG:
87 return vtkDenseArray<unsigned long>::New();
88 case VTK_LONG_LONG:
89 return vtkDenseArray<long long>::New();
90 case VTK_UNSIGNED_LONG_LONG:
91 return vtkDenseArray<unsigned long long>::New();
92 case VTK_FLOAT:
93 return vtkDenseArray<float>::New();
94 case VTK_DOUBLE:
95 return vtkDenseArray<double>::New();
96 case VTK_ID_TYPE:
97 return vtkDenseArray<vtkIdType>::New();
98 case VTK_STRING:
99 return vtkDenseArray<vtkStdString>::New();
100 case VTK_UNICODE_STRING:
101 return vtkDenseArray<vtkUnicodeString>::New();
102 case VTK_VARIANT:
103 return vtkDenseArray<vtkVariant>::New();
104 }
105 vtkGenericWarningMacro(<< "vtkArrary::CreateArray() cannot create array with unknown value type: " << vtkImageScalarTypeNameMacro(ValueType));
106 return nullptr;
107 }
108 case SPARSE:
109 {
110 switch(ValueType)
111 {
112 case VTK_CHAR:
113 return vtkSparseArray<char>::New();
114 case VTK_SIGNED_CHAR:
115 return vtkSparseArray<signed char>::New();
116 case VTK_UNSIGNED_CHAR:
117 return vtkSparseArray<unsigned char>::New();
118 case VTK_SHORT:
119 return vtkSparseArray<short>::New();
120 case VTK_UNSIGNED_SHORT:
121 return vtkSparseArray<unsigned short>::New();
122 case VTK_INT:
123 return vtkSparseArray<int>::New();
124 case VTK_UNSIGNED_INT:
125 return vtkSparseArray<unsigned int>::New();
126 case VTK_LONG:
127 return vtkSparseArray<long>::New();
128 case VTK_UNSIGNED_LONG:
129 return vtkSparseArray<unsigned long>::New();
130 case VTK_LONG_LONG:
131 return vtkSparseArray<long long>::New();
132 case VTK_UNSIGNED_LONG_LONG:
133 return vtkSparseArray<unsigned long long>::New();
134 case VTK_FLOAT:
135 return vtkSparseArray<float>::New();
136 case VTK_DOUBLE:
137 return vtkSparseArray<double>::New();
138 case VTK_ID_TYPE:
139 return vtkSparseArray<vtkIdType>::New();
140 case VTK_STRING:
141 return vtkSparseArray<vtkStdString>::New();
142 case VTK_UNICODE_STRING:
143 return vtkSparseArray<vtkUnicodeString>::New();
144 case VTK_VARIANT:
145 return vtkSparseArray<vtkVariant>::New();
146 }
147 vtkGenericWarningMacro(<< "vtkArrary::CreateArray() cannot create array with unknown value type: " << vtkImageScalarTypeNameMacro(ValueType));
148 return nullptr;
149 }
150 }
151
152 vtkGenericWarningMacro(<< "vtkArrary::CreateArray() cannot create array with unknown storage type: " << StorageType);
153 return nullptr;
154 }
155
Resize(const CoordinateT i)156 void vtkArray::Resize(const CoordinateT i)
157 {
158 this->Resize(vtkArrayExtents(vtkArrayRange(0, i)));
159 }
160
Resize(const vtkArrayRange & i)161 void vtkArray::Resize(const vtkArrayRange& i)
162 {
163 this->Resize(vtkArrayExtents(i));
164 }
165
Resize(const CoordinateT i,const CoordinateT j)166 void vtkArray::Resize(const CoordinateT i, const CoordinateT j)
167 {
168 this->Resize(vtkArrayExtents(vtkArrayRange(0, i), vtkArrayRange(0, j)));
169 }
170
Resize(const vtkArrayRange & i,const vtkArrayRange & j)171 void vtkArray::Resize(const vtkArrayRange& i, const vtkArrayRange& j)
172 {
173 this->Resize(vtkArrayExtents(i, j));
174 }
175
Resize(const CoordinateT i,const CoordinateT j,const CoordinateT k)176 void vtkArray::Resize(const CoordinateT i, const CoordinateT j, const CoordinateT k)
177 {
178 this->Resize(vtkArrayExtents(vtkArrayRange(0, i), vtkArrayRange(0, j), vtkArrayRange(0, k)));
179 }
180
Resize(const vtkArrayRange & i,const vtkArrayRange & j,const vtkArrayRange & k)181 void vtkArray::Resize(const vtkArrayRange& i, const vtkArrayRange& j, const vtkArrayRange& k)
182 {
183 this->Resize(vtkArrayExtents(i, j, k));
184 }
185
Resize(const vtkArrayExtents & extents)186 void vtkArray::Resize(const vtkArrayExtents& extents)
187 {
188 this->InternalResize(extents);
189 }
190
GetExtent(DimensionT dimension)191 const vtkArrayRange vtkArray::GetExtent(DimensionT dimension)
192 {
193 return this->GetExtents()[dimension];
194 }
195
GetDimensions()196 vtkArray::DimensionT vtkArray::GetDimensions()
197 {
198 return this->GetExtents().GetDimensions();
199 }
200
GetSize()201 vtkTypeUInt64 vtkArray::GetSize()
202 {
203 return this->GetExtents().GetSize();
204 }
205
SetName(const vtkStdString & raw_name)206 void vtkArray::SetName(const vtkStdString& raw_name)
207 {
208 // Don't allow newlines in array names ...
209 vtkStdString name(raw_name);
210 name.erase(std::remove(name.begin(), name.end(), '\r'), name.end());
211 name.erase(std::remove(name.begin(), name.end(), '\n'), name.end());
212
213 this->Name = name;
214 }
215
GetName()216 vtkStdString vtkArray::GetName()
217 {
218 return this->Name;
219 }
220
SetDimensionLabel(DimensionT i,const vtkStdString & raw_label)221 void vtkArray::SetDimensionLabel(DimensionT i, const vtkStdString& raw_label)
222 {
223 if(i < 0 || i >= this->GetDimensions())
224 {
225 vtkErrorMacro("Cannot set label for dimension " << i << " of a " << this->GetDimensions() << "-way array");
226 return;
227 }
228
229 // Don't allow newlines in dimension labels ...
230 vtkStdString label(raw_label);
231 label.erase(std::remove(label.begin(), label.end(), '\r'), label.end());
232 label.erase(std::remove(label.begin(), label.end(), '\n'), label.end());
233
234 this->InternalSetDimensionLabel(i, label);
235 }
236
GetDimensionLabel(DimensionT i)237 vtkStdString vtkArray::GetDimensionLabel(DimensionT i)
238 {
239 if(i < 0 || i >= this->GetDimensions())
240 {
241 vtkErrorMacro("Cannot get label for dimension " << i << " of a " << this->GetDimensions() << "-way array");
242 return "";
243 }
244
245 return this->InternalGetDimensionLabel(i);
246 }
247