VTK  9.1.0
vtkGenericDataArrayLookupHelper.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkGenericDataArrayLookupHelper.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
22 #ifndef vtkGenericDataArrayLookupHelper_h
23 #define vtkGenericDataArrayLookupHelper_h
24 
25 #include "vtkIdList.h"
26 #include <algorithm>
27 #include <cmath>
28 #include <limits>
29 #include <unordered_map>
30 #include <vector>
31 
32 namespace detail
33 {
34 template <typename T, bool>
35 struct has_NaN;
36 
37 template <typename T>
38 struct has_NaN<T, true>
39 {
40  static bool isnan(T x) { return std::isnan(x); }
41 };
42 
43 template <typename T>
44 struct has_NaN<T, false>
45 {
46  static bool isnan(T) { return false; }
47 };
48 
49 template <typename T>
50 bool isnan(T x)
51 {
52  // Select the correct partially specialized type.
54 }
55 } // namespace detail
56 
57 template <class ArrayTypeT>
59 {
60 public:
61  typedef ArrayTypeT ArrayType;
62  typedef typename ArrayType::ValueType ValueType;
63 
65 
67 
68  void SetArray(ArrayTypeT* array)
69  {
70  if (this->AssociatedArray != array)
71  {
72  this->ClearLookup();
73  this->AssociatedArray = array;
74  }
75  }
76 
78  {
79  this->UpdateLookup();
80  auto indices = FindIndexVec(elem);
81  if (indices == nullptr)
82  {
83  return -1;
84  }
85  return indices->front();
86  }
87 
88  void LookupValue(ValueType elem, vtkIdList* ids)
89  {
90  ids->Reset();
91  this->UpdateLookup();
92  auto indices = FindIndexVec(elem);
93  if (indices)
94  {
95  ids->Allocate(static_cast<vtkIdType>(indices->size()));
96  for (auto index : *indices)
97  {
98  ids->InsertNextId(index);
99  }
100  }
101  }
102 
104 
107  void ClearLookup()
108  {
109  this->ValueMap.clear();
110  this->NanIndices.clear();
111  }
113 
114 private:
116  void operator=(const vtkGenericDataArrayLookupHelper&) = delete;
117 
118  void UpdateLookup()
119  {
120  if (!this->AssociatedArray || (this->AssociatedArray->GetNumberOfTuples() < 1) ||
121  (!this->ValueMap.empty() || !this->NanIndices.empty()))
122  {
123  return;
124  }
125 
126  vtkIdType num = this->AssociatedArray->GetNumberOfValues();
127  this->ValueMap.reserve(num);
128  for (vtkIdType i = 0; i < num; ++i)
129  {
130  auto value = this->AssociatedArray->GetValue(i);
131  if (::detail::isnan(value))
132  {
133  NanIndices.push_back(i);
134  }
135  this->ValueMap[value].push_back(i);
136  }
137  }
138 
139  // Return a pointer to the relevant vector of indices if specified value was
140  // found in the array.
141  std::vector<vtkIdType>* FindIndexVec(ValueType value)
142  {
143  std::vector<vtkIdType>* indices{ nullptr };
144  if (::detail::isnan(value) && !this->NanIndices.empty())
145  {
146  indices = &this->NanIndices;
147  }
148  const auto& pos = this->ValueMap.find(value);
149  if (pos != this->ValueMap.end())
150  {
151  indices = &pos->second;
152  }
153  return indices;
154  }
155 
156  ArrayTypeT* AssociatedArray{ nullptr };
157  std::unordered_map<ValueType, std::vector<vtkIdType>> ValueMap;
158  std::vector<vtkIdType> NanIndices;
159 };
160 
161 #endif
162 // VTK-HeaderTest-Exclude: vtkGenericDataArrayLookupHelper.h
vtkIdList::Allocate
int Allocate(const vtkIdType sz, const int strategy=0)
Allocate a capacity for sz ids in the list and set the number of stored ids in the list to 0.
vtkGenericDataArray::ValueType
ValueTypeT ValueType
Definition: vtkGenericDataArray.h:84
vtkGenericDataArrayLookupHelper
internal class used by vtkGenericDataArray to support LookupValue.
Definition: vtkGenericDataArrayLookupHelper.h:59
vtkGenericDataArrayLookupHelper::SetArray
void SetArray(ArrayTypeT *array)
Definition: vtkGenericDataArrayLookupHelper.h:68
detail::has_NaN< T, false >::isnan
static bool isnan(T)
Definition: vtkGenericDataArrayLookupHelper.h:46
vtkX3D::value
@ value
Definition: vtkX3D.h:226
vtkIdType
int vtkIdType
Definition: vtkType.h:332
vtkGenericDataArrayLookupHelper::ValueType
ArrayType::ValueType ValueType
Definition: vtkGenericDataArrayLookupHelper.h:62
detail
Definition: vtkGenericDataArrayLookupHelper.h:33
detail::isnan
bool isnan(T x)
Definition: vtkGenericDataArrayLookupHelper.h:50
vtkIdList::InsertNextId
vtkIdType InsertNextId(const vtkIdType vtkid)
Add the id specified to the end of the list.
Definition: vtkIdList.h:341
vtkGenericDataArrayLookupHelper::~vtkGenericDataArrayLookupHelper
~vtkGenericDataArrayLookupHelper()
Definition: vtkGenericDataArrayLookupHelper.h:66
vtkGenericDataArrayLookupHelper::LookupValue
void LookupValue(ValueType elem, vtkIdList *ids)
Definition: vtkGenericDataArrayLookupHelper.h:88
vtkIdList
list of point or cell ids
Definition: vtkIdList.h:140
vtkGenericDataArrayLookupHelper::LookupValue
vtkIdType LookupValue(ValueType elem)
Definition: vtkGenericDataArrayLookupHelper.h:77
vtkGenericDataArrayLookupHelper::vtkGenericDataArrayLookupHelper
vtkGenericDataArrayLookupHelper()=default
vtkGenericDataArrayLookupHelper::ArrayType
ArrayTypeT ArrayType
Definition: vtkGenericDataArrayLookupHelper.h:61
detail::has_NaN
Definition: vtkGenericDataArrayLookupHelper.h:35
vtkX3D::index
@ index
Definition: vtkX3D.h:252
vtkIdList.h
vtkIdList::Reset
void Reset()
Reset to an empty state but retain previously allocated memory.
Definition: vtkIdList.h:254
vtkGenericDataArrayLookupHelper::ClearLookup
void ClearLookup()
Release any allocated memory for internal data-structures.
Definition: vtkGenericDataArrayLookupHelper.h:107
detail::has_NaN< T, true >::isnan
static bool isnan(T x)
Definition: vtkGenericDataArrayLookupHelper.h:40