/*************************************************************************** * blitz/tinyvec.h Declaration of the TinyVector class * * $Id: tinyvec.h,v 1.1.1.1 1999-04-09 17:59:01 ansari Exp $ * * Copyright (C) 1997,1998 Todd Veldhuizen * * 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 2 * 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. * * Suggestions: blitz-suggest@cybervision.com * Bugs: blitz-bugs@cybervision.com * * For more information, please see the Blitz++ Home Page: * http://seurat.uwaterloo.ca/blitz/ * *************************************************************************** * $Log: not supported by cvs2svn $ * Revision 1.2 1998/03/14 00:04:47 tveldhui * 0.2-alpha-05 * * Revision 1.1 1997/07/16 14:51:20 tveldhui * Update: Alpha release 0.2 (Arrays) * */ #ifndef BZ_TINYVEC_H #define BZ_TINYVEC_H #ifndef BZ_BLITZ_H #include #endif #ifndef BZ_RANGE_H #include #endif #ifndef BZ_LISTINIT_H #include #endif #include BZ_NAMESPACE(blitz) /***************************************************************************** * Forward declarations */ template class TinyVectorIter; template class TinyVectorIterConst; template class Vector; template class _bz_VecExpr; template class Random; template class VectorPick; template class _bz_matrixVectorProduct; /***************************************************************************** * Declaration of class TinyVector */ template class TinyVector { public: ////////////////////////////////////////////// // Public Types ////////////////////////////////////////////// typedef P_numtype T_numtype; typedef TinyVector T_vector; typedef TinyVectorIter T_iterator; typedef TinyVectorIterConst T_constIterator; enum { numElements = N_length }; TinyVector() { } ~TinyVector() { } inline TinyVector(const TinyVector& x); inline TinyVector(T_numtype initValue); TinyVector(T_numtype x0, T_numtype x1) { data_[0] = x0; data_[1] = x1; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2) { data_[0] = x0; data_[1] = x1; data_[2] = x2; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; data_[6] = x6; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6, T_numtype x7) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; data_[6] = x6; data_[7] = x7; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6, T_numtype x7, T_numtype x8) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; data_[6] = x6; data_[7] = x7; data_[8] = x8; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6, T_numtype x7, T_numtype x8, T_numtype x9) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; data_[6] = x6; data_[7] = x7; data_[8] = x8; data_[9] = x9; } TinyVector(T_numtype x0, T_numtype x1, T_numtype x2, T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6, T_numtype x7, T_numtype x8, T_numtype x9, T_numtype x10) { data_[0] = x0; data_[1] = x1; data_[2] = x2; data_[3] = x3; data_[4] = x4; data_[5] = x5; data_[6] = x6; data_[7] = x7; data_[8] = x8; data_[9] = x9; data_[10] = x10; } T_iterator begin() { return T_iterator(*this); } T_constIterator begin() const { return T_constIterator(*this); } // T_iterator end(); // T_constIterator end() const; T_numtype * _bz_restrict data() { return data_; } const T_numtype * _bz_restrict data() const { return data_; } T_numtype * _bz_restrict dataFirst() { return data_; } const T_numtype * _bz_restrict dataFirst() const { return data_; } unsigned length() const { return N_length; } ///////////////////////////////////////////// // Library-internal member functions // These are undocumented and may change or // disappear in future releases. ///////////////////////////////////////////// unsigned _bz_suggestLength() const { return N_length; } _bz_bool _bz_hasFastAccess() const { return _bz_true; } T_numtype& _bz_restrict _bz_fastAccess(unsigned i) { return data_[i]; } T_numtype _bz_fastAccess(unsigned i) const { return data_[i]; } template void _bz_assign(P_expr, P_updater); _bz_VecExpr _bz_asVecExpr() const { return _bz_VecExpr(begin()); } ////////////////////////////////////////////// // Subscripting operators ////////////////////////////////////////////// int lengthCheck(unsigned i) const { BZPRECHECK(i < N_length, "TinyVector<" << BZ_DEBUG_TEMPLATE_AS_STRING_LITERAL(T_numtype) << "," << N_length << "> index out of bounds: " << i); return 1; } T_numtype operator()(unsigned i) const { BZPRECONDITION(lengthCheck(i)); return data_[i]; } T_numtype& _bz_restrict operator()(unsigned i) { BZPRECONDITION(lengthCheck(i)); return data_[i]; } T_numtype operator[](unsigned i) const { BZPRECONDITION(lengthCheck(i)); return data_[i]; } T_numtype& _bz_restrict operator[](unsigned i) { BZPRECONDITION(lengthCheck(i)); return data_[i]; } ////////////////////////////////////////////// // Assignment operators ////////////////////////////////////////////// // Scalar operand ListInitializationSwitch operator=(T_numtype x) { return ListInitializationSwitch(*this, x); } T_vector& initialize(T_numtype); T_vector& operator+=(T_numtype); T_vector& operator-=(T_numtype); T_vector& operator*=(T_numtype); T_vector& operator/=(T_numtype); T_vector& operator%=(T_numtype); T_vector& operator^=(T_numtype); T_vector& operator&=(T_numtype); T_vector& operator|=(T_numtype); T_vector& operator>>=(int); T_vector& operator<<=(int); template T_vector& operator=(const TinyVector &); template T_vector& operator+=(const TinyVector &); template T_vector& operator-=(const TinyVector &); template T_vector& operator*=(const TinyVector &); template T_vector& operator/=(const TinyVector &); template T_vector& operator%=(const TinyVector &); template T_vector& operator^=(const TinyVector &); template T_vector& operator&=(const TinyVector &); template T_vector& operator|=(const TinyVector &); template T_vector& operator>>=(const TinyVector &); template T_vector& operator<<=(const TinyVector &); template T_vector& operator=(const Vector &); template T_vector& operator+=(const Vector &); template T_vector& operator-=(const Vector &); template T_vector& operator*=(const Vector &); template T_vector& operator/=(const Vector &); template T_vector& operator%=(const Vector &); template T_vector& operator^=(const Vector &); template T_vector& operator&=(const Vector &); template T_vector& operator|=(const Vector &); template T_vector& operator>>=(const Vector &); template T_vector& operator<<=(const Vector &); // Vector expression operand template T_vector& operator=(_bz_VecExpr); template T_vector& operator+=(_bz_VecExpr); template T_vector& operator-=(_bz_VecExpr); template T_vector& operator*=(_bz_VecExpr); template T_vector& operator/=(_bz_VecExpr); template T_vector& operator%=(_bz_VecExpr); template T_vector& operator^=(_bz_VecExpr); template T_vector& operator&=(_bz_VecExpr); template T_vector& operator|=(_bz_VecExpr); template T_vector& operator>>=(_bz_VecExpr); template T_vector& operator<<=(_bz_VecExpr); // VectorPick operand template T_vector& operator=(const VectorPick &); template T_vector& operator+=(const VectorPick &); template T_vector& operator-=(const VectorPick &); template T_vector& operator*=(const VectorPick &); template T_vector& operator/=(const VectorPick &); template T_vector& operator%=(const VectorPick &); template T_vector& operator^=(const VectorPick &); template T_vector& operator&=(const VectorPick &); template T_vector& operator|=(const VectorPick &); template T_vector& operator>>=(const VectorPick &); template T_vector& operator<<=(const VectorPick &); // Range operand T_vector& operator=(Range); T_vector& operator+=(Range); T_vector& operator-=(Range); T_vector& operator*=(Range); T_vector& operator/=(Range); T_vector& operator%=(Range); T_vector& operator^=(Range); T_vector& operator&=(Range); T_vector& operator|=(Range); T_vector& operator>>=(Range); T_vector& operator<<=(Range); T_numtype* _bz_restrict getInitializationIterator() { return dataFirst(); } private: T_numtype data_[N_length]; }; BZ_NAMESPACE_END #include // Iterators #include // Global functions #include // Expression templates #include // Member functions #include // I/O functions #endif // BZ_TINYVEC_H