File: TestIndexedArray.cxx

package info (click to toggle)
vtk9 9.5.2%2Bdfsg3-7
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 206,000 kB
  • sloc: cpp: 2,336,570; ansic: 327,116; python: 111,200; yacc: 4,104; java: 3,977; sh: 3,032; xml: 2,771; perl: 2,189; lex: 1,787; makefile: 181; javascript: 165; objc: 153; tcl: 59
file content (102 lines) | stat: -rw-r--r-- 3,137 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkIndexedArray.h"

#include "vtkDataArrayRange.h"
#include "vtkIdList.h"
#include "vtkIntArray.h"
#include "vtkVTK_DISPATCH_IMPLICIT_ARRAYS.h"

#include <cstdlib>
#include <numeric>
#include <random>

int TestIndexedArray(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
{
  int res = EXIT_SUCCESS;

  vtkNew<vtkIntArray> baseArray;
  baseArray->SetNumberOfComponents(1);
  baseArray->SetNumberOfTuples(1000);
  auto range = vtk::DataArrayValueRange<1>(baseArray);
  std::iota(range.begin(), range.end(), 0);

  vtkNew<vtkIdList> handles;
  handles->SetNumberOfIds(100);
  std::random_device randdev;
  std::mt19937 generator(randdev());

  std::uniform_int_distribution<vtkIdType> dist(0, 999);
  auto index_rand = [&]() { return dist(generator); };
  for (vtkIdType idx = 0; idx < 100; idx++)
  {
    handles->SetId(idx, index_rand());
  }

  vtkNew<vtkIndexedArray<int>> indexed;
  indexed->SetBackend(std::make_shared<vtkIndexedImplicitBackend<int>>(handles, baseArray));
  indexed->SetNumberOfComponents(1);
  indexed->SetNumberOfTuples(100);

  for (vtkIdType iArr = 0; iArr < 100; iArr++)
  {
    if (indexed->GetValue(iArr) != static_cast<int>(handles->GetId(iArr)))
    {
      res = EXIT_FAILURE;
      std::cerr << "get value failed with vtkIndexedArray" << std::endl;
    }
  }

  int iArr = 0;
  for (auto val : vtk::DataArrayValueRange<1>(indexed))
  {
    if (val != static_cast<int>(handles->GetId(iArr)))
    {
      res = EXIT_FAILURE;
      std::cerr << "range iterator failed with vtkIndexedArray" << std::endl;
    }
    iArr++;
  }

  // Test memory size measurement for a large array
  vtkNew<vtkIdList> largeHandles;
  largeHandles->SetNumberOfIds(1024 * 3);

  vtkNew<vtkIntArray> largeArray;
  largeArray->SetNumberOfComponents(4);
  largeArray->SetNumberOfTuples(1024 * 5);

  vtkNew<vtkIndexedArray<int>> largeIndexed;
  largeIndexed->SetBackend(
    std::make_shared<vtkIndexedImplicitBackend<int>>(largeHandles, largeArray));

  unsigned long expectedSizeInKib = 3 * sizeof(vtkIdType) + largeArray->GetActualMemorySize();
  if (largeIndexed->GetActualMemorySize() != expectedSizeInKib)
  {
    res = EXIT_FAILURE;
    std::cerr << "Wrong value memory size value for large vtkIndexedArray: "
              << largeIndexed->GetActualMemorySize() << " KiB instead of " << expectedSizeInKib
              << std::endl;
  }

  // Test memory size for an array smaller than 1KiB
  vtkNew<vtkIdList> smallHandles;
  smallHandles->SetNumberOfIds(5);

  vtkNew<vtkIntArray> smallArray;
  smallArray->SetNumberOfComponents(5);
  smallArray->SetNumberOfTuples(5);

  vtkNew<vtkIndexedArray<int>> smallIndexed;
  smallIndexed->SetBackend(
    std::make_shared<vtkIndexedImplicitBackend<int>>(smallHandles, smallArray));

  if (smallIndexed->GetActualMemorySize() != 2)
  {
    res = EXIT_FAILURE;
    std::cerr << "Wrong value memory size value for large vtkIndexedArray: "
              << smallIndexed->GetActualMemorySize() << " KiB instead of 2" << std::endl;
  }

  return res;
}