Lumiverse  2.5
A framework for creating lighting control applications
ArnoldParameterVector.h
Go to the documentation of this file.
1 
4 #ifndef _ArnoldParameterVECTOR_H_
5 #define _ArnoldParameterVECTOR_H_
6 #pragma once
7 
8 #include <string>
9 #include <deque>
10 #include <sstream>
11 
12 namespace Lumiverse {
22  template<size_t D, typename T>
24  {
25  public:
33  ArnoldParameterVector(T *val = NULL);
34 
43 
48 
53  string getTypeName() {
54  std::string result;
55  std::stringstream sstm;
56  sstm << m_arnoldTypeName << D;
57  result = sstm.str();
58  return result;
59  }
60 
61  // Override for =
62  void operator=(ArnoldParameterVector val);
63 
64  // Arithmetic overrides
66 
68 
69  ArnoldParameterVector& operator*=(float val);
71 
72  ArnoldParameterVector& operator/=(float val);
74 
75  T& operator[]( size_t i ) {
76  // assumes all members are in a contiguous block
77  // todo assert
78  return m_elements[i];
79  }
80 
85  size_t getDimension() { return D; }
86 
91  void resize(size_t dim) { m_elements.reserve(dim); }
92 
98  T getElement(size_t i) { return m_elements[i]; }
99 
104  T* getElements() { return &m_elements[0]; }
105 
111  void setElement(size_t i, T val) { m_elements[i] = val; }
112 
113  private:
118 
122  std::string m_arnoldTypeName;
123  };
124 
125  // Ops ops ops all overloaded woo
126 
127  // Compares two ArnoldParameterVectors. Uses normal float comparison
128  template<size_t D, typename T>
129  inline bool operator==(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
130  for (size_t i = 0; i < D; i++) {
131  if (a.getElement(i) != b.getElement(i))
132  return false;
133  }
134 
135  return true;
136  }
137 
138  template<size_t D, typename T>
139  inline bool operator!=(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
140  return !(a == b);
141  }
142 
143  // Element uses the normal < op for floats.
144  template<size_t D, typename T>
145  inline bool operator<(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
146  for (size_t i = 0; i < D; i++) {
147  if (a.getElement(i) >= b.getElement(i))
148  return false;
149  }
150 
151  return true;
152  }
153 
154  template<size_t D, typename T>
155  inline bool operator>(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
156  return b < a;
157  }
158 
159  template<size_t D, typename T>
160  inline bool operator<=(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
161  return !(a > b);
162  }
163 
164  template<size_t D, typename T>
165  inline bool operator>=(ArnoldParameterVector<D, T> a, ArnoldParameterVector<D, T> b) {
166  return !(a < b);
167  }
168 
169  // Arithmetic overrides
170  template<size_t D, typename T>
171  inline ArnoldParameterVector<D, T> operator+(ArnoldParameterVector<D, T> lhs, ArnoldParameterVector<D, T> rhs) {
172  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
173 
174  for (size_t i = 0; i < D; i++) {
175  val[i] += rhs.getElement(i);
176  }
177 
178  return val;
179  }
180 
181  template<size_t D, typename T>
182  inline ArnoldParameterVector<D, T> operator-(ArnoldParameterVector<D, T> lhs, ArnoldParameterVector<D, T> rhs) {
183  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
184 
185  for (size_t i = 0; i < D; i++) {
186  val[i] -= rhs.getElement(i);
187  }
188 
189  return val;
190  }
191 
192  template<size_t D, typename T>
193  inline ArnoldParameterVector<D, T> operator*(ArnoldParameterVector<D, T> lhs, float rhs) {
194  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
195  val *= rhs;
196  return val;
197  }
198 
199  template<size_t D, typename T>
200  inline ArnoldParameterVector<D, T> operator*(ArnoldParameterVector<D, T> lhs, ArnoldParameterVector<D, T> rhs) {
201  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
202  val *= rhs;
203  return val;
204  }
205 
206  template<size_t D, typename T>
207  inline ArnoldParameterVector<D, T> operator/(ArnoldParameterVector<D, T> lhs, float rhs) {
208  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
209  val /= rhs;
210  return val;
211  }
212 
213  template<size_t D, typename T>
214  inline ArnoldParameterVector<D, T> operator/(ArnoldParameterVector<D, T> lhs, ArnoldParameterVector<D, T> rhs) {
215  ArnoldParameterVector<D, T> val = ArnoldParameterVector<D, T>(lhs);
216  val /= rhs;
217  return val;
218  }
219 
220  template<size_t D, typename T>
222  T val_s;
223 
224  for (size_t i = 0; i < D; i++) {
225  val_s = (val) ? val[i] : 0;
226 
227  m_elements[i] = val_s;
228  }
229 }
230 
231 template<size_t D, typename T>
233  size_t i = 0;
234  m_elements.clear();
235  m_elements.reserve(D);
236 
237  for (; i < other->getDimension() && i < D; i++) {
238  m_elements.push_back(other->getElement(i));
239  }
240 
241  for (; i < D; i++) {
242  m_elements.push_back(T());
243  }
244 }
245 
246 // Override for =
247 template<size_t D, typename T>
249  for (size_t i = 0; i < val.getDimension() && i < D; i++) {
250  m_elements[i] = val.getElement(i);
251  }
252 }
253 
254 // Arithmetic overrides
255 template<size_t D, typename T>
256 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator+=(ArnoldParameterVector val) {
257  for (size_t i = 0; i < val.getDimension() && i < D; i++) {
258  m_elements[i] += val.getElement(i);
259  }
260 
261  return *this;
262 }
263 
264 template<size_t D, typename T>
265 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator-=(ArnoldParameterVector val) {
266  for (size_t i = 0; i < val.getDimension() && i < D; i++) {
267  m_elements[i] -= val.getElement(i);
268  }
269 
270  return *this;
271 }
272 
273 template<size_t D, typename T>
274 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator*=(float val) {
275  for (size_t i = 0; i < D; i++) {
276  m_elements[i] *= val;
277  }
278 
279  return *this;
280 }
281 
282 template<size_t D, typename T>
283 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator*=(ArnoldParameterVector val) {
284  for (size_t i = 0; i < val.getDimension() && i < D; i++) {
285  m_elements[i] *= val.getElement(i);
286  }
287 
288  return *this;
289 }
290 
291 template<size_t D, typename T>
292 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator/=(float val) {
293  for (size_t i = 0; i < D; i++) {
294  m_elements[i] /= val;
295  }
296 
297  return *this;
298 }
299 
300 template<size_t D, typename T>
301 ArnoldParameterVector<D, T>& ArnoldParameterVector<D, T>::operator/=(ArnoldParameterVector val) {
302  for (size_t i = 0; i < val.getDimension() && i < D; i++) {
303  m_elements[i] /= val.getElement(i);
304  }
305 
306  return *this;
307 }
308 
309 }
310 
311 #endif
void resize(size_t dim)
Resizes the vector to a specific dimension.
Definition: ArnoldParameterVector.h:91
T m_elements[D]
The actual array contains the elements.
Definition: ArnoldParameterVector.h:117
~ArnoldParameterVector()
Destroys the vector.
Definition: ArnoldParameterVector.h:47
size_t getDimension()
Returns the dimension of this vector.
Definition: ArnoldParameterVector.h:85
ArnoldParameterVector(T *val=NULL)
Constructs a vector with the values passed as an array.
Definition: ArnoldParameterVector.h:221
std::string m_arnoldTypeName
The type name of arnold parameter.
Definition: ArnoldParameterVector.h:122
Defines a vector type for Arnold parameters, like color, vector etc.
Definition: ArnoldParameterVector.h:23
Contains all core Lumiverse functions and variables.
Definition: Device.cpp:2
string getTypeName()
Says that this object is a vector for a arnold parameter.
Definition: ArnoldParameterVector.h:53
T * getElements()
Gets the pointer to corresponding array.
Definition: ArnoldParameterVector.h:104
void setElement(size_t i, T val)
Sets the value of a element.
Definition: ArnoldParameterVector.h:111
T getElement(size_t i)
Gets the nth element.
Definition: ArnoldParameterVector.h:98