home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + vector.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
- //------------------------------------------------------------------------------
- // vectors and matrices
- //
- // Stefan Naeher (1988)
- //------------------------------------------------------------------------------
-
- #ifndef VECTOR_REPH
- #define VECTOR_REPH
-
- #include <LEDA/basic.h>
-
- #ifndef VEC_DEFAULT_DIM
- #define VEC_DEFAULT_DIM 2
- #endif
-
-
- struct vector_rep{
-
- double* v;
- int dim;
-
- public:
-
- vector_rep(int);
- vector_rep(vector_rep*);
-
- ~vector_rep() { if (v) delete v; }
-
- OPERATOR_NEW(2)
- OPERATOR_DEL(2)
-
- };
-
-
- class vector{
-
- friend class matrix_rep;
- friend class matrix;
-
- vector_rep* ptr;
-
- void check_dimensions(const vector&) const;
-
- public:
-
-
- vector() { ptr = new vector_rep(VEC_DEFAULT_DIM); }
- vector(int d) { ptr = new vector_rep(d); }
-
- vector(double, double);
- vector(double, double, double);
- vector(const vector&);
-
- vector(void* p) { ptr = new vector_rep((vector_rep*)p); }
-
- void clear() { delete ptr; }
-
- ~vector() { clear(); }
-
-
-
- double length() const;
-
- int dim() const { return ptr->dim; }
- vector norm() const { return *this/length(); }
-
- double angle(const vector&) const;
-
- vector& operator=(const vector&);
-
- double& operator[](int);
-
- double operator[](int) const;
-
- vector operator+(const vector&) const;
- vector operator-(const vector&) const;
- vector operator*(double) const;
- vector operator/(double) const;
- double operator*(const vector&) const;
-
- int operator==(const vector&) const;
- int operator!=(const vector& w) const { return !(*this == w); }
-
- /*
- friend vector operator*(double f, const vector& v);
- friend vector operator/(const vector& v, double f)}
-
- omitted, because of error in cfront's type conversion algorithm
-
- otherwise (real) * (double f) is ambiguous a) ---> (double) * (double)
- b) ---> (double) * (vector)
-
- and (double f) / (real) is ambiguous a) ---> (double) * (double)
- b) ---> (vector) * (double)
-
- Unbelievable, but true: if f is an inline function returning a double
- it may be converted to a vector using the "vector(int)" constructor!!!
- */
-
-
- friend ostream& operator<<(ostream& o, const vector& v);
- friend istream& operator>>(istream& i, vector& v);
-
- friend void Print(vector& v, ostream& out=cout) { out << v; }
- friend void Read(vector& v, istream& in=cin) { in >> v; }
-
- friend void Clear(vector& v) { v.clear(); }
- friend ent Copy(const vector& v) { return ent(new vector_rep(v.ptr)); }
- friend ent Init(vector& v) { return ent(new vector_rep(v.ptr)); }
- friend ent Ent(vector& v) { return ent(v.ptr); }
-
- friend int compare(vector& x, vector& y) { return int(x.ptr) - int(y.ptr); }
-
- };
-
-
- //------------------------------------------------------------------------------
- // VECTOR(cmp): vector with user defined linear order cmp
- //------------------------------------------------------------------------------
-
- #define VECTOR(cmp) name2(vector_,cmp)
-
- #define VECTORdeclare(cmp)\
- struct VECTOR(cmp) : public vector \
- { VECTOR(cmp)(ent p) :vector(p) {}\
- VECTOR(cmp)(double r) :vector(r) {}\
- VECTOR(cmp)(vector r ) :vector(r) {}\
- VECTOR(cmp)(const VECTOR(cmp)& r) :vector(r) {}\
- VECTOR(cmp)() {}\
- ~ VECTOR(cmp)() {}\
- };\
- \
- int compare(VECTOR(cmp)& x, VECTOR(cmp)& y) { return cmp(x,y); }
-
- #endif
-