/* * Add support for overloaded operators */ %warnfilter(389) Amanith::GVectBase::operator[]; %warnfilter(389) Amanith::GMatrix::operator[]; %warnfilter(389) Amanith::GQuat::operator[]; %define VECTOR_OPERATORS(ELEMENTS) %extend Amanith::GVect { GReal __getitem__(int i) const { if ((i < 0) || (i > (ELEMENTS - 1))) { SWIG_Error(SWIG_IndexError, "Index out of range"); return 0; } return self->Data()[i]; } void __setitem__(int i, GReal value) { if ((i < 0) || (i > (ELEMENTS - 1))) { SWIG_Error(SWIG_IndexError, "Index out of range"); return; } (*self)[i] = value; } }; %enddef VECTOR_OPERATORS(2); VECTOR_OPERATORS(3); VECTOR_OPERATORS(4); /* * Quaternions */ %extend Amanith::GQuat { GReal __getitem__(int i) const { if ((i < 0) || (i > 4)) { SWIG_Error(SWIG_IndexError, "Index out of range"); return 0; } return self->Data()[i]; } void __setitem__(int i, GReal value) { if ((i < 0) || (i > 4)) { SWIG_Error(SWIG_IndexError, "Index out of range"); return; } (*self)[i] = value; } }; /* * With matrices the column and row indices are given via vectors. */ %include "std_vector.i" namespace std { %template(CoordVector) vector; } %define MATRIX_OPERATORS(ROWS, COLS) %extend Amanith::GMatrix { GReal __getitem__(const std::vector& c) const { return (*self)[c[0]][c[1]]; } void __setitem__(const std::vector& c, GReal value) { (*self)[c[0]][c[1]] = value; } }; %enddef MATRIX_OPERATORS(2, 2); MATRIX_OPERATORS(2, 3); MATRIX_OPERATORS(3, 3); MATRIX_OPERATORS(3, 4); MATRIX_OPERATORS(4, 3); MATRIX_OPERATORS(4, 4);