VTK  9.7.1
TestCellArrayHelpers.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
3 
4 #include "vtkCellArray.h"
5 
6 #include "MockDataArray.h"
7 #include "vtkArrayDispatch.h"
9 #include "vtkCellArrayIterator.h"
10 #include "vtkDataArrayRange.h"
11 #include "vtkIdList.h"
12 #include "vtkIdTypeArray.h"
13 #include "vtkIntArray.h"
14 #include "vtkLogger.h"
15 #include "vtkLongArray.h"
16 #include "vtkLongLongArray.h"
17 #include "vtkNew.h"
18 #include "vtkPolyData.h"
19 #include "vtkSmartPointer.h"
20 #include "vtkTriangle.h"
21 
22 #include <algorithm>
23 #include <initializer_list>
24 #include <iostream>
25 #include <stdexcept>
26 #include <type_traits>
27 
28 namespace
29 {
30 
31 [[noreturn]] void ThrowAssertError(const std::string& msg)
32 {
33  // You can set breakpoints here:
34  throw std::runtime_error(msg);
35 }
36 
37 #define TEST_ASSERT(cond) \
38  do \
39  { \
40  std::cout << "=> Check " << #cond << " ... "; \
41  if (!(cond)) \
42  { \
43  std::cout << "false" << std::endl; \
44  ThrowAssertError(vtkQuoteMacro(__FILE__) ":" vtkQuoteMacro( \
45  __LINE__) ": test assertion failed: (" #cond ")"); \
46  } \
47  std::cout << "true" << std::endl; \
48  } while (false)
49 
50 template <vtkCellArray::StorageTypes StorageType, typename... ArrayTypes>
51 struct CellArrayFactory
52 {
53  static vtkSmartPointer<vtkCellArray> New() { return nullptr; }
54 };
55 
56 template <>
57 struct CellArrayFactory<vtkCellArray::StorageTypes::Int32>
58 {
60  {
61  auto cellArray = vtkSmartPointer<vtkCellArray>::New();
62  cellArray->Use32BitStorage();
63  TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int32);
64  return cellArray;
65  }
66 };
67 
68 template <>
69 struct CellArrayFactory<vtkCellArray::StorageTypes::Int64>
70 {
72  {
73  auto cellArray = vtkSmartPointer<vtkCellArray>::New();
74  cellArray->Use64BitStorage();
75  TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int64);
76  return cellArray;
77  }
78 };
79 
80 template <>
81 struct CellArrayFactory<vtkCellArray::StorageTypes::FixedSizeInt32>
82 {
84  {
85  auto cellArray = vtkSmartPointer<vtkCellArray>::New();
86  cellArray->UseFixedSize32BitStorage(3);
87  TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::FixedSizeInt32);
88  return cellArray;
89  }
90 };
91 
92 template <>
93 struct CellArrayFactory<vtkCellArray::StorageTypes::FixedSizeInt64>
94 {
96  {
97  auto cellArray = vtkSmartPointer<vtkCellArray>::New();
98  cellArray->UseFixedSize64BitStorage(3);
99  TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::FixedSizeInt64);
100  return cellArray;
101  }
102 };
103 
104 struct DummyWorker
105 {
106  template <typename OffsetsT, typename ConnectivityT>
107  [[maybe_unused]] void operator()(OffsetsT*, ConnectivityT*)
108  {
109  void();
110  }
111 };
112 
113 template <typename ConnectivityArrayT, typename OffsetsArrayT>
114 struct CellArrayFactory<vtkCellArray::StorageTypes::Generic, ConnectivityArrayT, OffsetsArrayT>
115 {
116  static vtkSmartPointer<vtkCellArray> New()
117  {
118  using OffsetsValueT = typename OffsetsArrayT::ValueType;
119  auto cellArray = vtkSmartPointer<vtkCellArray>::New();
120  // By passing array types which are NOT in vtkCellArray::InputArrayList,
121  // vtkCellArray can be put into the "Generic" storage mode.
122  vtkNew<ConnectivityArrayT> placeholderConn;
123  vtkNew<OffsetsArrayT> placeholderOffsets;
124  if (auto countingOffsets = vtkAffineArray<OffsetsValueT>::FastDownCast(placeholderOffsets))
125  {
126  countingOffsets->ConstructBackend(3, 0);
127  }
128  // initialize the offsets array with one element i.e, number of elements in the connectivity.
129  placeholderOffsets->InsertNextValue(0);
130  cellArray->SetData(placeholderOffsets, placeholderConn);
131  DummyWorker worker;
132  using Dispatcher =
135  // Ensure that the arrays are indeed not in the InputArrayList
136  if (!Dispatcher::Execute(
137  cellArray->GetOffsetsArray(), cellArray->GetConnectivityArray(), worker))
138  {
139  TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Generic);
140  }
141  else
142  {
143  TEST_ASSERT(cellArray->GetStorageType() != vtkCellArray::StorageTypes::Generic);
144  }
145  return cellArray;
146  }
147 };
148 
149 template <bool FixedSize>
150 vtkSmartPointer<vtkIdList> GetCellIds(vtkIdType cellId, bool reverse = false, vtkIdType offset = 0)
151 {
152  auto ids = vtkSmartPointer<vtkIdList>::New();
153  if (FixedSize)
154  {
155  if (cellId == 0)
156  {
157  ids->InsertNextId(0);
158  ids->InsertNextId(1);
159  ids->InsertNextId(2);
160  }
161  else if (cellId == 1)
162  {
163  ids->InsertNextId(3);
164  ids->InsertNextId(4);
165  ids->InsertNextId(5);
166  }
167  else if (cellId == 2)
168  {
169  ids->InsertNextId(7);
170  ids->InsertNextId(8);
171  ids->InsertNextId(9);
172  }
173  else
174  {
175  throw std::runtime_error("Invalid cellId");
176  }
177  }
178  else
179  {
180  if (cellId == 0)
181  {
182  ids->InsertNextId(0);
183  ids->InsertNextId(1);
184  ids->InsertNextId(2);
185  ids->InsertNextId(3);
186  ids->InsertNextId(4);
187  }
188  else if (cellId == 1)
189  {
190  ids->InsertNextId(3);
191  ids->InsertNextId(4);
192  ids->InsertNextId(5);
193  }
194  else if (cellId == 2)
195  {
196  ids->InsertNextId(7);
197  ids->InsertNextId(8);
198  ids->InsertNextId(9);
199  ids->InsertNextId(4);
200  ids->InsertNextId(2);
201  ids->InsertNextId(1);
202  }
203  else
204  {
205  throw std::runtime_error("Invalid cellId");
206  }
207  }
208  if (reverse)
209  {
210  std::reverse(ids->begin(), ids->end());
211  }
212  if (offset > 0)
213  {
214  for (vtkIdType i = 0; i < ids->GetNumberOfIds(); ++i)
215  {
216  ids->SetId(i, ids->GetId(i) + offset);
217  }
218  }
219  return ids;
220 }
221 
222 template <bool FixedSize>
223 void FillCellArray(vtkCellArray* cellArray, bool reverse = false)
224 {
225  cellArray->InsertNextCell(GetCellIds<FixedSize>(0, reverse));
226  cellArray->InsertNextCell(GetCellIds<FixedSize>(1, reverse));
227  cellArray->InsertNextCell(GetCellIds<FixedSize>(2, reverse));
228 }
229 
230 template <bool FixedSize>
231 bool ValidateCell(vtkIdType cellId, vtkIdType npts, const vtkIdType* pts, bool reverse = false,
232  vtkIdType offset = 0)
233 {
234  auto ids = GetCellIds<FixedSize>(cellId, reverse, offset);
235  TEST_ASSERT(npts == ids->GetNumberOfIds());
236  bool equal = true;
237  for (vtkIdType i = 0; i < npts; ++i)
238  {
239  equal &= pts[i] == ids->GetId(i);
240  }
241  return equal;
242 }
243 
244 template <bool FixedSize>
245 void ValidateCellArray(vtkCellArray* cellArray, bool reverse = false, vtkIdType offset = 0)
246 {
247  vtkIdType npts;
248  const vtkIdType* pts;
249  auto it = vtk::TakeSmartPointer(cellArray->NewIterator());
250  it->GoToFirstCell();
251 
252  for (int i = 0; i < 3; ++i)
253  {
254  TEST_ASSERT(!it->IsDoneWithTraversal());
255  it->GetCurrentCell(npts, pts);
256  TEST_ASSERT(ValidateCell<FixedSize>(i, npts, pts, reverse, offset));
257  it->GoToNextCell();
258  }
259 
260  TEST_ASSERT(it->IsDoneWithTraversal());
261 }
262 
263 void TestAllocate(vtkSmartPointer<vtkCellArray> cellArray)
264 {
265  vtkLogScopeFunction(INFO);
266 
267  cellArray->Initialize();
268  cellArray->AllocateEstimate(100, 4);
269  TEST_ASSERT(cellArray->GetOffsetsArray()->GetCapacity() == 101);
270  TEST_ASSERT(cellArray->GetConnectivityArray()->GetCapacity() == 400);
271 
272  cellArray->Initialize();
273  cellArray->AllocateExact(100, 256);
274  TEST_ASSERT(cellArray->GetOffsetsArray()->GetCapacity() == 101);
275  TEST_ASSERT(cellArray->GetConnectivityArray()->GetCapacity() == 256);
276 }
277 
278 void TestResize(vtkSmartPointer<vtkCellArray> cellArray)
279 {
280  vtkLogScopeFunction(INFO);
281 
282  cellArray->Initialize();
283  cellArray->ResizeExact(128, 256);
284  TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 129);
285  TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 256);
286 }
287 
288 void TestInitialize(vtkSmartPointer<vtkCellArray> cellArray)
289 {
290  vtkLogScopeFunction(INFO);
291 
292  cellArray->Initialize();
293  cellArray->ResizeExact(128, 256);
294  cellArray->Initialize();
295  TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 1);
296  TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 0);
297  TEST_ASSERT(cellArray->GetOffsetsArray()->GetCapacity() == 1);
298  TEST_ASSERT(cellArray->GetConnectivityArray()->GetCapacity() == 0);
299 }
300 
301 template <bool FixedSize>
302 void TestSqueeze(vtkSmartPointer<vtkCellArray> cellArray)
303 {
304  vtkLogScopeFunction(INFO);
305 
306  cellArray->Initialize();
307  cellArray->AllocateExact(128, 256);
308 
309  FillCellArray<FixedSize>(cellArray);
310 
311  cellArray->Squeeze();
312 
313  TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 4);
314  TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == (FixedSize ? 9 : 14));
315  TEST_ASSERT(cellArray->GetOffsetsArray()->GetCapacity() == 4);
316  TEST_ASSERT(cellArray->GetConnectivityArray()->GetCapacity() == (FixedSize ? 9 : 14));
317 
318  TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
319  ValidateCellArray<FixedSize>(cellArray);
320 }
321 
322 void TestReset(vtkSmartPointer<vtkCellArray> cellArray)
323 {
324  vtkLogScopeFunction(INFO);
325 
326  cellArray->Initialize();
327  cellArray->ResizeExact(128, 256);
328  cellArray->Reset();
329  TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 1);
330  TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 0);
331  TEST_ASSERT(cellArray->GetOffsetsArray()->GetCapacity() >= 129);
332  TEST_ASSERT(cellArray->GetConnectivityArray()->GetCapacity() >= 256);
333 }
334 
335 template <bool FixedSize>
336 void TestIsValidOffsets(vtkSmartPointer<vtkCellArray> cellArray)
337 {
338  vtkLogScopeFunction(INFO);
339 
340  TEST_ASSERT(cellArray->IsValid());
341  FillCellArray<FixedSize>(cellArray);
342  TEST_ASSERT(cellArray->IsValid());
343 
344  cellArray->GetOffsetsArray()->Reset();
345  TEST_ASSERT(!cellArray->IsValid());
346  // This should reuse the old buffer:
347  cellArray->GetOffsetsArray()->SetNumberOfValues(4);
348  TEST_ASSERT(cellArray->IsValid());
349 
350  cellArray->GetOffsetsArray()->SetComponent(1, 0, 5);
351  cellArray->GetOffsetsArray()->SetComponent(2, 0, 3);
352  TEST_ASSERT(!cellArray->IsValid());
353  cellArray->GetOffsetsArray()->SetComponent(1, 0, 3);
354  cellArray->GetOffsetsArray()->SetComponent(2, 0, 5);
355  TEST_ASSERT(cellArray->IsValid());
356 }
357 
358 template <bool FixedSize>
359 void TestIsValidConnectivity(vtkSmartPointer<vtkCellArray> cellArray)
360 {
361  vtkLogScopeFunction(INFO);
362 
363  TEST_ASSERT(cellArray->IsValid());
364  FillCellArray<FixedSize>(cellArray);
365  TEST_ASSERT(cellArray->IsValid());
366 
367  cellArray->GetConnectivityArray()->SetNumberOfValues(5);
368  TEST_ASSERT(!cellArray->IsValid());
369  cellArray->GetConnectivityArray()->SetNumberOfValues(4);
370  TEST_ASSERT(!cellArray->IsValid());
371  cellArray->GetConnectivityArray()->SetNumberOfValues(FixedSize ? 9 : 14);
372  TEST_ASSERT(cellArray->IsValid());
373 }
374 
375 template <bool FixedSize>
376 void TestGetNumberOfCells(vtkSmartPointer<vtkCellArray> cellArray)
377 {
378  vtkLogScopeFunction(INFO);
379 
380  TEST_ASSERT(cellArray->GetNumberOfCells() == 0);
381 
382  cellArray->Initialize();
383 
384  TEST_ASSERT(cellArray->GetNumberOfCells() == 0);
385 
386  FillCellArray<FixedSize>(cellArray);
387 
388  TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
389 
390  cellArray->Initialize();
391 
392  TEST_ASSERT(cellArray->GetNumberOfCells() == 0);
393 }
394 
395 template <bool FixedSize>
396 void TestGetNumberOfOffsets(vtkSmartPointer<vtkCellArray> cellArray)
397 {
398  vtkLogScopeFunction(INFO);
399 
400  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
401 
402  cellArray->Initialize();
403 
404  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
405 
406  FillCellArray<FixedSize>(cellArray);
407 
408  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 4);
409 
410  cellArray->Initialize();
411 
412  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
413 }
414 
415 template <bool FixedSize>
416 void TestGetNumberOfConnectivityIds(vtkSmartPointer<vtkCellArray> cellArray)
417 {
418  vtkLogScopeFunction(INFO);
419 
420  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
421 
422  cellArray->Initialize();
423 
424  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
425 
426  FillCellArray<FixedSize>(cellArray);
427 
428  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == (FixedSize ? 9 : 14));
429 
430  cellArray->Initialize();
431 
432  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
433 }
434 
435 template <bool FixedSize>
436 void TestNewIterator(vtkSmartPointer<vtkCellArray> cellArray)
437 {
438  vtkLogScopeFunction(INFO);
439 
440  {
441  auto iter = vtk::TakeSmartPointer(cellArray->NewIterator());
442  TEST_ASSERT(iter->IsDoneWithTraversal());
443  iter->GoToFirstCell();
444  TEST_ASSERT(iter->IsDoneWithTraversal());
445  }
446 
447  cellArray->Initialize();
448 
449  {
450  auto iter = vtk::TakeSmartPointer(cellArray->NewIterator());
451  TEST_ASSERT(iter->IsDoneWithTraversal());
452  iter->GoToFirstCell();
453  TEST_ASSERT(iter->IsDoneWithTraversal());
454  }
455 
456  FillCellArray<FixedSize>(cellArray);
457 
458  ValidateCellArray<FixedSize>(cellArray);
459 
460  cellArray->Initialize();
461 
462  {
463  auto iter = vtk::TakeSmartPointer(cellArray->NewIterator());
464  TEST_ASSERT(iter->IsDoneWithTraversal());
465  iter->GoToFirstCell();
466  TEST_ASSERT(iter->IsDoneWithTraversal());
467  }
468 }
469 
470 template <typename OffsetsArrayType, typename ConnectivityArrayType>
471 void TestSetDataImpl(vtkSmartPointer<vtkCellArray> cellArray)
472 {
473  vtkLogScopeFunction(INFO);
474  using OffsetsValueType = typename OffsetsArrayType::ValueType;
475  using ConnectivityValueType = typename ConnectivityArrayType::ValueType;
476  constexpr bool FixedSize = std::is_base_of_v<vtkAffineArray<OffsetsValueType>, OffsetsArrayType>;
478  test->DeepCopy(cellArray); // copy config settings
479 
480  vtkNew<OffsetsArrayType> offsets;
481  if (auto countingOffsets = vtkAffineArray<OffsetsValueType>::SafeDownCast(offsets))
482  {
483  countingOffsets->ConstructBackend(GetCellIds<FixedSize>(0)->GetNumberOfIds(), 0);
484  }
486  offsets->InsertNextValue(0);
487  for (vtkIdType i = 0; i < 3; ++i)
488  {
489  auto ids = GetCellIds<FixedSize>(i);
490  offsets->InsertNextValue(offsets->GetValue(i) + ids->GetNumberOfIds());
491  for (vtkIdType j = 0; j < ids->GetNumberOfIds(); ++j)
492  {
493  conn->InsertNextValue(ids->GetId(j));
494  }
495  }
496  auto offsetsMTtime = offsets->GetMTime();
497  auto connMTtime = conn->GetMTime();
498  test->SetData(offsets, conn);
499 
500  // checkNoCopy and MTime
501  TEST_ASSERT(test->GetOffsetsArray() == offsets && offsets->GetMTime() == offsetsMTtime);
502  TEST_ASSERT(test->GetConnectivityArray() == conn && conn->GetMTime() == connMTtime);
503 
504  if constexpr (std::is_base_of_v<vtkAOSDataArrayTemplate<OffsetsValueType>, OffsetsArrayType> &&
505  std::is_base_of_v<vtkAOSDataArrayTemplate<ConnectivityValueType>, ConnectivityArrayType> &&
506  std::is_same_v<OffsetsValueType, ConnectivityValueType>)
507  {
508  if constexpr (std::is_same_v<OffsetsValueType, vtkTypeInt32>)
509  {
510  TEST_ASSERT(!test->IsStorage64Bit());
511  TEST_ASSERT(test->IsStorage32Bit());
514  TEST_ASSERT(!test->IsStorageGeneric());
515  }
516  else if constexpr (std::is_same_v<OffsetsValueType, vtkTypeInt64>)
517  {
518  TEST_ASSERT(test->IsStorage64Bit());
519  TEST_ASSERT(!test->IsStorage32Bit());
522  TEST_ASSERT(!test->IsStorageGeneric());
523  }
524  else
525  {
526  TEST_ASSERT(!test->IsStorage64Bit());
527  TEST_ASSERT(!test->IsStorage32Bit());
530  TEST_ASSERT(test->IsStorageGeneric());
531  }
532  }
533  else if constexpr (std::is_base_of_v<vtkAffineArray<OffsetsValueType>, OffsetsArrayType> &&
534  std::is_base_of_v<vtkAOSDataArrayTemplate<ConnectivityValueType>, ConnectivityArrayType> &&
535  std::is_same_v<OffsetsValueType, ConnectivityValueType>)
536  {
537  if constexpr (std::is_same_v<OffsetsValueType, vtkTypeInt32>)
538  {
539  TEST_ASSERT(!test->IsStorage64Bit());
540  TEST_ASSERT(!test->IsStorage32Bit());
543  TEST_ASSERT(!test->IsStorageGeneric());
544  }
545  else if constexpr (std::is_same_v<OffsetsValueType, vtkTypeInt64>)
546  {
547  TEST_ASSERT(!test->IsStorage64Bit());
548  TEST_ASSERT(!test->IsStorage32Bit());
551  TEST_ASSERT(!test->IsStorageGeneric());
552  }
553  else
554  {
555  TEST_ASSERT(!test->IsStorage64Bit());
556  TEST_ASSERT(!test->IsStorage32Bit());
559  TEST_ASSERT(test->IsStorageGeneric());
560  }
561  }
562  else
563  {
564  TEST_ASSERT(!test->IsStorage64Bit());
565  TEST_ASSERT(!test->IsStorage32Bit());
568  TEST_ASSERT(test->IsStorageGeneric());
569  }
570 
571  TEST_ASSERT(test->GetNumberOfCells() == 3);
572  TEST_ASSERT(test->GetNumberOfConnectivityIds() == (FixedSize ? 9 : 14));
573  TEST_ASSERT(test->GetNumberOfOffsets() == 4);
574  {
575  ValidateCellArray<FixedSize>(test);
576  }
577 }
578 
579 void TestSetData(vtkSmartPointer<vtkCellArray> cellArray)
580 {
581  vtkLogScopeFunction(INFO);
582 
583  TestSetDataImpl<vtkCellArray::AOSArray32, vtkCellArray::AOSArray32>(cellArray);
584  TestSetDataImpl<vtkCellArray::AOSArray64, vtkCellArray::AOSArray64>(cellArray);
585  TestSetDataImpl<vtkIdTypeArray, vtkIdTypeArray>(cellArray);
586  TestSetDataImpl<vtkCellArray::AffineArray32, vtkCellArray::AOSArray32>(cellArray);
587  TestSetDataImpl<vtkCellArray::AffineArray64, vtkCellArray::AOSArray64>(cellArray);
588  TestSetDataImpl<vtkAffineArray<vtkIdType>, vtkIdTypeArray>(cellArray);
589  TestSetDataImpl<vtkTypeInt32Array, vtkTypeInt32Array>(cellArray);
590  TestSetDataImpl<vtkTypeInt64Array, vtkTypeInt64Array>(cellArray);
591  TestSetDataImpl<vtkIntArray, vtkIntArray>(cellArray);
592  TestSetDataImpl<vtkLongArray, vtkLongArray>(cellArray);
593  TestSetDataImpl<vtkLongLongArray, vtkLongLongArray>(cellArray);
594  TestSetDataImpl<vtkAffineArray<vtkTypeInt32>, vtkTypeInt32Array>(cellArray);
595  TestSetDataImpl<vtkAffineArray<vtkTypeInt64>, vtkTypeInt64Array>(cellArray);
596  TestSetDataImpl<vtkAffineArray<int>, vtkIntArray>(cellArray);
597  TestSetDataImpl<vtkAffineArray<long>, vtkLongArray>(cellArray);
598  TestSetDataImpl<vtkAffineArray<long long>, vtkLongLongArray>(cellArray);
599 
600  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeUInt8>>(cellArray);
601  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeUInt16>>(cellArray);
602  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeUInt32>>(cellArray);
603  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeUInt64>>(cellArray);
604  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeUInt8>>(cellArray);
605  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeUInt16>>(cellArray);
606  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeUInt32>>(cellArray);
607  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeUInt64>>(cellArray);
608  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeUInt8>>(cellArray);
609  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeUInt16>>(cellArray);
610  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeUInt32>>(cellArray);
611  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeUInt64>>(cellArray);
612  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeUInt8>>(cellArray);
613  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeUInt16>>(cellArray);
614  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeUInt32>>(cellArray);
615  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeUInt64>>(cellArray);
616 
617  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeUInt8>>(cellArray);
618  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeUInt16>>(cellArray);
619  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeUInt32>>(cellArray);
620  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeUInt64>>(cellArray);
621  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeUInt8>>(cellArray);
622  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeUInt16>>(cellArray);
623  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeUInt32>>(cellArray);
624  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeUInt64>>(cellArray);
625  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeUInt8>>(cellArray);
626  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeUInt16>>(cellArray);
627  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeUInt32>>(cellArray);
628  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeUInt64>>(cellArray);
629 
630  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeInt16>>(cellArray);
631  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeInt32>>(cellArray);
632  TestSetDataImpl<MockDataArray<vtkTypeInt16>, MockDataArray<vtkTypeInt64>>(cellArray);
633  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeInt16>>(cellArray);
634  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeInt32>>(cellArray);
635  TestSetDataImpl<MockDataArray<vtkTypeInt32>, MockDataArray<vtkTypeInt64>>(cellArray);
636  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeInt16>>(cellArray);
637  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeInt32>>(cellArray);
638  TestSetDataImpl<MockDataArray<vtkTypeInt64>, MockDataArray<vtkTypeInt64>>(cellArray);
639 
640  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeInt16>>(cellArray);
641  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeInt32>>(cellArray);
642  TestSetDataImpl<MockDataArray<vtkTypeUInt8>, MockDataArray<vtkTypeInt64>>(cellArray);
643  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeInt16>>(cellArray);
644  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeInt32>>(cellArray);
645  TestSetDataImpl<MockDataArray<vtkTypeUInt16>, MockDataArray<vtkTypeInt64>>(cellArray);
646  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeInt16>>(cellArray);
647  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeInt32>>(cellArray);
648  TestSetDataImpl<MockDataArray<vtkTypeUInt32>, MockDataArray<vtkTypeInt64>>(cellArray);
649  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeInt16>>(cellArray);
650  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeInt32>>(cellArray);
651  TestSetDataImpl<MockDataArray<vtkTypeUInt64>, MockDataArray<vtkTypeInt64>>(cellArray);
652 }
653 
654 struct TestIsStorage64BitImpl : public vtkCellArray::DispatchUtilities
655 {
656  template <class OffsetsT, class ConnectivityT>
657  void operator()(OffsetsT*, ConnectivityT*, bool expect64Bit) const
658  {
659  using ValueType = GetAPIType<OffsetsT>;
660 
661  constexpr bool is64Bit = sizeof(ValueType) == 8 &&
662  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, OffsetsT> &&
663  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, ConnectivityT>;
664 
665  TEST_ASSERT(is64Bit == expect64Bit);
666  }
667 };
668 
669 void TestIsStorage64Bit(vtkSmartPointer<vtkCellArray> cellArray)
670 {
671  vtkLogScopeFunction(INFO);
672 
673  cellArray->Dispatch(TestIsStorage64BitImpl{}, cellArray->IsStorage64Bit());
674 }
675 
676 struct TestIsStorage32BitImpl : public vtkCellArray::DispatchUtilities
677 {
678  template <class OffsetsT, class ConnectivityT>
679  void operator()(OffsetsT*, ConnectivityT*, bool expect32Bit) const
680  {
681  using ValueType = GetAPIType<OffsetsT>;
682 
683  constexpr bool is32Bit = sizeof(ValueType) == 4 &&
684  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, OffsetsT> &&
685  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, ConnectivityT>;
686 
687  TEST_ASSERT(is32Bit == expect32Bit);
688  }
689 };
690 
691 void TestIsStorage32Bit(vtkSmartPointer<vtkCellArray> cellArray)
692 {
693  vtkLogScopeFunction(INFO);
694 
695  cellArray->Dispatch(TestIsStorage32BitImpl{}, cellArray->IsStorage32Bit());
696 }
697 
698 struct TestIsStorageFixedSize64BitImpl : public vtkCellArray::DispatchUtilities
699 {
700  template <class OffsetsT, class ConnectivityT>
701  void operator()(OffsetsT*, ConnectivityT*, bool expectFixedSize64Bit) const
702  {
703  using ValueType = GetAPIType<OffsetsT>;
704 
705  constexpr bool isFixedSize64Bit = sizeof(ValueType) == 8 &&
706  std::is_base_of_v<vtkAffineArray<ValueType>, OffsetsT> &&
707  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, ConnectivityT>;
708 
709  TEST_ASSERT(isFixedSize64Bit == expectFixedSize64Bit);
710  }
711 };
712 
713 void TestIsStorageFixedSize32Bit(vtkSmartPointer<vtkCellArray> cellArray)
714 {
715  vtkLogScopeFunction(INFO);
716 
717  cellArray->Dispatch(TestIsStorageFixedSize64BitImpl{}, cellArray->IsStorageFixedSize64Bit());
718 }
719 
720 struct TestIsStorageFixedSize32BitImpl : public vtkCellArray::DispatchUtilities
721 {
722  template <class OffsetsT, class ConnectivityT>
723  void operator()(OffsetsT*, ConnectivityT*, bool expectFixedSize32Bit) const
724  {
725  using ValueType = GetAPIType<OffsetsT>;
726 
727  constexpr bool isFixedSize32Bit = sizeof(ValueType) == 4 &&
728  std::is_base_of_v<vtkAffineArray<ValueType>, OffsetsT> &&
729  std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, ConnectivityT>;
730 
731  TEST_ASSERT(isFixedSize32Bit == expectFixedSize32Bit);
732  }
733 };
734 
735 void TestIsStorageFixedSize64Bit(vtkSmartPointer<vtkCellArray> cellArray)
736 {
737  vtkLogScopeFunction(INFO);
738 
739  cellArray->Dispatch(TestIsStorageFixedSize32BitImpl{}, cellArray->IsStorageFixedSize32Bit());
740 }
741 
742 struct TestIsStorageGenericImpl : public vtkCellArray::DispatchUtilities
743 {
744  template <class OffsetsT, class ConnectivityT>
745  void operator()(OffsetsT*, ConnectivityT*, bool expectGeneric) const
746  {
747  using ValueType = GetAPIType<OffsetsT>;
748 
749  constexpr bool isGeneric = !std::is_base_of_v<vtkAffineArray<ValueType>, OffsetsT> &&
750  !std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, OffsetsT> &&
751  !std::is_base_of_v<vtkAOSDataArrayTemplate<ValueType>, ConnectivityT> &&
752  std::is_base_of_v<vtkDataArray, OffsetsT> && std::is_base_of_v<vtkDataArray, ConnectivityT>;
753 
754  TEST_ASSERT(isGeneric == expectGeneric);
755  }
756 };
757 
758 void TestIsStorageGeneric(vtkSmartPointer<vtkCellArray> cellArray)
759 {
760  vtkLogScopeFunction(INFO);
761 
762  cellArray->Dispatch(TestIsStorageGenericImpl{}, cellArray->IsStorageGeneric());
763 }
764 
765 void TestUse32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
766 {
767  vtkLogScopeFunction(INFO);
768 
769  // Add some data to make sure that switching storage re-initializes data:
770  FillCellArray<true>(cellArray);
771  cellArray->Use32BitStorage();
772 
773  TEST_ASSERT(cellArray->IsStorage32Bit());
774  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
775  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
776 }
777 
778 void TestUse64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
779 {
780  vtkLogScopeFunction(INFO);
781 
782  // Add some data to make sure that switching storage re-initializes data:
783  FillCellArray<true>(cellArray);
784  cellArray->Use64BitStorage();
785 
786  TEST_ASSERT(cellArray->IsStorage64Bit());
787  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
788  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
789 }
790 
791 void TestUseDefaultStorage(vtkSmartPointer<vtkCellArray> cellArray)
792 {
793  vtkLogScopeFunction(INFO);
794 
795  // Add some data to make sure that switching storage re-initializes data:
796  FillCellArray<true>(cellArray);
797  cellArray->UseDefaultStorage();
798 
799  TEST_ASSERT(cellArray->IsStorage64Bit() == (sizeof(vtkIdType) == 8));
800  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
801  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
802 }
803 
804 void TestUseFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
805 {
806  vtkLogScopeFunction(INFO);
807 
808  // Add some data to make sure that switching storage re-initializes data:
809  FillCellArray<true>(cellArray);
810  cellArray->UseFixedSize32BitStorage(3);
811 
812  TEST_ASSERT(cellArray->IsStorageFixedSize32Bit());
813  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
814  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
815 }
816 
817 void TestUseFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
818 {
819  vtkLogScopeFunction(INFO);
820 
821  // Add some data to make sure that switching storage re-initializes data:
822  FillCellArray<true>(cellArray);
823  cellArray->UseFixedSize64BitStorage(3);
824 
825  TEST_ASSERT(cellArray->IsStorageFixedSize64Bit());
826  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
827  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
828 }
829 
830 void TestUseFixedSizeDefaultStorage(vtkSmartPointer<vtkCellArray> cellArray)
831 {
832  vtkLogScopeFunction(INFO);
833 
834  // Add some data to make sure that switching storage re-initializes data:
835  FillCellArray<true>(cellArray);
836  cellArray->UseFixedSizeDefaultStorage(3);
837 
838  TEST_ASSERT(cellArray->IsStorageFixedSize64Bit() == (sizeof(vtkIdType) == 8));
839  TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1);
840  TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0);
841 }
842 
843 void TestCanConvertTo32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
844 {
845  vtkLogScopeFunction(INFO);
846 
848 
849  if (cellArray->IsStorage64Bit())
850  {
851  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
853 
854 #ifdef VTK_USE_64BIT_IDS
855  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
856  TEST_ASSERT(!cellArray->CanConvertTo32BitStorage());
857 #endif // VTK_USE_64BIT_IDS
858  }
859  else if (cellArray->IsStorage32Bit())
860  {
861  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
863  }
864  else if (cellArray->IsStorageFixedSize64Bit())
865  {
866  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
868 
869 #ifdef VTK_USE_64BIT_IDS
870  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
871  TEST_ASSERT(!cellArray->CanConvertTo32BitStorage());
872 #endif // VTK_USE_64BIT_IDS
873  }
874  else
875  {
876  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
878  }
879 }
880 
881 void TestCanConvertTo64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
882 {
883  vtkLogScopeFunction(INFO);
884 
886 
887  if (cellArray->IsStorage64Bit())
888  {
889  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
891 
892 #ifdef VTK_USE_64BIT_IDS
893  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
895  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
897 #endif // VTK_USE_64BIT_IDS
898  }
899  else if (cellArray->IsStorage32Bit())
900  {
901  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
903  }
904  else if (cellArray->IsStorageFixedSize64Bit())
905  {
906  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
908 
909 #ifdef VTK_USE_64BIT_IDS
910  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
912  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
914 #endif // VTK_USE_64BIT_IDS
915  }
916  else
917  {
918  cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX });
920  }
921 }
922 
923 void TestCanConvertToFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
924 {
925  vtkLogScopeFunction(INFO);
926 
928 
929  if (cellArray->IsStorage64Bit())
930  {
931  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
933 
934 #ifdef VTK_USE_64BIT_IDS
935  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
937 #endif // VTK_USE_64BIT_IDS
938  }
939  else if (cellArray->IsStorage32Bit())
940  {
941  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
943  }
944  else if (cellArray->IsStorageFixedSize64Bit())
945  {
946  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
948 
949 #ifdef VTK_USE_64BIT_IDS
950  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
952 #endif // VTK_USE_64BIT_IDS
953  }
954  else
955  {
956  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
958  }
959 }
960 
961 void TestCanConvertToFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
962 {
963  vtkLogScopeFunction(INFO);
964 
966 
967  if (cellArray->IsStorage64Bit())
968  {
969  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
971 
972 #ifdef VTK_USE_64BIT_IDS
973  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
975  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
977 #endif // VTK_USE_64BIT_IDS
978  }
979  else if (cellArray->IsStorage32Bit())
980  {
981  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
983  }
984  else if (cellArray->IsStorageFixedSize64Bit())
985  {
986  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
988 
989 #ifdef VTK_USE_64BIT_IDS
990  cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
992  cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
994 #endif // VTK_USE_64BIT_IDS
995  }
996  else
997  {
998  cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX });
1000  }
1001 }
1002 
1003 template <bool FixedSize>
1004 void TestConvertTo32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1005 {
1006  vtkLogScopeFunction(INFO);
1007 
1008  FillCellArray<FixedSize>(cellArray);
1009 
1010  TEST_ASSERT(cellArray->ConvertTo32BitStorage());
1011  TEST_ASSERT(cellArray->IsStorage32Bit());
1012 
1013  // Ensure that data is still good:
1014  ValidateCellArray<FixedSize>(cellArray);
1015 }
1016 
1017 template <bool FixedSize>
1018 void TestConvertTo64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1019 {
1020  vtkLogScopeFunction(INFO);
1021 
1022  FillCellArray<FixedSize>(cellArray);
1023 
1024  TEST_ASSERT(cellArray->ConvertTo64BitStorage());
1025  TEST_ASSERT(cellArray->IsStorage64Bit());
1026 
1027  // Ensure that data is still good:
1028  ValidateCellArray<FixedSize>(cellArray);
1029 }
1030 
1031 void TestConvertToFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1032 {
1033  vtkLogScopeFunction(INFO);
1034 
1035  FillCellArray<true>(cellArray);
1036 
1038  TEST_ASSERT(cellArray->IsStorageFixedSize32Bit());
1039 
1040  // Ensure that data is still good:
1041  ValidateCellArray<true>(cellArray);
1042 }
1043 
1044 void TestConvertToFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1045 {
1046  vtkLogScopeFunction(INFO);
1047 
1048  FillCellArray<true>(cellArray);
1049 
1051  TEST_ASSERT(cellArray->IsStorageFixedSize64Bit());
1052 
1053  // Ensure that data is still good:
1054  ValidateCellArray<true>(cellArray);
1055 }
1056 
1057 void TestGetOffsetsArray(vtkSmartPointer<vtkCellArray> cellArray)
1058 {
1059  vtkLogScopeFunction(INFO);
1060 
1061  switch (cellArray->GetStorageType())
1062  {
1063  case vtkCellArray::Int64:
1064  TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAOSArray64());
1065  break;
1066  case vtkCellArray::Int32:
1067  TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAOSArray32());
1068  break;
1070  TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAffineArray64());
1071  break;
1073  TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAffineArray32());
1074  break;
1075  case vtkCellArray::Generic:
1076  default:
1077  TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsArray());
1078  break;
1079  }
1080 }
1081 
1082 void TestGetConnectivityArray(vtkSmartPointer<vtkCellArray> cellArray)
1083 {
1084  vtkLogScopeFunction(INFO);
1085 
1086  switch (cellArray->GetStorageType())
1087  {
1088  case vtkCellArray::Int64:
1089  TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray64());
1090  break;
1091  case vtkCellArray::Int32:
1092  TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray32());
1093  break;
1095  TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray64());
1096  break;
1098  TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray32());
1099  break;
1100  case vtkCellArray::Generic:
1101  default:
1102  TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityArray());
1103  break;
1104  }
1105 }
1106 
1107 template <bool FixedSize>
1108 void TestIsHomogeneous(vtkSmartPointer<vtkCellArray> cellArray)
1109 {
1110  vtkLogScopeFunction(INFO);
1111 
1112  TEST_ASSERT(cellArray->IsHomogeneous() == 0);
1113  cellArray->Initialize();
1114  TEST_ASSERT(cellArray->IsHomogeneous() == 0);
1115 
1116  FillCellArray<true>(cellArray);
1117  TEST_ASSERT(cellArray->IsHomogeneous() == 3);
1118 
1119  FillCellArray<true>(cellArray);
1120  TEST_ASSERT(cellArray->IsHomogeneous() == 3);
1121 
1122  if (!FixedSize)
1123  {
1124  cellArray->InsertNextCell({ 5, 6 });
1125  TEST_ASSERT(cellArray->IsHomogeneous() == -1);
1126  }
1127 
1128  cellArray->Initialize();
1129  TEST_ASSERT(cellArray->IsHomogeneous() == 0);
1130 }
1131 
1132 template <bool FixedSize>
1133 void TestTraversalSizePointer(vtkSmartPointer<vtkCellArray> cellArray)
1134 {
1135  vtkLogScopeFunction(INFO);
1136 
1137  FillCellArray<FixedSize>(cellArray);
1138 
1139  vtkIdType npts;
1140  const vtkIdType* pts;
1141 
1142  cellArray->InitTraversal();
1143  TEST_ASSERT(cellArray->GetTraversalCellId() == 0);
1144  TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0);
1145  TEST_ASSERT(ValidateCell<FixedSize>(0, npts, pts));
1146  TEST_ASSERT(cellArray->GetTraversalCellId() == 1);
1147  TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0);
1148  TEST_ASSERT(ValidateCell<FixedSize>(1, npts, pts));
1149  TEST_ASSERT(cellArray->GetTraversalCellId() == 2);
1150  TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0);
1151  TEST_ASSERT(ValidateCell<FixedSize>(2, npts, pts));
1152 
1153  cellArray->SetTraversalCellId(1);
1154  TEST_ASSERT(cellArray->GetTraversalCellId() == 1);
1155  TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0);
1156  TEST_ASSERT(ValidateCell<FixedSize>(1, npts, pts));
1157  TEST_ASSERT(cellArray->GetTraversalCellId() == 2);
1158  TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0);
1159  TEST_ASSERT(ValidateCell<FixedSize>(2, npts, pts));
1160 
1161  TEST_ASSERT(cellArray->GetNextCell(npts, pts) == 0);
1162 }
1163 
1164 template <bool FixedSize>
1165 void TestTraversalIdList(vtkSmartPointer<vtkCellArray> cellArray)
1166 {
1167  vtkLogScopeFunction(INFO);
1168 
1169  FillCellArray<FixedSize>(cellArray);
1170 
1171  vtkNew<vtkIdList> ids;
1172  cellArray->InitTraversal();
1173  TEST_ASSERT(cellArray->GetNextCell(ids) != 0);
1174  TEST_ASSERT(ValidateCell<FixedSize>(0, ids->GetNumberOfIds(), ids->GetPointer(0)));
1175  TEST_ASSERT(cellArray->GetNextCell(ids) != 0);
1176  TEST_ASSERT(ValidateCell<FixedSize>(1, ids->GetNumberOfIds(), ids->GetPointer(0)));
1177  TEST_ASSERT(cellArray->GetNextCell(ids) != 0);
1178  TEST_ASSERT(ValidateCell<FixedSize>(2, ids->GetNumberOfIds(), ids->GetPointer(0)));
1179 
1180  TEST_ASSERT(cellArray->GetNextCell(ids) == 0);
1181 }
1182 
1183 template <bool FixedSize>
1184 void TestGetCellAtId(vtkSmartPointer<vtkCellArray> cellArray)
1185 {
1186  vtkLogScopeFunction(INFO);
1187 
1188  FillCellArray<FixedSize>(cellArray);
1189 
1190  auto validate = [&](const vtkIdType cellId)
1191  {
1192  vtkIdType npts;
1193  const vtkIdType* pts;
1194  cellArray->GetCellAtId(cellId, npts, pts);
1195  TEST_ASSERT(ValidateCell<FixedSize>(cellId, npts, pts));
1196 
1197  vtkNew<vtkIdList> ids;
1198  cellArray->GetCellAtId(cellId, ids);
1199  TEST_ASSERT(ValidateCell<FixedSize>(cellId, ids->GetNumberOfIds(), ids->GetPointer(0)));
1200  };
1201 
1202  validate(2);
1203  validate(0);
1204  validate(1);
1205 }
1206 
1207 template <bool FixedSize>
1208 void TestGetCellSize(vtkSmartPointer<vtkCellArray> cellArray)
1209 {
1210  vtkLogScopeFunction(INFO);
1211 
1212  FillCellArray<FixedSize>(cellArray);
1213 
1214  TEST_ASSERT(cellArray->GetCellSize(1) == GetCellIds<FixedSize>(1)->GetNumberOfIds());
1215  TEST_ASSERT(cellArray->GetCellSize(0) == GetCellIds<FixedSize>(0)->GetNumberOfIds());
1216  TEST_ASSERT(cellArray->GetCellSize(2) == GetCellIds<FixedSize>(2)->GetNumberOfIds());
1217 }
1218 
1219 template <bool FixedSize>
1220 void TestInsertNextCell(vtkSmartPointer<vtkCellArray> cellArray)
1221 {
1222  vtkLogScopeFunction(INFO);
1223 
1224  TEST_ASSERT(cellArray->GetNumberOfCells() == 0);
1225 
1226  auto ids0 = GetCellIds<FixedSize>(0);
1227  TEST_ASSERT(cellArray->InsertNextCell(ids0) == 0);
1228  TEST_ASSERT(cellArray->GetNumberOfCells() == 1);
1229 
1230  TEST_ASSERT(cellArray->InsertNextCell({ 3, 4, 5 }) == 1); // same as GetCellIds<FixedSize>(1)
1231  TEST_ASSERT(cellArray->GetNumberOfCells() == 2);
1232 
1233  auto ids2 = GetCellIds<FixedSize>(2);
1234  TEST_ASSERT(cellArray->InsertNextCell(ids2->GetNumberOfIds(), ids2->GetPointer(0)) == 2);
1235  TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
1236 
1237  vtkNew<vtkTriangle> triangle;
1238  auto ids3 = triangle->GetPointIds();
1239  ids3->SetId(0, 4);
1240  ids3->SetId(1, 2);
1241  ids3->SetId(2, 1);
1242  TEST_ASSERT(cellArray->InsertNextCell(triangle) == 3);
1243  TEST_ASSERT(cellArray->GetNumberOfCells() == 4);
1244 
1245  vtkIdType npts;
1246  const vtkIdType* pts;
1247 
1248  cellArray->GetCellAtId(0, npts, pts);
1249  TEST_ASSERT(ValidateCell<FixedSize>(0, npts, pts));
1250  cellArray->GetCellAtId(1, npts, pts);
1251  TEST_ASSERT(ValidateCell<FixedSize>(1, npts, pts));
1252  cellArray->GetCellAtId(2, npts, pts);
1253  TEST_ASSERT(ValidateCell<FixedSize>(2, npts, pts));
1254  cellArray->GetCellAtId(3, npts, pts);
1255  TEST_ASSERT(npts == 3);
1256  TEST_ASSERT(pts[0] == 4);
1257  TEST_ASSERT(pts[1] == 2);
1258  TEST_ASSERT(pts[2] == 1);
1259 }
1260 
1261 template <bool FixedSize>
1262 void TestIncrementalCellInsertion(vtkSmartPointer<vtkCellArray> cellArray)
1263 {
1264  vtkLogScopeFunction(INFO);
1265 
1266  auto ids0 = GetCellIds<FixedSize>(0);
1267  TEST_ASSERT(cellArray->InsertNextCell(ids0->GetNumberOfIds()) == 0);
1268  for (vtkIdType i = 0; i < ids0->GetNumberOfIds(); ++i)
1269  {
1270  cellArray->InsertCellPoint(ids0->GetId(i));
1271  }
1272  auto ids1 = GetCellIds<FixedSize>(1);
1273  TEST_ASSERT(cellArray->InsertNextCell(ids1->GetNumberOfIds()) == 1);
1274  for (vtkIdType i = 0; i < ids1->GetNumberOfIds(); ++i)
1275  {
1276  cellArray->InsertCellPoint(ids1->GetId(i));
1277  }
1278  auto ids2 = GetCellIds<FixedSize>(2);
1279  TEST_ASSERT(cellArray->InsertNextCell(3) == 2); // 3 for Fixed Size, 6 for variable
1280  cellArray->InsertCellPoint(ids2->GetId(0));
1281  cellArray->UpdateCellCount(ids2->GetNumberOfIds()); // changing count to 6 for variable size
1282  for (vtkIdType i = 1; i < ids2->GetNumberOfIds(); ++i)
1283  {
1284  cellArray->InsertCellPoint(ids2->GetId(i));
1285  }
1286 
1287  ValidateCellArray<FixedSize>(cellArray);
1288 }
1289 
1290 template <bool FixedSize>
1291 void TestReverseCellAtId(vtkSmartPointer<vtkCellArray> cellArray)
1292 {
1293  vtkLogScopeFunction(INFO);
1294 
1295  FillCellArray<FixedSize>(cellArray);
1296 
1297  auto validate = [&](const vtkIdType cellId, bool reverse)
1298  {
1299  vtkIdType npts;
1300  const vtkIdType* pts;
1301  cellArray->GetCellAtId(cellId, npts, pts);
1302  TEST_ASSERT(ValidateCell<FixedSize>(cellId, npts, pts, reverse));
1303  };
1304 
1305  validate(0, false);
1306  validate(1, false);
1307  validate(2, false);
1308 
1309  cellArray->ReverseCellAtId(2);
1310 
1311  validate(0, false);
1312  validate(1, false);
1313  validate(2, true);
1314 
1315  cellArray->ReverseCellAtId(0);
1316 
1317  validate(0, true);
1318  validate(1, false);
1319  validate(2, true);
1320 }
1321 
1322 template <bool FixedSize>
1323 void TestReplaceCellAtId(vtkSmartPointer<vtkCellArray> cellArray)
1324 {
1325  vtkLogScopeFunction(INFO);
1326 
1327  FillCellArray<FixedSize>(cellArray);
1328 
1329  auto validate = [&](const vtkIdType cellId, bool reverse)
1330  {
1331  vtkIdType npts;
1332  const vtkIdType* pts;
1333  cellArray->GetCellAtId(cellId, npts, pts);
1334  TEST_ASSERT(ValidateCell<FixedSize>(cellId, npts, pts, reverse));
1335  };
1336 
1337  validate(0, false);
1338  validate(1, false);
1339  validate(2, false);
1340 
1341  {
1342  auto id2Reverse = GetCellIds<FixedSize>(2, true);
1343  cellArray->ReplaceCellAtId(2, id2Reverse);
1344  }
1345 
1346  validate(0, false);
1347  validate(1, false);
1348  validate(2, true);
1349 
1350  {
1351  auto id0 = GetCellIds<FixedSize>(0, true);
1352  cellArray->ReplaceCellAtId(0, id0->GetNumberOfIds(), id0->GetPointer(0));
1353  }
1354 
1355  validate(0, true);
1356  validate(1, false);
1357  validate(2, true);
1358 
1359  cellArray->ReplaceCellAtId(1, { 5, 4, 3 }); // reverse 3, 4, 5
1360 
1361  validate(0, true);
1362  validate(1, true);
1363  validate(2, true);
1364 }
1365 
1366 template <bool FixedSize>
1367 void TestGetMaxCellSize(vtkSmartPointer<vtkCellArray> cellArray)
1368 {
1369  vtkLogScopeFunction(INFO);
1370 
1371  auto ids0 = GetCellIds<FixedSize>(0);
1372  auto ids1 = GetCellIds<FixedSize>(1);
1373  auto ids2 = GetCellIds<FixedSize>(2);
1374 
1375  TEST_ASSERT(cellArray->GetMaxCellSize() == 0);
1376  cellArray->InsertNextCell(ids0);
1377  TEST_ASSERT(cellArray->GetMaxCellSize() == ids0->GetNumberOfIds());
1378  cellArray->InsertNextCell(ids1);
1379  TEST_ASSERT(cellArray->GetMaxCellSize() == ids0->GetNumberOfIds());
1380  cellArray->InsertNextCell(ids2);
1381  TEST_ASSERT(cellArray->GetMaxCellSize() == ids2->GetNumberOfIds());
1382 }
1383 
1384 template <bool FixedSize>
1385 void TestDeepCopy(vtkSmartPointer<vtkCellArray> cellArray)
1386 {
1387  vtkLogScopeFunction(INFO);
1388 
1389  FillCellArray<FixedSize>(cellArray);
1390 
1391  vtkNew<vtkCellArray> other;
1392  other->DeepCopy(cellArray);
1393 
1394  TEST_ASSERT(cellArray->GetStorageType() == other->GetStorageType());
1395  ValidateCellArray<FixedSize>(other);
1396 
1397  cellArray->InsertNextCell({ 0, 1, 2 });
1398  TEST_ASSERT(cellArray->GetNumberOfCells() == other->GetNumberOfCells() + 1);
1399 }
1400 
1401 template <bool FixedSize>
1402 void TestShallowCopy(vtkSmartPointer<vtkCellArray> cellArray)
1403 {
1404  vtkLogScopeFunction(INFO);
1405 
1406  FillCellArray<FixedSize>(cellArray);
1407 
1408  vtkNew<vtkCellArray> other;
1409  other->ShallowCopy(cellArray);
1410 
1411  TEST_ASSERT(cellArray->GetStorageType() == other->GetStorageType());
1412  ValidateCellArray<FixedSize>(other);
1413 
1414  cellArray->InsertNextCell({ 0, 1, 2 });
1415  TEST_ASSERT(cellArray->GetNumberOfCells() == other->GetNumberOfCells());
1416  TEST_ASSERT(cellArray->GetOffsetsArray() == other->GetOffsetsArray());
1417  TEST_ASSERT(cellArray->GetConnectivityArray() == other->GetConnectivityArray());
1418 }
1419 
1420 template <bool FixedSize>
1421 void TestAppendImpl(vtkSmartPointer<vtkCellArray> first, vtkSmartPointer<vtkCellArray> second)
1422 {
1423  FillCellArray<FixedSize>(first, false);
1424 
1425  FillCellArray<FixedSize>(second, true);
1426 
1427  vtkNew<vtkCellArray> concat;
1428  concat->DeepCopy(first);
1429  concat->Append(second, 10); // add 10 to all point ids from second
1430  TEST_ASSERT(concat->GetNumberOfCells() == 6);
1431 
1432  auto validate = [&](const vtkIdType cellId, bool reverse, vtkIdType offset)
1433  {
1434  vtkIdType npts;
1435  const vtkIdType* pts;
1436  concat->GetCellAtId(cellId, npts, pts);
1437  vtkIdType cellIdQuery = cellId < 3 ? cellId : cellId % 3;
1438  TEST_ASSERT(ValidateCell<FixedSize>(cellIdQuery, npts, pts, reverse, offset));
1439  };
1440 
1441  validate(0, false, 0);
1442  validate(1, false, 0);
1443  validate(2, false, 0);
1444 
1445  validate(3, true, 10);
1446  validate(4, true, 10);
1447  validate(5, true, 10);
1448 }
1449 
1450 template <bool FixedSize>
1451 void TestAppend32(vtkSmartPointer<vtkCellArray> cellArray)
1452 {
1453  vtkLogScopeFunction(INFO);
1454  TestAppendImpl<FixedSize>(cellArray, CellArrayFactory<vtkCellArray::Int32>::New());
1455 }
1456 
1457 template <bool FixedSize>
1458 void TestAppend64(vtkSmartPointer<vtkCellArray> cellArray)
1459 {
1460  vtkLogScopeFunction(INFO);
1461  TestAppendImpl<FixedSize>(cellArray, CellArrayFactory<vtkCellArray::Int64>::New());
1462 }
1463 
1464 template <bool FixedSize>
1465 void TestLegacyFormatImportExportAppend(vtkSmartPointer<vtkCellArray> cellArray)
1466 {
1467  vtkLogScopeFunction(INFO);
1468 
1469  FillCellArray<FixedSize>(cellArray);
1470 
1471  vtkNew<vtkIdTypeArray> legacy;
1472  cellArray->ExportLegacyFormat(legacy);
1473 
1474  {
1475  std::vector<vtkIdType> expected;
1476  for (int i = 0; i < 3; ++i)
1477  {
1478  auto ids = GetCellIds<FixedSize>(i);
1479  expected.push_back(ids->GetNumberOfIds());
1480  for (vtkIdType j = 0; j < ids->GetNumberOfIds(); ++j)
1481  {
1482  expected.push_back(ids->GetId(j));
1483  }
1484  }
1485  auto legacyRange = vtk::DataArrayValueRange<1>(legacy);
1486  TEST_ASSERT(std::equal(expected.cbegin(), expected.cend(), legacyRange.cbegin()));
1487  }
1488 
1489  cellArray->Initialize();
1490  cellArray->ImportLegacyFormat(legacy);
1491 
1492  auto validate = [&](const vtkIdType cellId, vtkIdType offset = 0)
1493  {
1494  vtkIdType npts;
1495  const vtkIdType* pts;
1496  cellArray->GetCellAtId(cellId, npts, pts);
1497  vtkIdType cellIdQuery = cellId < 3 ? cellId : cellId % 3;
1498  TEST_ASSERT(ValidateCell<FixedSize>(cellIdQuery, npts, pts, false, offset));
1499  };
1500 
1501  TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
1502  validate(0);
1503  validate(1);
1504  validate(2);
1505 
1506  // check that the next import doesn't have this
1507  cellArray->InsertNextCell(GetCellIds<FixedSize>(0, true));
1508  cellArray->ImportLegacyFormat(legacy->GetPointer(0), legacy->GetNumberOfTuples());
1509 
1510  TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
1511  validate(0);
1512  validate(1);
1513  validate(2);
1514 
1515  cellArray->AppendLegacyFormat(legacy, 10);
1516 
1517  TEST_ASSERT(cellArray->GetNumberOfCells() == 6);
1518  validate(0, 0);
1519  validate(1, 0);
1520  validate(2, 0);
1521  validate(3, 10);
1522  validate(4, 10);
1523  validate(5, 10);
1524 
1525  cellArray->AppendLegacyFormat(legacy->GetPointer(0), legacy->GetNumberOfTuples(), 20);
1526 
1527  TEST_ASSERT(cellArray->GetNumberOfCells() == 9);
1528  validate(0, 0);
1529  validate(1, 0);
1530  validate(2, 0);
1531  validate(3, 10);
1532  validate(4, 10);
1533  validate(5, 10);
1534  validate(6, 20);
1535  validate(7, 20);
1536  validate(8, 20);
1537 }
1538 
1539 const char* StorageTypeToString(vtkCellArray::StorageTypes storageType)
1540 {
1541  switch (storageType)
1542  {
1543  case vtkCellArray::Int64:
1544  return "Int64";
1545  case vtkCellArray::Int32:
1546  return "Int32";
1548  return "FixedSizeInt64";
1550  return "FixedSizeInt32";
1551  case vtkCellArray::Generic:
1552  default:
1553  return "Generic";
1554  }
1555 }
1556 
1557 template <vtkCellArray::StorageTypes StorageType, bool FixedSize, typename... ArrayTypes>
1558 void RunTests()
1559 {
1560  vtkLogScopeF(INFO, "Testing %s storage.", StorageTypeToString(StorageType));
1561 
1562  TestAllocate(CellArrayFactory<StorageType, ArrayTypes...>::New());
1563  TestResize(CellArrayFactory<StorageType, ArrayTypes...>::New());
1564  TestInitialize(CellArrayFactory<StorageType, ArrayTypes...>::New());
1565  TestReset(CellArrayFactory<StorageType, ArrayTypes...>::New());
1566  if (!FixedSize)
1567  {
1568  // Squeeze is a no-op for fixed size storage.
1569  TestSqueeze<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1570  // Offsets can't be set manually for fixed size storage.
1571  TestIsValidOffsets<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1572  }
1573  TestIsValidConnectivity<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1574 
1575  TestGetNumberOfCells<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1576  TestGetNumberOfOffsets<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1577  TestGetNumberOfConnectivityIds<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1578 
1579  TestNewIterator<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1580  TestSetData(CellArrayFactory<StorageType, ArrayTypes...>::New());
1581 
1582  TestIsStorage64Bit(CellArrayFactory<StorageType, ArrayTypes...>::New());
1583  TestIsStorage32Bit(CellArrayFactory<StorageType, ArrayTypes...>::New());
1584  TestIsStorageFixedSize64Bit(CellArrayFactory<StorageType, ArrayTypes...>::New());
1585  TestIsStorageFixedSize32Bit(CellArrayFactory<StorageType, ArrayTypes...>::New());
1586  TestIsStorageGeneric(CellArrayFactory<StorageType, ArrayTypes...>::New());
1587 
1588  TestUse32BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1589  TestUse64BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1590  TestUseDefaultStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1591  TestUseFixedSize32BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1592  TestUseFixedSize64BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1593  TestUseFixedSizeDefaultStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1594 
1595  TestCanConvertTo32BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1596  TestCanConvertTo64BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1597  TestCanConvertToFixedSize32BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1598  TestCanConvertToFixedSize64BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1599 
1600  TestConvertTo32BitStorage<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1601  TestConvertTo64BitStorage<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1602  TestConvertToFixedSize32BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1603  TestConvertToFixedSize64BitStorage(CellArrayFactory<StorageType, ArrayTypes...>::New());
1604 
1605  TestGetOffsetsArray(CellArrayFactory<StorageType, ArrayTypes...>::New());
1606  TestGetConnectivityArray(CellArrayFactory<StorageType, ArrayTypes...>::New());
1607 
1608  TestIsHomogeneous<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1609 
1610  TestTraversalSizePointer<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1611  TestTraversalIdList<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1612 
1613  TestGetCellAtId<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1614  TestGetCellSize<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1615 
1616  TestInsertNextCell<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1617  TestIncrementalCellInsertion<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1618 
1619  TestReverseCellAtId<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1620  TestReplaceCellAtId<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1621 
1622  TestGetMaxCellSize<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1623 
1624  TestDeepCopy<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1625  TestShallowCopy<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1626 
1627  TestAppend32<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1628  TestAppend64<FixedSize>(CellArrayFactory<StorageType, ArrayTypes...>::New());
1629 
1630  TestLegacyFormatImportExportAppend<FixedSize>(
1631  CellArrayFactory<StorageType, ArrayTypes...>::New());
1632 }
1633 
1634 } // end anon namespace
void UseFixedSize32BitStorage(vtkIdType cellSize)
Initialize internal data structures to use 32- or 64-bit storage.
AffineArray32 * GetOffsetsAffineArray32() const
Return the array used to store cell offsets.
Definition: vtkCellArray.h:594
void SetTraversalCellId(vtkIdType cellId)
Get/Set the current cellId for traversal.
vtkIdType GetNumberOfOffsets() const override
Get the number of elements in the offsets array.
Definition: vtkCellArray.h:328
This class is used in some unit tests to setup a mock data array which derives vtkGenericDataArray.
Definition: MockDataArray.h:13
AOSArray64 * GetConnectivityAOSArray64() const
Return the array used to store the point ids that define the cells' connectivity. ...
Definition: vtkCellArray.h:625
void GetCellAtId(vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints, vtkIdList *ptIds) override
Return the point ids for the cell at cellId.
int GetMaxCellSize() override
Returns the size of the largest cell.
vtkIdType GetNumberOfCells() const override
Get the number of cells in the array.
Definition: vtkCellArray.h:322
void DeepCopy(vtkAbstractCellArray *ca) override
Perform a deep copy (no reference counting) of the given cell array.
void UseFixedSizeDefaultStorage(vtkIdType cellSize)
Initialize internal data structures to use 32- or 64-bit storage.
vtkIdType GetTraversalCellId()
Get/Set the current cellId for traversal.
vtkDataArray * GetOffsetsArray() const
Return the array used to store cell offsets.
Definition: vtkCellArray.h:581
void InsertCellPoint(vtkIdType id)
Used in conjunction with InsertNextCell(npts) to add another point to the list of cells...
dynamic, self-adjusting array of long long
void UseFixedSize64BitStorage(vtkIdType cellSize)
Initialize internal data structures to use 32- or 64-bit storage.
dynamic, self-adjusting array of long
Definition: vtkLongArray.h:33
void ShallowCopy(vtkAbstractCellArray *ca) override
Shallow copy ca into this cell array.
AOSArray32 * GetOffsetsAOSArray32() const
Return the array used to store cell offsets.
Definition: vtkCellArray.h:587
Dispatch two arrays, restricting the valid code paths to use only array types specified in the ArrayL...
vtkTypeList::Create< vtkAOSDataArrayTemplate< vtkTypeInt32 >, vtkAOSDataArrayTemplate< vtkTypeInt64 >> ConnectivityArrays
List of possible array types used for storage of vtkCellArray.
AOSArray32 * GetConnectivityAOSArray32() const
Return the array used to store the point ids that define the cells' connectivity. ...
Definition: vtkCellArray.h:616
vtkIdType GetCellSize(vtkIdType cellId) const override
Return the size of the cell at cellId.
void InitTraversal()
dynamic, self-adjusting array of vtkIdType
int vtkIdType
Definition: vtkType.h:363
void ExportLegacyFormat(vtkIdTypeArray *data)
Fill data with the old-style vtkCellArray data layout, e.g.
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
bool CanConvertToFixedSize32BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage. ...
StorageTypes GetStorageType() const noexcept
Definition: vtkCellArray.h:428
bool IsStorageFixedSize64Bit() const
Definition: vtkCellArray.h:443
vtkIdType GetNumberOfConnectivityIds() const override
Get the size of the connectivity array that stores the point ids.
Definition: vtkCellArray.h:349
#define vtkLogScopeFunction(verbosity_name)
Definition: vtkLogger.h:546
void Squeeze()
Reclaim any extra memory while preserving data.
vtkIdType GetNumberOfValues() const
Get the total number of values in the array.
vtkTypeList::Create< vtkAOSDataArrayTemplate< vtkTypeInt32 >, vtkAOSDataArrayTemplate< vtkTypeInt64 >, vtkAffineArray< vtkTypeInt32 >, vtkAffineArray< vtkTypeInt64 >> OffsetsArrays
List of possible array types used for storage of vtkCellArray.
virtual void SetComponent(vtkIdType tupleIdx, int compIdx, double value)
Set the data component at the location specified by tupleIdx and compIdx to value.
dynamic, self-adjusting array of int
Definition: vtkIntArray.h:35
void UseDefaultStorage()
Initialize internal data structures to use 32- or 64-bit storage.
vtkIdType GetId(vtkIdType i)
Return the id at location i.
Definition: vtkIdList.h:81
void SetId(vtkIdType i, vtkIdType id)
Set the id at location i.
Definition: vtkIdList.h:113
void Reset()
Reuse list.
bool CanConvertTo32BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage. ...
bool AllocateExact(vtkIdType numCells, vtkIdType connectivitySize)
Pre-allocate memory in internal data structures.
void AppendLegacyFormat(vtkIdTypeArray *data, vtkIdType ptOffset=0)
Append an array of data with the legacy vtkCellArray layout, e.g.
vtkIdType IsHomogeneous() const override
Check if all cells have the same number of vertices.
void ReverseCellAtId(vtkIdType cellId)
Reverses the order of the point ids for the specified cell.
Array-Of-Structs implementation of vtkGenericDataArray.
bool ResizeExact(vtkIdType numCells, vtkIdType connectivitySize)
ResizeExact() resizes the internal structures to hold numCells total cell offsets and connectivitySiz...
void Use32BitStorage()
Initialize internal data structures to use 32- or 64-bit storage.
vtkIdType GetNumberOfIds() const noexcept
Return the number of id's in the list.
Definition: vtkIdList.h:76
void Dispatch(Functor &&functor, Args &&...args)
bool IsStorage64Bit() const
Definition: vtkCellArray.h:433
void Reset()
Reset to an empty state, without freeing any memory.
AffineArray64 * GetOffsetsAffineArray64() const
Return the array used to store cell offsets.
Definition: vtkCellArray.h:598
void UpdateCellCount(int npts)
Used in conjunction with InsertNextCell(int npts) and InsertCellPoint() to update the number of point...
bool ConvertToFixedSize64BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
vtkIdType InsertNextCell(vtkCell *cell)
Insert a cell object.
bool IsStorageFixedSize32Bit() const
Definition: vtkCellArray.h:448
void Initialize() override
Free any memory and reset to an empty state.
vtkIdType GetCapacity() const
Get the capacity of the array.
object to represent cell connectivity
Definition: vtkCellArray.h:177
void ReplaceCellAtId(vtkIdType cellId, vtkIdList *list)
Replaces the point ids for the specified cell with the supplied list.
vtkSmartPointer< T > TakeSmartPointer(T *obj)
Construct a vtkSmartPointer containing obj.
bool ConvertTo64BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
A utility array for wrapping affine functions in implicit arrays.
bool ConvertToFixedSize32BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
Allocate and hold a VTK object.
bool CanConvertTo64BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage. ...
void SetData(AOSArray32 *, AOSArray32 *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
#define vtkLogScopeF(verbosity_name,...)
Definition: vtkLogger.h:543
bool CanConvertToFixedSize64BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage. ...
vtkIdList * GetPointIds()
Return the list of point ids defining the cell.
Definition: vtkCell.h:144
virtual bool SetNumberOfValues(vtkIdType numValues)
Specify the number of values (tuples * components) for this object to hold.
vtkDataArray * GetConnectivityArray() const
Return the array used to store the point ids that define the cells' connectivity. ...
Definition: vtkCellArray.h:610
bool IsValid()
Check that internal storage is consistent and in a valid state.
AOSArray64 * GetOffsetsAOSArray64() const
Return the array used to store cell offsets.
Definition: vtkCellArray.h:593
bool IsStorage32Bit() const
Definition: vtkCellArray.h:438
vtkCellArrayIterator * NewIterator()
NewIterator returns a new instance of vtkCellArrayIterator that is initialized to point at the first ...
bool ConvertTo32BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
#define TEST_ASSERT(cond)
void Use64BitStorage()
Initialize internal data structures to use 32- or 64-bit storage.
bool IsStorageGeneric() const
Definition: vtkCellArray.h:461
STL-compatible iterable ranges that provide access to vtkDataArray elements.
void ImportLegacyFormat(vtkIdTypeArray *data)
Import an array of data with the legacy vtkCellArray layout, e.g.
bool AllocateEstimate(vtkIdType numCells, vtkIdType maxCellSize)
Pre-allocate memory in internal data structures.
Definition: vtkCellArray.h:249
int GetNextCell(vtkIdType &npts, vtkIdType const *&pts)
vtkIdType * GetPointer(vtkIdType i)
Get a pointer to a particular data index.
Definition: vtkIdList.h:150