VTK  9.3.20240229
vtkTuple.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 
12 #ifndef vtkTuple_h
13 #define vtkTuple_h
14 
15 #include "vtkIOStream.h" // For streaming operators
16 #include "vtkSystemIncludes.h"
17 
18 #include <algorithm> // for std::copy
19 #include <array> // for std::array
20 #include <cassert> // For inline assert for bounds checked methods.
21 #include <cmath> // for std::abs() with float overloads
22 #include <cstdlib> // for std::abs() with int overloads
23 
24 VTK_ABI_NAMESPACE_BEGIN
25 template <typename T, int Size>
26 class vtkTuple
27 {
28 public:
34  vtkTuple() = default;
35 
39  explicit vtkTuple(const T& scalar)
40  {
41  for (int i = 0; i < Size; ++i)
42  {
43  this->Data[i] = scalar;
44  }
45  }
46 
52  explicit vtkTuple(const T* init)
53  {
54  for (int i = 0; i < Size; ++i)
55  {
56  this->Data[i] = init[i];
57  }
58  }
59 
64  explicit vtkTuple(const std::array<T, Size>& values)
65  {
66  std::copy(values.begin(), values.end(), this->Data);
67  }
68 
72  int GetSize() const { return Size; }
73 
77  T* GetData() { return this->Data; }
78  const T* GetData() const { return this->Data; }
79 
85  T& operator[](int i) { return this->Data[i]; }
86  const T& operator[](int i) const { return this->Data[i]; }
87 
89 
94  T operator()(int i) const
95  {
96  assert("pre: index_in_bounds" && i >= 0 && i < Size);
97  return this->Data[i];
98  }
100 
102 
105  bool Compare(const vtkTuple<T, Size>& other, const T& tol) const
106  {
107  if (Size != other.GetSize())
108  {
109  return false;
110  }
111  for (int i = 0; i < Size; ++i)
112  {
113  if (std::abs(this->Data[i] - other.Data[i]) >= tol)
114  {
115  return false;
116  }
117  }
118  return true;
119  }
121 
123 
126  template <typename TR>
128  {
129  vtkTuple<TR, Size> result;
130  for (int i = 0; i < Size; ++i)
131  {
132  result[i] = static_cast<TR>(this->Data[i]);
133  }
134  return result;
135  }
137 
138 protected:
140 
143  T Data[Size];
145 };
146 
148 
151 template <typename A, int Size>
152 ostream& operator<<(ostream& out, const vtkTuple<A, Size>& t)
153 {
154  out << "(";
155  bool first = true;
156  for (int i = 0; i < Size; ++i)
157  {
158  if (first)
159  {
160  first = false;
161  }
162  else
163  {
164  out << ", ";
165  }
166  out << t[i];
167  }
168  out << ")";
169  return out;
170 }
171 // Specialize for unsigned char so that we can see the numbers!
172 template <int Size>
173 ostream& operator<<(ostream& out, const vtkTuple<unsigned char, Size>& t)
174 {
175  out << "(";
176  bool first = true;
177  for (int i = 0; i < Size; ++i)
178  {
179  if (first)
180  {
181  first = false;
182  }
183  else
184  {
185  out << ", ";
186  }
187  out << static_cast<int>(t[i]);
188  }
189  out << ")";
190  return out;
191 }
193 
195 
198 template <typename A, int Size>
200 {
201  for (int i = 0; i < Size; ++i)
202  {
203  if (t1[i] != t2[i])
204  {
205  return false;
206  }
207  }
208  return true;
209 }
211 
215 template <typename A, int Size>
217 {
218  return !(t1 == t2);
219 }
220 
221 VTK_ABI_NAMESPACE_END
222 #endif // vtkTuple_h
223 // VTK-HeaderTest-Exclude: vtkTuple.h
templated base type for containers of constant size.
Definition: vtkTuple.h:27
bool Compare(const vtkTuple< T, Size > &other, const T &tol) const
Equality operator with a tolerance to allow fuzzy comparisons.
Definition: vtkTuple.h:105
T & operator[](int i)
Get a reference to the underlying data element of the tuple.
Definition: vtkTuple.h:85
vtkTuple(const T *init)
Initialize the tuple's elements with the elements of the supplied array.
Definition: vtkTuple.h:52
const T * GetData() const
Definition: vtkTuple.h:78
T * GetData()
Get a pointer to the underlying data of the tuple.
Definition: vtkTuple.h:77
int GetSize() const
Get the size of the tuple.
Definition: vtkTuple.h:72
vtkTuple(const T &scalar)
Initialize all of the tuple's elements with the supplied scalar.
Definition: vtkTuple.h:39
const T & operator[](int i) const
Definition: vtkTuple.h:86
vtkTuple(const std::array< T, Size > &values)
Initialize the tuple's elements using a std::array for matching type and size.
Definition: vtkTuple.h:64
T Data[Size]
The only thing stored in memory!
Definition: vtkTuple.h:143
T operator()(int i) const
Get the value of the tuple at the index specified.
Definition: vtkTuple.h:94
vtkTuple< TR, Size > Cast() const
Cast the tuple to the specified type, returning the result.
Definition: vtkTuple.h:127
vtkTuple()=default
The default constructor does not initialize values.
ostream & operator<<(ostream &out, const vtkTuple< A, Size > &t)
Output the contents of a tuple, mainly useful for debugging.
Definition: vtkTuple.h:152
bool operator!=(const vtkTuple< A, Size > &t1, const vtkTuple< A, Size > &t2)
Inequality for vector type.
Definition: vtkTuple.h:216
bool operator==(const vtkTuple< A, Size > &t1, const vtkTuple< A, Size > &t2)
Equality operator performs an equality check on each component.
Definition: vtkTuple.h:199