VTK
vtkTuple.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkTuple.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=========================================================================*/
15
24#ifndef vtkTuple_h
25#define vtkTuple_h
26
27#include "vtkIOStream.h" // For streaming operators
28#include "vtkSystemIncludes.h"
29
30#include <cassert> // For inline assert for bounds checked methods.
31#include <cstdlib> // for std::abs() with int overloads
32#include <cmath> // for std::abs() with float overloads
33
34template<typename T, int Size>
36{
37public:
44 {
45 }
46
50 explicit vtkTuple(const T& scalar)
51 {
52 for (int i = 0; i < Size; ++i)
53 {
54 this->Data[i] = scalar;
55 }
56 }
57
63 explicit vtkTuple(const T* init)
64 {
65 for (int i = 0; i < Size; ++i)
66 {
67 this->Data[i] = init[i];
68 }
69 }
70
74 int GetSize() const { return Size; }
75
79 T* GetData() { return this->Data; }
80 const T* GetData() const { return this->Data; }
81
87 T& operator[](int i) { return this->Data[i]; }
88 const T& operator[](int i) const { return this->Data[i]; }
89
91
96 T operator()(int i) const
97 {
98 assert("pre: index_in_bounds" && i >= 0 && i < Size);
99 return this->Data[i];
100 }
102
104
107 bool Compare(const vtkTuple<T, Size>& other, const T& tol) const
108 {
109 if (Size != other.GetSize())
110 {
111 return false;
112 }
113 for (int i = 0; i < Size; ++i)
114 {
115 if (std::abs(this->Data[i] - other.Data[i]) >= tol)
116 {
117 return false;
118 }
119 }
120 return true;
121 }
123
125
128 template<typename TR>
130 {
131 vtkTuple<TR, Size> result;
132 for (int i = 0; i < Size; ++i)
133 {
134 result[i] = static_cast<TR>(this->Data[i]);
135 }
136 return result;
137 }
139
140protected:
142
145 T Data[Size];
146};
148
150
153template<typename A, int Size>
154ostream& operator<<(ostream& out, const vtkTuple<A, Size>& t)
155{
156 out << "(";
157 bool first = true;
158 for (int i = 0; i < Size; ++i)
159 {
160 if (first)
161 {
162 first = false;
163 }
164 else
165 {
166 out << ", ";
167 }
168 out << t[i];
169 }
170 out << ")";
171 return out;
172}
173// Specialize for unsigned char so that we can see the numbers!
174template<int Size>
175ostream& operator<<(ostream& out, const vtkTuple<unsigned char, Size>& t)
176{
177 out << "(";
178 bool first = true;
179 for (int i = 0; i < Size; ++i)
180 {
181 if (first)
182 {
183 first = false;
184 }
185 else
186 {
187 out << ", ";
188 }
189 out << static_cast<int>(t[i]);
190 }
191 out << ")";
192 return out;
193}
195
197
200template<typename A, int Size>
202{
203 for (int i = 0; i < Size; ++i)
204 {
205 if (t1[i] != t2[i])
206 {
207 return false;
208 }
209 }
210 return true;
211}
213
217template<typename A, int Size>
219{
220 return !(t1 == t2);
221}
222
223#endif // vtkTuple_h
224// VTK-HeaderTest-Exclude: vtkTuple.h
templated base type for containers of constant size.
Definition: vtkTuple.h:36
bool Compare(const vtkTuple< T, Size > &other, const T &tol) const
Equality operator with a tolerance to allow fuzzy comparisons.
Definition: vtkTuple.h:107
vtkTuple(const T *init)
Initalize the tuple's elements with the elements of the supplied array.
Definition: vtkTuple.h:63
int GetSize() const
Get the size of the tuple.
Definition: vtkTuple.h:74
vtkTuple< TR, Size > Cast() const
Cast the tuple to the specified type, returning the result.
Definition: vtkTuple.h:129
vtkTuple(const T &scalar)
Initialize all of the tuple's elements with the supplied scalar.
Definition: vtkTuple.h:50
T * GetData()
Get a pointer to the underlying data of the tuple.
Definition: vtkTuple.h:79
T & operator[](int i)
Get a reference to the underlying data element of the tuple.
Definition: vtkTuple.h:87
const T * GetData() const
Definition: vtkTuple.h:80
vtkTuple()
The default constructor does not initialize values.
Definition: vtkTuple.h:43
T Data[Size]
The only thing stored in memory!
Definition: vtkTuple.h:145
T operator()(int i) const
Get the value of the tuple at the index specifed.
Definition: vtkTuple.h:96
const T & operator[](int i) const
Definition: vtkTuple.h:88
bool operator!=(const vtkTuple< A, Size > &t1, const vtkTuple< A, Size > &t2)
Inequality for vector type.
Definition: vtkTuple.h:218
bool operator==(const vtkTuple< A, Size > &t1, const vtkTuple< A, Size > &t2)
Equality operator performs an equality check on each component.
Definition: vtkTuple.h:201
ostream & operator<<(ostream &out, const vtkTuple< A, Size > &t)
Output the contents of a tuple, mainly useful for debugging.
Definition: vtkTuple.h:154