diff --git a/libraries/AP_Math/math_assert.h b/libraries/AP_Math/math_assert.h new file mode 100644 index 0000000000..f84a10114e --- /dev/null +++ b/libraries/AP_Math/math_assert.h @@ -0,0 +1,16 @@ +/* + this can be used to check array indexes in vectors and matrices + */ + +#ifndef MATH_ASSERT_H +#define MATH_ASSERT_H + +#if MATH_CHECK_INDEXES +#include +#define ASSERT(x) assert(x) +#else +#define ASSERT(x) do {} while(0) +#endif + +#endif // MATH_ASSERT_H + diff --git a/libraries/AP_Math/matrix3.h b/libraries/AP_Math/matrix3.h index 21618d1da3..3d8fcb5a37 100644 --- a/libraries/AP_Math/matrix3.h +++ b/libraries/AP_Math/matrix3.h @@ -128,6 +128,13 @@ public: // allow a Matrix3 to be used as an array of vectors, 0 indexed Vector3 & operator[](uint8_t i) { Vector3 *_v = &a; + ASSERT(i >= 0 && i < 3); + return _v[i]; + } + + const Vector3 & operator[](uint8_t i) const { + const Vector3 *_v = &a; + ASSERT(i >= 0 && i < 3); return _v[i]; } diff --git a/libraries/AP_Math/quaternion.h b/libraries/AP_Math/quaternion.h index ea34180c25..4497d9ffe7 100644 --- a/libraries/AP_Math/quaternion.h +++ b/libraries/AP_Math/quaternion.h @@ -60,5 +60,18 @@ public: // create eulers from a quaternion void to_euler(float *roll, float *pitch, float *yaw); + + // allow a quaternion to be used as an array, 0 indexed + float & operator[](uint8_t i) { + float *_v = &q1; + ASSERT(i >= 0 && i < 4); + return _v[i]; + } + + const float & operator[](uint8_t i) const { + const float *_v = &q1; + ASSERT(i >= 0 && i < 4); + return _v[i]; + } }; #endif // QUATERNION_H diff --git a/libraries/AP_Math/vector3.h b/libraries/AP_Math/vector3.h index 403b62e50b..d6385d4a12 100644 --- a/libraries/AP_Math/vector3.h +++ b/libraries/AP_Math/vector3.h @@ -52,6 +52,7 @@ #include #include +#include "math_assert.h" template class Matrix3; @@ -114,6 +115,13 @@ public: // allow a vector3 to be used as an array, 0 indexed T & operator[](uint8_t i) { T *_v = &x; + ASSERT(i >= 0 && i < 3); + return _v[i]; + } + + const T & operator[](uint8_t i) const { + const T *_v = &x; + ASSERT(i >= 0 && i < 3); return _v[i]; } diff --git a/libraries/AP_Math/vectorN.h b/libraries/AP_Math/vectorN.h new file mode 100644 index 0000000000..a3652717b5 --- /dev/null +++ b/libraries/AP_Math/vectorN.h @@ -0,0 +1,53 @@ +// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef VECTORN_H +#define VECTORN_H + +#include +#include +#include "math_assert.h" + +template +class VectorN +{ +public: + // trivial ctor + VectorN() { + memset(_v, 0, sizeof(T)*N); + } + + T & operator[](uint8_t i) { + ASSERT(i >= 0 && i < N); + return _v[i]; + } + + const T & operator[](uint8_t i) const { + ASSERT(i >= 0 && i < N); + return _v[i]; + } + + // zero the vector + void zero() + { + memset(_v, 0, sizeof(T)*N); + } + +private: + T _v[N]; +}; + +#endif // VECTORN_H