/***************************************************************
 * PrVector.h
 *
 * This class provides a sizex1 vector.
 *
 ****************************************************************/

/*
 * modification history
 *----------------------
 *
 * 11/12/97: K.C. Chang: created.
 */

#ifndef _PrVector_h
#define _PrVector_h

#include "PrGlobalDefn.h"

class PrMatrix;

class PrVector
{
  public:
    PrVector(int size);  // initialized to [0]
    PrVector(const PrVector &v);
    ~PrVector();

    PrVector &operator=(const PrVector &v);
    Float &operator[](int i);
    const Float &operator[](int i) const;

    Float &elementAt(int i);
    const Float &elementAt(int i) const;

    void zero();

    int size() const { return size_; };

    PrVector operator-() const;
    void negate(PrVector &dest) const;

    PrVector operator+(const PrVector &v) const;
    void add(const PrVector &v,PrVector &dest) const;
    PrVector operator-(const PrVector &v) const;
    void subtract(const PrVector &v,PrVector &dest) const;
    PrVector operator*(Float s) const;
    void multiply(Float s,PrVector &dest) const;
    PrVector operator*(const PrVector &v) const;
    void multiply(const PrVector &v,PrVector &dest) const;

    PrVector &operator+=(const PrVector &v);
    PrVector &operator-=(const PrVector &v);
    PrVector &operator*=(Float s);

    PrMatrix multiplyTransposed(const PrVector &v) const;
    void multiplyTransposed(const PrVector &v,PrMatrix &dest) const;

    Float dot(const PrVector &v) const;

    Float magnitude() const;

    void normalize();

    void display(char *name=NULL);

  private:
    int size_;
    Float *data_;

    void AssertDimension(const PrVector& v) const;
};

#endif // _PrVector_h
