#ifndef CPL_VECTOR_HPP
#define CPL_VECTOR_HPP

#include <iostream>

namespace cpl {

class Vector {
  public:

    Vector(int dim = 1);

    Vector(double v0, double v1);

    Vector(double v0, double v1, double v2);

    Vector(const Vector& dv);

    ~Vector() { delete [] v; }

    int dimension() const { return dim; }

    int size() const { return dim; }

    void resize(const int);

    void push_back(const double);

    void set(const double, ...);

    const double operator[](const int i) const { return v[i]; }

    double& operator[](const int i) { return v[i]; }

    Vector& operator = (const Vector& dv);

    Vector& operator += (const Vector& dv);

    Vector& operator -= (const Vector& dv);

    Vector& operator *= (double d);

    Vector& operator /= (double d);

    double abs();

    double norm();

    double dot(const Vector& dv);

    friend std::ostream& operator<<(std::ostream& os, const Vector& dv);

  private:
    int dim;
    double *v;
};

inline Vector operator + (const Vector& dv) {
    return dv;
}

extern Vector operator - (const Vector& dv);

extern Vector operator * (const Vector& dv, double d);

extern Vector operator * (double d, const Vector& dv);

extern Vector operator / (const Vector& dv, double d);

extern Vector operator + (const Vector& v1, const Vector& v2);

extern Vector operator - (const Vector& v1, const Vector& v2);

extern double dot(const Vector& v1, const Vector& v2);

} /* end namespace cpl */

#endif /* CPL_VECTOR_HPP */
