/*============================================================================= File: vector.h Purpose: Revision: $Id: vector.h,v 1.2 2002/05/13 21:07:45 philosophil Exp $ Created by: Philippe Lavoie (3 Oct, 1996) Modified by: Copyright notice: Copyright (C) 1996-1998 Philippe Lavoie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =============================================================================*/ #ifndef _Matrix_vector_h_ #define _Matrix_vector_h_ #include #include "barray.h" #include "specialType.h" // Predefining every friend functions // This is required by latest ISO C++ draft /*! */ namespace PLib { template class Vector ; template Vector operator+(const Vector&, const Vector&); template Vector operator-(const Vector&, const Vector&); template T operator*(const Vector&,const Vector&); template Vector operator*(const Vector& v, const double d); template Vector operator*(const Vector& v, const Complex d); template Vector operator*(const double d,const Vector& v) ; template Vector operator*(const Complex d,const Vector& v) ; template<> Vector operator*(const Vector& v, const double d); template <> Vector operator*(const Vector& v, const Complex d); template int operator==(const Vector&,const Vector&); template int operator!=(const Vector& a,const Vector& b); /*! \brief A template vector class A simple vector class with basic linear algebraic vector operators defined. \author Philippe Lavoie \date 4 Oct. 1996 */ template class Vector : public BasicArray { public: int rows() const //!< a reference to the size of the vector { return this->sze ;} Vector() : BasicArray(1) {} //!< Basic constructor Vector(const int r) : BasicArray(r) {} Vector(const Vector& v) : BasicArray(v) {} Vector(const BasicArray& v) : BasicArray(v) {} Vector(T* ap, const int size) : BasicArray(ap,size) {} Vector(BasicList& list) : BasicArray(list) {} virtual ~Vector() {} Vector& operator=(const Vector& v); Vector& operator=(const BasicArray& b); Vector& operator+=(const Vector& a); Vector& operator-=(const Vector& a); T operator=(const T d); void as(int i, const Vector& b); Vector get(int i, int l); int minIndex() const ; T minimum() const { return operator[](minIndex()) ; } // returns the minimal value inside the vector void qSortStd() ; void qSort(int M=7) ; void sortIndex(Vector& index, int M=7) const; #ifdef HAVE_ISO_FRIEND_DECL friend Vector operator+ <>(const Vector &a, const Vector &b); friend Vector operator- <>(const Vector &a, const Vector &b); friend T operator* <>(const Vector &a,const Vector &b); friend Vector operator* <>(const Vector& v, const double d); friend Vector operator* <>(const Vector& v, const Complex d); friend Vector operator* <>(const double d,const Vector& v) ; friend Vector operator* <>(const Complex d,const Vector& v) ; friend int operator== <>(const Vector &a,const Vector &b); friend int operator!= <>(const Vector& a,const Vector& b); #else friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator-(const Vector &a, const Vector &b); friend T operator* (const Vector &a,const Vector &b); friend Vector operator*(const Vector& v, const double d); friend Vector operator*(const Vector& v, const Complex d); friend Vector operator*(const double d,const Vector& v) ; friend Vector operator*(const Complex d,const Vector& v) ; friend int operator==(const Vector &a,const Vector &b); friend int operator!=(const Vector& a,const Vector& b); #endif }; template inline int operator!=(const Vector& a, const Vector& b) //!< The inequality operator { return (a==b)?0:1 ; } template inline Vector operator*(const double d, const Vector& v) //!< Multiplies by a double { return v*d ; } template inline Vector operator*(const Complex d, const Vector& v) //!< Multiplies by a Comples { return v*d ; } } // end namespace typedef PLib::Vector Vector_INT ; typedef PLib::Vector Vector_BYTE ; typedef PLib::Vector Vector_FLOAT ; typedef PLib::Vector Vector_DOUBLE ; typedef PLib::Vector Vector_COMPLEX ; typedef PLib::Vector Vector_UBYTE ; typedef PLib::Vector Vector_HPoint3Df; typedef PLib::Vector Vector_Point3Df ; typedef PLib::Vector Vector_HPoint3Dd; typedef PLib::Vector Vector_Point3Dd ; typedef PLib::Vector Vector_HPoint2Df; typedef PLib::Vector Vector_Point2Df ; typedef PLib::Vector Vector_HPoint2Dd; typedef PLib::Vector Vector_Point2Dd ; typedef PLib::Vector PlVector_int ; typedef PLib::Vector PlVector_byte ; typedef PLib::Vector PlVector_float ; typedef PLib::Vector PlVector_double ; typedef PLib::Vector PlVector_complex ; typedef PLib::Vector PlVector_ubyte ; typedef PLib::Vector PlVector_HPoint3Df; typedef PLib::Vector PlVector_Point3Df ; typedef PLib::Vector PlVector_HPoint3Dd; typedef PLib::Vector PlVector_Point3Dd ; typedef PLib::Vector PlVector_HPoint2Df; typedef PLib::Vector PlVector_Point2Df ; typedef PLib::Vector PlVector_HPoint2Dd; typedef PLib::Vector PlVector_Point2Dd ; #ifdef INCLUDE_TEMPLATE_SOURCE #include "vector.cpp" #endif #endif