#ifndef __PFCK_UDVECT_H
#define __PFCK_UDVECT_H

#include "math.h"


class Udvect2 {
  public:
    double x;
    double y;
  public:
    Udvect2(void);
    Udvect2(double x1,double y1);
    Udvect2(const Udvect2 &v2);
    const double &X(void) const;
    const double &Y(void) const;
    void X(const double &t);
    void Y(const double &t);
    void Set(double x1,double y1);
    void Fill(double x1);
    Udvect2 operator +(const Udvect2 &t2) const;
    void operator +=(const Udvect2 &t2);
    Udvect2 operator -(const Udvect2 &t2) const;
    void operator -=(const Udvect2 &t2);
    Udvect2 operator *(const double &t) const;
    void operator *=(const double &t);
    Udvect2 operator /(const double &t) const;
    void operator /=(const double &t);
    double operator &(const Udvect2 &t2) const;
    double operator |(const Udvect2 &t2) const;
    double &operator[](int i);
    const double &operator[](int i) const;
    bool operator ==(const Udvect2 &t2) const;
    bool operator !=(const Udvect2 &t2) const;
    Udvect2 &operator =(const Udvect2 &t2);
};


class Udvect3 {
  public:
    double x;
    double y;
    double z;
  public:
    Udvect3(void);
    Udvect3(double x1,double y1,double z1);
    Udvect3(const Udvect3 &v3);
    const double &X(void) const;
    const double &Y(void) const;
    const double &Z(void) const;
    void X(const double &t);
    void Y(const double &t);
    void Z(const double &t);
    void Set(double x1,double y1,double z1);
    void Fill(double x1);
    Udvect3 operator +(const Udvect3 &t3) const;
    void operator +=(const Udvect3 &t3);
    Udvect3 operator -(const Udvect3 &t3) const;
    void operator -=(const Udvect3 &t3);
    Udvect3 operator *(const double &t) const;
    void operator *=(const double &t);
    Udvect3 operator /(const double &t) const;
    void operator /=(const double &t);
    Udvect3 operator &(const Udvect3 &t3) const;
    double operator |(const Udvect3 &t3) const;
    double &operator[](int i);
    const double &operator[](int i) const;
    bool operator ==(const Udvect3 &t3) const;
    bool operator !=(const Udvect3 &t3) const;
    Udvect3 &operator =(const Udvect3 &t3);
};

inline double Mag(const Udvect2 &v2) { return sqrt(v2.x*v2.x + v2.y*v2.y); }
inline double Mag(const Udvect3 &v3) { return sqrt(v3.x*v3.x+v3.y*v3.y+v3.z*v3.z); }    

#if DIM == 2
typedef Udvect2 Udvect;
#elif DIM == 3
typedef Udvect3 Udvect;
#endif


#endif