VTK  9.5.20251216
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"
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
28namespace
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
50template <vtkCellArray::StorageTypes StorageType, typename... ArrayTypes>
51struct CellArrayFactory
52{
53 static vtkSmartPointer<vtkCellArray> New() { return nullptr; }
54};
55
56template <>
57struct CellArrayFactory<vtkCellArray::StorageTypes::Int32>
58{
59 static vtkSmartPointer<vtkCellArray> New()
60 {
61 auto cellArray = vtkSmartPointer<vtkCellArray>::New();
62 cellArray->Use32BitStorage();
63 TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int32);
64 return cellArray;
65 }
66};
67
68template <>
69struct CellArrayFactory<vtkCellArray::StorageTypes::Int64>
70{
71 static vtkSmartPointer<vtkCellArray> New()
72 {
73 auto cellArray = vtkSmartPointer<vtkCellArray>::New();
74 cellArray->Use64BitStorage();
75 TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int64);
76 return cellArray;
77 }
78};
79
80template <>
81struct CellArrayFactory<vtkCellArray::StorageTypes::FixedSizeInt32>
82{
83 static vtkSmartPointer<vtkCellArray> New()
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
92template <>
93struct CellArrayFactory<vtkCellArray::StorageTypes::FixedSizeInt64>
94{
95 static vtkSmartPointer<vtkCellArray> New()
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
104struct DummyWorker
105{
106 template <typename OffsetsT, typename ConnectivityT>
107 [[maybe_unused]] void operator()(OffsetsT*, ConnectivityT*)
108 {
109 void();
110 }
111};
112
113template <typename ConnectivityArrayT, typename OffsetsArrayT>
114struct 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 =
133 vtkArrayDispatch::Dispatch2ByArrayWithSameValueType<vtkArrayDispatch::OffsetsArrays,
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
149template <bool FixedSize>
150vtkSmartPointer<vtkIdList> GetCellIds(vtkIdType cellId, bool reverse = false, vtkIdType offset = 0)
151{
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
222template <bool FixedSize>
223void 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
230template <bool FixedSize>
231bool 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
244template <bool FixedSize>
245void 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
263void TestAllocate(vtkSmartPointer<vtkCellArray> cellArray)
264{
266
267 cellArray->Initialize();
268 cellArray->AllocateEstimate(100, 4);
269 TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 101);
270 TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 400);
271
272 cellArray->Initialize();
273 cellArray->AllocateExact(100, 256);
274 TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 101);
275 TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 256);
276}
277
278void TestResize(vtkSmartPointer<vtkCellArray> cellArray)
279{
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
288void TestInitialize(vtkSmartPointer<vtkCellArray> cellArray)
289{
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()->GetSize() == 1);
298 TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 0);
299}
300
301template <bool FixedSize>
302void TestSqueeze(vtkSmartPointer<vtkCellArray> cellArray)
303{
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()->GetSize() == 4);
316 TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == (FixedSize ? 9 : 14));
317
318 TEST_ASSERT(cellArray->GetNumberOfCells() == 3);
319 ValidateCellArray<FixedSize>(cellArray);
320}
321
322void TestReset(vtkSmartPointer<vtkCellArray> cellArray)
323{
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()->GetSize() >= 129);
332 TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() >= 256);
333}
334
335template <bool FixedSize>
336void TestIsValidOffsets(vtkSmartPointer<vtkCellArray> cellArray)
337{
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
358template <bool FixedSize>
359void TestIsValidConnectivity(vtkSmartPointer<vtkCellArray> cellArray)
360{
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
375template <bool FixedSize>
376void TestGetNumberOfCells(vtkSmartPointer<vtkCellArray> cellArray)
377{
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
395template <bool FixedSize>
396void TestGetNumberOfOffsets(vtkSmartPointer<vtkCellArray> cellArray)
397{
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
415template <bool FixedSize>
416void TestGetNumberOfConnectivityIds(vtkSmartPointer<vtkCellArray> cellArray)
417{
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
435template <bool FixedSize>
436void TestNewIterator(vtkSmartPointer<vtkCellArray> cellArray)
437{
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
470template <typename OffsetsArrayType, typename ConnectivityArrayType>
471void TestSetDataImpl(vtkSmartPointer<vtkCellArray> cellArray)
472{
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
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 (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 (std::is_same_v<OffsetsValueType, vtkTypeInt32>)
509 {
510 TEST_ASSERT(!test->IsStorage64Bit());
511 TEST_ASSERT(test->IsStorage32Bit());
512 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
513 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
514 TEST_ASSERT(!test->IsStorageGeneric());
515 }
516 else if (std::is_same_v<OffsetsValueType, vtkTypeInt64>)
517 {
518 TEST_ASSERT(test->IsStorage64Bit());
519 TEST_ASSERT(!test->IsStorage32Bit());
520 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
521 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
522 TEST_ASSERT(!test->IsStorageGeneric());
523 }
524 else
525 {
526 TEST_ASSERT(!test->IsStorage64Bit());
527 TEST_ASSERT(!test->IsStorage32Bit());
528 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
529 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
530 TEST_ASSERT(test->IsStorageGeneric());
531 }
532 }
533 else if (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 (std::is_same_v<OffsetsValueType, vtkTypeInt32>)
538 {
539 TEST_ASSERT(!test->IsStorage64Bit());
540 TEST_ASSERT(!test->IsStorage32Bit());
541 TEST_ASSERT(test->IsStorageFixedSize32Bit());
542 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
543 TEST_ASSERT(!test->IsStorageGeneric());
544 }
545 else if (std::is_same_v<OffsetsValueType, vtkTypeInt64>)
546 {
547 TEST_ASSERT(!test->IsStorage64Bit());
548 TEST_ASSERT(!test->IsStorage32Bit());
549 TEST_ASSERT(test->IsStorageFixedSize64Bit());
550 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
551 TEST_ASSERT(!test->IsStorageGeneric());
552 }
553 else
554 {
555 TEST_ASSERT(!test->IsStorage64Bit());
556 TEST_ASSERT(!test->IsStorage32Bit());
557 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
558 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
559 TEST_ASSERT(test->IsStorageGeneric());
560 }
561 }
562 else
563 {
564 TEST_ASSERT(!test->IsStorage64Bit());
565 TEST_ASSERT(!test->IsStorage32Bit());
566 TEST_ASSERT(!test->IsStorageFixedSize64Bit());
567 TEST_ASSERT(!test->IsStorageFixedSize32Bit());
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
579void TestSetData(vtkSmartPointer<vtkCellArray> cellArray)
580{
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
654struct 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
669void TestIsStorage64Bit(vtkSmartPointer<vtkCellArray> cellArray)
670{
672
673 cellArray->Dispatch(TestIsStorage64BitImpl{}, cellArray->IsStorage64Bit());
674}
675
676struct 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
691void TestIsStorage32Bit(vtkSmartPointer<vtkCellArray> cellArray)
692{
694
695 cellArray->Dispatch(TestIsStorage32BitImpl{}, cellArray->IsStorage32Bit());
696}
697
698struct 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
713void TestIsStorageFixedSize32Bit(vtkSmartPointer<vtkCellArray> cellArray)
714{
716
717 cellArray->Dispatch(TestIsStorageFixedSize64BitImpl{}, cellArray->IsStorageFixedSize64Bit());
718}
719
720struct 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
735void TestIsStorageFixedSize64Bit(vtkSmartPointer<vtkCellArray> cellArray)
736{
738
739 cellArray->Dispatch(TestIsStorageFixedSize32BitImpl{}, cellArray->IsStorageFixedSize32Bit());
740}
741
742struct 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
758void TestIsStorageGeneric(vtkSmartPointer<vtkCellArray> cellArray)
759{
761
762 cellArray->Dispatch(TestIsStorageGenericImpl{}, cellArray->IsStorageGeneric());
763}
764
765void TestUse32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
766{
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
778void TestUse64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
779{
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
791void TestUseDefaultStorage(vtkSmartPointer<vtkCellArray> cellArray)
792{
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
804void TestUseFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
805{
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
817void TestUseFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
818{
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
830void TestUseFixedSizeDefaultStorage(vtkSmartPointer<vtkCellArray> cellArray)
831{
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
843void TestCanConvertTo32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
844{
846
847 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
848
849 if (cellArray->IsStorage64Bit())
850 {
851 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
852 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
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 });
862 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
863 }
864 else if (cellArray->IsStorageFixedSize64Bit())
865 {
866 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
867 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
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 });
877 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
878 }
879}
880
881void TestCanConvertTo64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
882{
884
885 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
886
887 if (cellArray->IsStorage64Bit())
888 {
889 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
890 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
891
892#ifdef VTK_USE_64BIT_IDS
893 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
894 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
895 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
896 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
897#endif // VTK_USE_64BIT_IDS
898 }
899 else if (cellArray->IsStorage32Bit())
900 {
901 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
902 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
903 }
904 else if (cellArray->IsStorageFixedSize64Bit())
905 {
906 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
907 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
908
909#ifdef VTK_USE_64BIT_IDS
910 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
911 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
912 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
913 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
914#endif // VTK_USE_64BIT_IDS
915 }
916 else
917 {
918 cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX });
919 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
920 }
921}
922
923void TestCanConvertToFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
924{
926
927 TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage());
928
929 if (cellArray->IsStorage64Bit())
930 {
931 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
932 TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage());
933
934#ifdef VTK_USE_64BIT_IDS
935 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
936 TEST_ASSERT(!cellArray->CanConvertToFixedSize32BitStorage());
937#endif // VTK_USE_64BIT_IDS
938 }
939 else if (cellArray->IsStorage32Bit())
940 {
941 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
942 TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage());
943 }
944 else if (cellArray->IsStorageFixedSize64Bit())
945 {
946 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
947 TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage());
948
949#ifdef VTK_USE_64BIT_IDS
950 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
951 TEST_ASSERT(!cellArray->CanConvertToFixedSize32BitStorage());
952#endif // VTK_USE_64BIT_IDS
953 }
954 else
955 {
956 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
957 TEST_ASSERT(cellArray->CanConvertTo32BitStorage());
958 }
959}
960
961void TestCanConvertToFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
962{
964
965 TEST_ASSERT(cellArray->CanConvertTo64BitStorage());
966
967 if (cellArray->IsStorage64Bit())
968 {
969 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
970 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
971
972#ifdef VTK_USE_64BIT_IDS
973 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
974 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
975 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
976 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
977#endif // VTK_USE_64BIT_IDS
978 }
979 else if (cellArray->IsStorage32Bit())
980 {
981 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
982 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
983 }
984 else if (cellArray->IsStorageFixedSize64Bit())
985 {
986 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX });
987 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
988
989#ifdef VTK_USE_64BIT_IDS
990 cellArray->InsertNextCell({ 0, 1, static_cast<vtkTypeInt64>(VTK_TYPE_INT32_MAX) + 1 });
991 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
992 cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX });
993 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
994#endif // VTK_USE_64BIT_IDS
995 }
996 else
997 {
998 cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX });
999 TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage());
1000 }
1001}
1002
1003template <bool FixedSize>
1004void 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
1017template <bool FixedSize>
1018void 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
1031void TestConvertToFixedSize32BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1032{
1033 vtkLogScopeFunction(INFO);
1034
1035 FillCellArray<true>(cellArray);
1036
1037 TEST_ASSERT(cellArray->ConvertToFixedSize32BitStorage());
1038 TEST_ASSERT(cellArray->IsStorageFixedSize32Bit());
1039
1040 // Ensure that data is still good:
1041 ValidateCellArray<true>(cellArray);
1042}
1043
1044void TestConvertToFixedSize64BitStorage(vtkSmartPointer<vtkCellArray> cellArray)
1045{
1046 vtkLogScopeFunction(INFO);
1047
1048 FillCellArray<true>(cellArray);
1049
1050 TEST_ASSERT(cellArray->ConvertToFixedSize64BitStorage());
1051 TEST_ASSERT(cellArray->IsStorageFixedSize64Bit());
1052
1053 // Ensure that data is still good:
1054 ValidateCellArray<true>(cellArray);
1055}
1056
1057void TestGetOffsetsArray(vtkSmartPointer<vtkCellArray> cellArray)
1058{
1059 vtkLogScopeFunction(INFO);
1060
1061 switch (cellArray->GetStorageType())
1062 {
1064 TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAOSArray64());
1065 break;
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;
1076 default:
1077 TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsArray());
1078 break;
1079 }
1080}
1081
1082void TestGetConnectivityArray(vtkSmartPointer<vtkCellArray> cellArray)
1083{
1084 vtkLogScopeFunction(INFO);
1085
1086 switch (cellArray->GetStorageType())
1087 {
1089 TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray64());
1090 break;
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;
1101 default:
1102 TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityArray());
1103 break;
1104 }
1105}
1106
1107template <bool FixedSize>
1108void 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
1132template <bool FixedSize>
1133void 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
1164template <bool FixedSize>
1165void TestTraversalIdList(vtkSmartPointer<vtkCellArray> cellArray)
1166{
1167 vtkLogScopeFunction(INFO);
1168
1169 FillCellArray<FixedSize>(cellArray);
1170
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
1183template <bool FixedSize>
1184void 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
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
1207template <bool FixedSize>
1208void 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
1219template <bool FixedSize>
1220void 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
1261template <bool FixedSize>
1262void 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
1290template <bool FixedSize>
1291void 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
1322template <bool FixedSize>
1323void 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
1366template <bool FixedSize>
1367void 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
1384template <bool FixedSize>
1385void TestDeepCopy(vtkSmartPointer<vtkCellArray> cellArray)
1386{
1387 vtkLogScopeFunction(INFO);
1388
1389 FillCellArray<FixedSize>(cellArray);
1390
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
1401template <bool FixedSize>
1402void TestShallowCopy(vtkSmartPointer<vtkCellArray> cellArray)
1403{
1404 vtkLogScopeFunction(INFO);
1405
1406 FillCellArray<FixedSize>(cellArray);
1407
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
1420template <bool FixedSize>
1421void 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
1450template <bool FixedSize>
1451void TestAppend32(vtkSmartPointer<vtkCellArray> cellArray)
1452{
1453 vtkLogScopeFunction(INFO);
1454 TestAppendImpl<FixedSize>(cellArray, CellArrayFactory<vtkCellArray::Int32>::New());
1455}
1456
1457template <bool FixedSize>
1458void TestAppend64(vtkSmartPointer<vtkCellArray> cellArray)
1459{
1460 vtkLogScopeFunction(INFO);
1461 TestAppendImpl<FixedSize>(cellArray, CellArrayFactory<vtkCellArray::Int64>::New());
1462}
1463
1464template <bool FixedSize>
1465void TestLegacyFormatImportExportAppend(vtkSmartPointer<vtkCellArray> cellArray)
1466{
1467 vtkLogScopeFunction(INFO);
1468
1469 FillCellArray<FixedSize>(cellArray);
1470
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
1539const char* StorageTypeToString(vtkCellArray::StorageTypes storageType)
1540{
1541 switch (storageType)
1542 {
1544 return "Int64";
1546 return "Int32";
1548 return "FixedSizeInt64";
1550 return "FixedSizeInt32";
1552 default:
1553 return "Generic";
1554 }
1555}
1556
1557template <vtkCellArray::StorageTypes StorageType, bool FixedSize, typename... ArrayTypes>
1558void 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
#define TEST_ASSERT(cond)
This class is used in some unit tests to setup a mock data array which derives vtkGenericDataArray.
Array-Of-Structs implementation of vtkGenericDataArray.
static vtkAbstractArray * SafeDownCast(vtkObjectBase *o)
vtkTypeList::Create< vtkAOSDataArrayTemplate< vtkTypeInt32 >, vtkAOSDataArrayTemplate< vtkTypeInt64 > > ConnectivityArrays
List of possible array types used for storage of vtkCellArray.
vtkTypeList::Create< vtkAOSDataArrayTemplate< vtkTypeInt32 >, vtkAOSDataArrayTemplate< vtkTypeInt64 >, vtkAffineArray< vtkTypeInt32 >, vtkAffineArray< vtkTypeInt64 > > OffsetsArrays
List of possible array types used for storage of vtkCellArray.
object to represent cell connectivity
vtkCellArrayIterator * NewIterator()
NewIterator returns a new instance of vtkCellArrayIterator that is initialized to point at the first ...
vtkIdType InsertNextCell(vtkCell *cell)
Insert a cell object.
dynamic, self-adjusting array of vtkIdType
static vtkImplicitArray< vtkAffineImplicitBackend< T >, ArrayType > * FastDownCast(vtkAbstractArray *source)
dynamic, self-adjusting array of int
dynamic, self-adjusting array of long
dynamic, self-adjusting array of long long
Allocate and hold a VTK object.
Definition vtkNew.h:167
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:256
Hold a reference to a vtkObjectBase instance.
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
@ offset
Definition vtkX3D.h:439
vtkSmartPointer< T > TakeSmartPointer(T *obj)
Construct a vtkSmartPointer<T> containing obj.
VTK_ITER_INLINE auto DataArrayValueRange(const ArrayTypePtr &array, ValueIdType start=-1, ValueIdType end=-1) -> typename detail::SelectValueRange< ArrayTypePtr, TupleSize, ForceValueTypeForVtkDataArray >::type
Generate an stl and for-range compatible range of flat AOS iterators from a vtkDataArray.
vtkImplicitArray< vtkAffineImplicitBackend< T >, vtkArrayTypes::VTK_AFFINE_ARRAY > vtkAffineArray
A utility alias for wrapping affine functions in implicit arrays.
STL-compatible iterable ranges that provide access to vtkDataArray elements.
#define vtkLogScopeF(verbosity_name,...)
Definition vtkLogger.h:562
#define vtkLogScopeFunction(verbosity_name)
Definition vtkLogger.h:565
int vtkIdType
Definition vtkType.h:368