home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / incl / vector.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  3.7 KB  |  153 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  vector.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. //------------------------------------------------------------------------------
  18. //  vectors and matrices
  19. //
  20. //  Stefan Naeher (1988)
  21. //------------------------------------------------------------------------------
  22.  
  23. #ifndef VECTOR_REPH
  24. #define VECTOR_REPH
  25.  
  26. #include <LEDA/basic.h>
  27.  
  28. #ifndef VEC_DEFAULT_DIM
  29. #define VEC_DEFAULT_DIM 2
  30. #endif
  31.  
  32.  
  33. struct vector_rep{
  34.  
  35.    double* v;
  36.    int dim;
  37.  
  38. public:
  39.  
  40.  vector_rep(int); 
  41.  vector_rep(vector_rep*); 
  42.  
  43. ~vector_rep() { if (v) delete v; }
  44.  
  45. OPERATOR_NEW(2)
  46. OPERATOR_DEL(2)
  47.  
  48. };
  49.  
  50.  
  51. class vector{
  52.  
  53. friend class matrix_rep;
  54. friend class matrix;
  55.  
  56. vector_rep* ptr;
  57.  
  58. void check_dimensions(const vector&) const;
  59.  
  60. public:
  61.  
  62.  
  63. vector()      { ptr = new vector_rep(VEC_DEFAULT_DIM); }
  64. vector(int d) { ptr = new vector_rep(d);               }
  65.  
  66. vector(double, double);
  67. vector(double, double, double);
  68. vector(const vector&);
  69.  
  70. vector(void* p)  { ptr = new vector_rep((vector_rep*)p); }
  71.  
  72. void clear()     { delete ptr; }
  73.  
  74. ~vector()        { clear(); }
  75.  
  76.  
  77.  
  78. double length() const;
  79.  
  80. int    dim()    const { return ptr->dim; }
  81. vector norm()   const { return *this/length(); }
  82.  
  83. double angle(const vector&) const; 
  84.  
  85. vector& operator=(const vector&);
  86.  
  87. double& operator[](int);
  88.  
  89. double  operator[](int) const;
  90.  
  91. vector  operator+(const vector&) const;
  92. vector  operator-(const vector&) const;
  93. vector  operator*(double)        const;
  94. vector  operator/(double)        const;
  95. double  operator*(const vector&) const;
  96.  
  97. int     operator==(const vector&) const;
  98. int     operator!=(const vector& w)  const { return !(*this == w); }
  99.  
  100. /*
  101. friend vector operator*(double f, const vector& v);
  102. friend vector operator/(const vector& v, double f)}
  103.  
  104. omitted, because of error in cfront's type conversion algorithm
  105.  
  106. otherwise  (real) * (double f) is ambiguous a) ---> (double) * (double)
  107.                                             b) ---> (double) * (vector)
  108.  
  109. and        (double f) / (real) is ambiguous a) ---> (double) * (double)
  110.                                             b) ---> (vector) * (double)
  111.  
  112. Unbelievable, but true: if f is an inline function returning a double 
  113. it may be converted to a vector using the "vector(int)" constructor!!!
  114. */
  115.  
  116.  
  117. friend ostream& operator<<(ostream& o, const vector& v);
  118. friend istream& operator>>(istream& i, vector& v);
  119.  
  120. friend void Print(vector& v, ostream& out=cout) { out << v; } 
  121. friend void Read(vector& v, istream& in=cin)  { in >> v; }
  122.  
  123. friend void Clear(vector& v)       { v.clear(); }
  124. friend ent  Copy(const vector& v)  { return ent(new vector_rep(v.ptr)); }
  125. friend ent  Init(vector& v)  { return ent(new vector_rep(v.ptr)); }
  126. friend ent  Ent(vector& v)   { return ent(v.ptr); }
  127.  
  128. friend int  compare(vector& x, vector& y) { return int(x.ptr) - int(y.ptr); }
  129.  
  130. };
  131.  
  132.  
  133. //------------------------------------------------------------------------------
  134. // VECTOR(cmp): vector with user defined linear order cmp
  135. //------------------------------------------------------------------------------
  136.  
  137. #define VECTOR(cmp) name2(vector_,cmp)
  138.  
  139. #define VECTORdeclare(cmp)\
  140. struct VECTOR(cmp) : public vector \
  141. {  VECTOR(cmp)(ent p)          :vector(p) {}\
  142.    VECTOR(cmp)(double r)       :vector(r) {}\
  143.    VECTOR(cmp)(vector  r )     :vector(r) {}\
  144.    VECTOR(cmp)(const VECTOR(cmp)& r) :vector(r) {}\
  145.    VECTOR(cmp)() {}\
  146.  ~ VECTOR(cmp)() {}\
  147. };\
  148. \
  149. int compare(VECTOR(cmp)& x, VECTOR(cmp)& y) { return cmp(x,y); }
  150.  
  151. #endif
  152.