1 | /*
|
---|
2 | * VectorContent.hpp
|
---|
3 | *
|
---|
4 | * Created on: Jul 2, 2010
|
---|
5 | * Author: crueger
|
---|
6 | */
|
---|
7 |
|
---|
8 | #ifndef VECTORCONTENT_HPP_
|
---|
9 | #define VECTORCONTENT_HPP_
|
---|
10 |
|
---|
11 | /**
|
---|
12 | * !file
|
---|
13 | * The way GSL works does not allow for forward definitions of the structures.
|
---|
14 | * Because of this the pointer to the gsl_vector struct is wrapped inside another
|
---|
15 | * (dumb) object that allows for forward definitions.
|
---|
16 | *
|
---|
17 | * DO NOT USE OUTSIDE OF VECTOR UNLESS YOU ABSOLUTELY HAVE TO AND KNOW WHAT YOU ARE DOING.
|
---|
18 | */
|
---|
19 |
|
---|
20 | #include <iosfwd>
|
---|
21 |
|
---|
22 | #include <gsl/gsl_vector.h>
|
---|
23 |
|
---|
24 | class Vector;
|
---|
25 |
|
---|
26 | /** Dummy structure to create a unique signature.
|
---|
27 | *
|
---|
28 | */
|
---|
29 | struct VectorBaseCase{};
|
---|
30 |
|
---|
31 | class VectorContent{
|
---|
32 | friend std::ostream & operator<< (std::ostream& ost, const VectorContent &m);
|
---|
33 | friend VectorContent const operator*(const VectorContent& a, const double m);
|
---|
34 | friend VectorContent const operator*(const double m, const VectorContent& a);
|
---|
35 | friend VectorContent const operator+(const VectorContent& a, const VectorContent& b);
|
---|
36 | friend VectorContent const operator-(const VectorContent& a, const VectorContent& b);
|
---|
37 |
|
---|
38 | public:
|
---|
39 | explicit VectorContent(size_t _dim);
|
---|
40 | VectorContent(VectorBaseCase);
|
---|
41 | VectorContent(const VectorContent * const src);
|
---|
42 | VectorContent(const VectorContent & src);
|
---|
43 | VectorContent(gsl_vector * _src);
|
---|
44 | virtual ~VectorContent();
|
---|
45 |
|
---|
46 | // Accessing
|
---|
47 | double &at(size_t m);
|
---|
48 | const double at(size_t m) const;
|
---|
49 | double & operator[](size_t i);
|
---|
50 | const double operator[](size_t i) const;
|
---|
51 | double *Pointer(size_t m) const;
|
---|
52 | const double *const_Pointer(size_t m) const;
|
---|
53 |
|
---|
54 | // Assignment operator
|
---|
55 | VectorContent &operator=(const VectorContent& src);
|
---|
56 |
|
---|
57 | // Initializing
|
---|
58 | void setFromDoubleArray(double * x);
|
---|
59 | void setFromVector(Vector &v);
|
---|
60 | void setValue(double x);
|
---|
61 | void setZero();
|
---|
62 | int setBasis(size_t m);
|
---|
63 |
|
---|
64 | // Exchanging elements
|
---|
65 | int SwapElements(size_t i, size_t j);
|
---|
66 | int Reverse();
|
---|
67 |
|
---|
68 | // checking state
|
---|
69 | bool IsZero() const;
|
---|
70 | bool IsOne() const;
|
---|
71 |
|
---|
72 | // properties
|
---|
73 | bool IsNormalTo(const Vector &normal) const;
|
---|
74 | bool IsEqualTo(const Vector &a) const;
|
---|
75 |
|
---|
76 | // properties relative to another VectorContent
|
---|
77 | double DistanceSquared(const VectorContent &y) const;
|
---|
78 | double ScalarProduct(const VectorContent &y) const;
|
---|
79 | double Angle(const VectorContent &y) const;
|
---|
80 |
|
---|
81 | // operators
|
---|
82 | bool operator==(const VectorContent& b) const;
|
---|
83 | const VectorContent& operator+=(const VectorContent& b);
|
---|
84 | const VectorContent& operator-=(const VectorContent& b);
|
---|
85 | const VectorContent& operator*=(const double m);
|
---|
86 | const double operator*(const VectorContent& b);
|
---|
87 |
|
---|
88 | size_t dimension;
|
---|
89 | gsl_vector *content;
|
---|
90 | private:
|
---|
91 | };
|
---|
92 |
|
---|
93 | std::ostream & operator << (std::ostream& ost, const VectorContent &m);
|
---|
94 | VectorContent const operator*(const VectorContent& a, const double m);
|
---|
95 | VectorContent const operator*(const double m, const VectorContent& a);
|
---|
96 | VectorContent const operator+(const VectorContent& a, const VectorContent& b);
|
---|
97 | VectorContent const operator-(const VectorContent& a, const VectorContent& b);
|
---|
98 |
|
---|
99 | /** Vector view.
|
---|
100 | * Extension of VectorContent to contain not a gsl_vector but only a view on a
|
---|
101 | * gsl_vector (or row/column in a gsl_matrix).
|
---|
102 | *
|
---|
103 | * We need the above VectorBaseCase here:
|
---|
104 | * content, i.e. the gsl_vector, must not be allocated, as it is just a view
|
---|
105 | * with an internal gsl_vector_view. Hence, VectorBaseCase is just dummy class
|
---|
106 | * to give the constructor a unique signature.
|
---|
107 | */
|
---|
108 | struct VectorViewContent : public VectorContent
|
---|
109 | {
|
---|
110 | VectorViewContent(gsl_vector_view _view) :
|
---|
111 | VectorContent(VectorBaseCase()),
|
---|
112 | view(_view)
|
---|
113 | {
|
---|
114 | dimension = _view.vector.size;
|
---|
115 | content=&view.vector;
|
---|
116 | }
|
---|
117 | ~VectorViewContent(){
|
---|
118 | content=0;
|
---|
119 | }
|
---|
120 | gsl_vector_view view;
|
---|
121 | };
|
---|
122 |
|
---|
123 | #endif /* VECTORCONTENT_HPP_ */
|
---|