00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_XRB_NTUPLE_HPP_)
00012 #define _XRB_NTUPLE_HPP_
00013
00014 #include "xrb.hpp"
00015
00016 #include <stdio.h>
00017
00018 #include "xrb_enums.hpp"
00019
00027 namespace Xrb
00028 {
00029
00030
00031
00032
00033
00043 template <typename T, Uint32 size>
00044 class NTuple
00045 {
00046 public:
00047
00049 T m[size];
00050
00051
00052
00053
00054
00058 inline NTuple ()
00059 {
00060 }
00068 inline NTuple (
00069 T const component0,
00070 T const component1)
00071 {
00072 ASSERT1(size == 2);
00073 m[0] = component0;
00074 m[1] = component1;
00075 }
00084 inline NTuple (
00085 T const component0,
00086 T const component1,
00087 T const component2)
00088 {
00089 ASSERT1(size == 3);
00090 m[0] = component0;
00091 m[1] = component1;
00092 m[2] = component2;
00093 }
00103 inline NTuple (
00104 T const component0,
00105 T const component1,
00106 T const component2,
00107 T const component3)
00108 {
00109 ASSERT1(size == 4);
00110 m[0] = component0;
00111 m[1] = component1;
00112 m[2] = component2;
00113 m[3] = component3;
00114 }
00120 inline NTuple (T const *const components)
00121 {
00122 ASSERT1(components != NULL);
00123 #if defined(XRB_NTUPLE_USES_MEMCPY)
00124 memcpy(m, components, sizeof(T) * size);
00125 #else
00126 for (Uint32 i = 0; i < size; ++i)
00127 m[i] = components[i];
00128 #endif
00129 }
00133 inline NTuple (NTuple<T, size> const &source)
00134 {
00135 #if defined(XRB_NTUPLE_USES_MEMCPY)
00136 memcpy(m, source.m, sizeof(T) * size);
00137 #else
00138 for (Uint32 i = 0; i < size; ++i)
00139 m[i] = source.m[i];
00140 #endif
00141 }
00145 inline ~NTuple ()
00146 {
00147 }
00148
00149
00150
00151
00152
00156 inline void operator = (NTuple<T, size> const &operand)
00157 {
00158 #if defined(XRB_NTUPLE_USES_MEMCPY)
00159 memcpy(m, operand.m, sizeof(T) * size);
00160 #else
00161 for (Uint32 i = 0; i < size; ++i)
00162 m[i] = operand.m[i];
00163 #endif
00164 }
00170 inline bool operator == (NTuple<T, size> const &operand) const
00171 {
00172 #if defined(XRB_NTUPLE_USES_MEMCMP)
00173 return memcmp(m, operand.m, sizeof(T) * size) == 0;
00174 #else
00175 for (Uint32 i = 0; i < size; ++i)
00176 if (m[i] != operand.m[i])
00177 return false;
00178 return true;
00179 #endif
00180 }
00186 inline bool operator != (NTuple<T, size> const &operand) const
00187 {
00188 #if defined(XRB_NTUPLE_USES_MEMCMP)
00189 return memcmp(m, operand.m, sizeof(T) * size) != 0;
00190 #else
00191 for (Uint32 i = 0; i < size; ++i)
00192 if (m[i] != operand.m[i])
00193 return true;
00194 return false;
00195 #endif
00196 }
00203 inline T const &operator [] (Uint32 const index) const
00204 {
00205 ASSERT3(index < size);
00206 return m[index];
00207 }
00214 inline T &operator [] (Uint32 const index)
00215 {
00216 ASSERT3(index < size);
00217 return m[index];
00218 }
00224 inline void operator += (NTuple<T, size> const &operand)
00225 {
00226 for (Uint32 i = 0; i < size; ++i)
00227 m[i] += operand.m[i];
00228 }
00234 inline void operator -= (NTuple<T, size> const &operand)
00235 {
00236 for (Uint32 i = 0; i < size; ++i)
00237 m[i] -= operand.m[i];
00238 }
00246 inline void operator *= (NTuple<T, size> const &operand)
00247 {
00248 for (Uint32 i = 0; i < size; ++i)
00249 m[i] *= operand.m[i];
00250 }
00256 inline void operator *= (T const operand)
00257 {
00258 for (Uint32 i = 0; i < size; ++i)
00259 m[i] *= operand;
00260 }
00269 inline void operator /= (NTuple<T, size> const &operand)
00270 {
00271 for (Uint32 i = 0; i < size; ++i)
00272 m[i] /= operand.m[i];
00273 }
00280 inline void operator /= (T const operand)
00281 {
00282 for (Uint32 i = 0; i < size; ++i)
00283 m[i] /= operand;
00284 }
00288 inline NTuple<T, size> operator - () const
00289 {
00290 NTuple<T, size> retval;
00291 for (Uint32 i = 0; i < size; ++i)
00292 retval.m[i] = -m[i];
00293 return retval;
00294 }
00295
00296
00297
00298
00299
00304 template <typename U>
00305 inline NTuple<U, size> StaticCast () const
00306 {
00307 NTuple<U, size> retval;
00308 for (Uint32 i = 0; i < size; ++i)
00309 retval.m[i] = static_cast<U>(m[i]);
00310 return retval;
00311 }
00312
00313
00314
00315
00316
00320 inline void FillWith (T const fill_with)
00321 {
00322 for (Uint32 i = 0; i < size; ++i)
00323 m[i] = fill_with;
00324 }
00329 inline void Negate ()
00330 {
00331 for (Uint32 i = 0; i < size; ++i)
00332 m[i] = -m[i];
00333 }
00341 inline void SetComponents (
00342 T const component0,
00343 T const component1)
00344 {
00345 ASSERT1(size == 2);
00346 m[0] = component0;
00347 m[1] = component1;
00348 }
00357 inline void SetComponents (
00358 T const component0,
00359 T const component1,
00360 T const component2)
00361 {
00362 ASSERT1(size == 3);
00363 m[0] = component0;
00364 m[1] = component1;
00365 m[2] = component2;
00366 }
00376 inline void SetComponents (
00377 T const component0,
00378 T const component1,
00379 T const component2,
00380 T const component3)
00381 {
00382 ASSERT1(size == 4);
00383 m[0] = component0;
00384 m[1] = component1;
00385 m[2] = component2;
00386 m[3] = component3;
00387 }
00394 inline void SetComponents (T const *const components)
00395 {
00396 ASSERT1(components != NULL);
00397 #if defined(XRB_NTUPLE_USES_MEMCPY)
00398 memcpy(m, components, sizeof(T) * size);
00399 #else
00400 for (Uint32 i = 0; i < size; ++i)
00401 m[i] = components[i];
00402 #endif
00403 }
00409 template <typename U>
00410 inline void StaticCastAssign (NTuple<U, size> const &source)
00411 {
00412 for (Uint32 i = 0; i < size; ++i)
00413 m[i] = static_cast<T>(source.m[i]);
00414 }
00415
00416
00417
00418
00419
00432 void Fprint (FILE *const fptr,
00433 char const *const component_printf_format,
00434 bool const add_newline = true) const
00435 {
00436 fprintf(fptr, "%uTuple = (", size);
00437 Uint32 i;
00438 for (i = 0; i < size-1; ++i)
00439 {
00440 fprintf(fptr, component_printf_format, m[i]);
00441 fprintf(fptr, ", ");
00442 }
00443 ASSERT1(i == size-1);
00444 fprintf(fptr, component_printf_format, m[i]);
00445 fprintf(fptr, ")%c", add_newline ? '\n' : '\0');
00446 }
00447
00448 };
00449
00456 template <typename T, Uint32 size>
00457 inline NTuple<T, size> operator + (
00458 NTuple<T, size> const &left_operand,
00459 NTuple<T, size> const &right_operand)
00460 {
00461 NTuple<T, size> retval;
00462 for (Uint32 i = 0; i < size; ++i)
00463 retval.m[i] = left_operand.m[i] + right_operand.m[i];
00464 return retval;
00465 }
00466
00473 template <typename T, Uint32 size>
00474 inline NTuple<T, size> operator - (
00475 NTuple<T, size> const &left_operand,
00476 NTuple<T, size> const &right_operand)
00477 {
00478 NTuple<T, size> retval;
00479 for (Uint32 i = 0; i < size; ++i)
00480 retval.m[i] = left_operand.m[i] - right_operand.m[i];
00481 return retval;
00482 }
00483
00492 template <typename T, Uint32 size>
00493 inline NTuple<T, size> operator * (
00494 NTuple<T, size> const &left_operand,
00495 NTuple<T, size> const &right_operand)
00496 {
00497 NTuple<T, size> retval;
00498 for (Uint32 i = 0; i < size; ++i)
00499 retval.m[i] = left_operand.m[i] * right_operand.m[i];
00500 return retval;
00501 }
00502
00510 template <typename T, Uint32 size>
00511 inline NTuple<T, size> operator * (
00512 T const left_operand,
00513 NTuple<T, size> const &right_operand)
00514 {
00515 NTuple<T, size> retval;
00516 for (Uint32 i = 0; i < size; ++i)
00517 retval.m[i] = left_operand * right_operand.m[i];
00518 return retval;
00519 }
00520
00528 template <typename T, Uint32 size>
00529 inline NTuple<T, size> operator * (
00530 NTuple<T, size> const &left_operand,
00531 T const right_operand)
00532 {
00533 NTuple<T, size> retval;
00534 for (Uint32 i = 0; i < size; ++i)
00535 retval.m[i] = left_operand.m[i] * right_operand;
00536 return retval;
00537 }
00538
00548 template <typename T, Uint32 size>
00549 inline NTuple<T, size> operator / (
00550 NTuple<T, size> const &left_operand,
00551 NTuple<T, size> const &right_operand)
00552 {
00553 NTuple<T, size> retval;
00554 for (Uint32 i = 0; i < size; ++i)
00555 retval.m[i] = left_operand.m[i] / right_operand.m[i];
00556 return retval;
00557 }
00558
00568 template <typename T, Uint32 size>
00569 inline NTuple<T, size> operator / (
00570 T const left_operand,
00571 NTuple<T, size> const &right_operand)
00572 {
00573 NTuple<T, size> retval;
00574 for (Uint32 i = 0; i < size; ++i)
00575 retval.m[i] = left_operand / right_operand.m[i];
00576 return retval;
00577 }
00578
00587 template <typename T, Uint32 size>
00588 inline NTuple<T, size> operator / (
00589 NTuple<T, size> const &left_operand,
00590 T const right_operand)
00591 {
00592 NTuple<T, size> retval;
00593 for (Uint32 i = 0; i < size; ++i)
00594 retval.m[i] = left_operand.m[i] / right_operand;
00595 return retval;
00596 }
00597
00598
00599
00600
00601
00602
00606 typedef NTuple<bool, 2> Bool2;
00610 typedef NTuple<Alignment, 2> Alignment2;
00611
00620 void Fprint (
00621 FILE *fptr,
00622 Bool2 const &ntuple,
00623 bool add_newline = true);
00632 void Fprint (
00633 FILE *fptr,
00634 Alignment2 const &ntuple,
00635 bool add_newline = true);
00636
00637 }
00638
00639 #endif // !defined(_XRB_NTUPLE_HPP_)
00640