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