gsl_vector.hh
Go to the documentation of this file.
1 /* -*- mia-c++ -*-
2  *
3  * This file is part of MIA - a toolbox for medical image analysis
4  * Copyright (c) Leipzig, Madrid 1999-2016 Gert Wollny
5  *
6  * MIA is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with MIA; if not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 #ifndef GSLPP_VECTOR_HH
22 #define GSLPP_VECTOR_HH
23 
24 
25 #include <iostream>
26 #include <mia/core/gsl_defines.hh>
27 #include <mia/core/gsl_iterator.hh>
28 #include <gsl/gsl_vector.h>
29 
30 namespace gsl {
31 
38 
39 public:
42  typedef size_t size_type;
43  typedef double value_type;
44  typedef double& reference;
45  typedef const double& const_reference;
46  typedef gsl_vector vector_type;
47  typedef gsl_vector *vector_pointer_type;
48  typedef const gsl_vector *vector_const_pointer_type;
49 
53  Vector();
54 
60  Vector(size_type size, bool clear);
61 
62 
68  Vector(size_type size, const double *init);
69 
77  Vector(gsl_vector *holder);
84  Vector(const gsl_vector *holder);
85 
89  Vector(const Vector& other);
90 
94  Vector& operator = (const Vector& other);
95 
97  ~Vector();
98 
102  iterator begin();
103 
107  iterator end();
108 
112  const_iterator begin()const;
113 
117  const_iterator end()const;
118 
122  size_type size() const;
123 
129  value_type operator[](size_t i) const {
130  assert(cdata);
131  return cdata->data[i * cdata->stride];
132  };
133 
139  reference operator[](size_t i) {
140  assert(data);
141  return data->data[i * data->stride];
142  }
143 
145  const gsl_vector * operator ->() const;
146 
148  gsl_vector * operator ->();
149 
151  operator Vector::vector_const_pointer_type () const;
152 
154  operator Vector::vector_pointer_type ();
155 
160  void print(std::ostream& os) const;
161 
162 protected:
163 
164  void reset_holder(gsl_vector *holder){
165  cdata = data = holder;
166  owner = false;
167  }
168 
169  void reset_holder(const gsl_vector *holder){
170  cdata = holder;
171  owner = false;
172  }
173 
174 private:
175  gsl_vector *data;
176  const gsl_vector *cdata;
177  bool owner;
178 };
179 
180 
181 inline Vector operator + (const Vector& lhs, const Vector& rhs)
182 {
183  Vector result(lhs);
184  gsl_vector_add(result, rhs);
185  return result;
186 }
187 
188 inline Vector operator - (const Vector& lhs, const Vector& rhs)
189 {
190  Vector result(lhs);
191  gsl_vector_sub(result, rhs);
192  return result;
193 }
194 
195 inline Vector operator * (const Vector& lhs, double f)
196 {
197  Vector result(lhs);
198  gsl_vector_scale(result, f);
199  return result;
200 }
201 
206 class EXPORT_GSL VectorView :public Vector {
207 public:
208  VectorView(gsl_vector_view vv): m_view(vv)
209  {
210  reset_holder(&m_view.vector);
211  };
212 private:
213  gsl_vector_view m_view;
214 };
215 
216 
222 public:
223  ConstVectorView(gsl_vector_const_view vv):m_view(vv),
224  m_holder(&m_view.vector)
225  {
226 
227  };
228 
230  return m_holder.begin();
231  }
232 
234  return m_holder.end();
235  }
236 
238  return m_holder.size();
239  }
240 
241  double operator[](size_t i)const {
242 
243  return m_holder[i];
244  };
245 
246  operator const Vector&(){
247  return m_holder;
248  }
249 
250  const gsl_vector * operator ->() const{
251  return m_holder.operator ->();
252  }
253 
255  return m_holder.operator Vector::vector_const_pointer_type();
256  }
257 
258 private:
259  gsl_vector_const_view m_view;
260  const Vector m_holder;
261 };
262 
263 inline std::ostream& operator << (std::ostream& os, const Vector& v) {
264  v.print(os);
265  return os;
266 }
267 
268 }
269 
270 #endif
271 
272 
void reset_holder(const gsl_vector *holder)
Definition: gsl_vector.hh:169
Vector::size_type size() const
Definition: gsl_vector.hh:237
Vector::const_iterator end() const
Definition: gsl_vector.hh:233
gsl_vector * vector_pointer_type
Definition: gsl_vector.hh:47
gsl_vector vector_type
Definition: gsl_vector.hh:46
reference operator[](size_t i)
Definition: gsl_vector.hh:139
const gsl_vector * vector_const_pointer_type
Definition: gsl_vector.hh:48
ConstVectorView(gsl_vector_const_view vv)
Definition: gsl_vector.hh:223
vector_iterator operator+(const vector_iterator &it, int dist)
const_vector_iterator const_iterator
Definition: gsl_vector.hh:41
vector_iterator operator-(const vector_iterator &it, int dist)
double value_type
Definition: gsl_vector.hh:43
double operator[](size_t i) const
Definition: gsl_vector.hh:241
double & reference
Definition: gsl_vector.hh:44
void reset_holder(gsl_vector *holder)
Definition: gsl_vector.hh:164
#define EXPORT_GSL
Definition: gsl_defines.hh:38
VectorView(gsl_vector_view vv)
Definition: gsl_vector.hh:208
std::ostream & operator<<(std::ostream &os, const Matrix &m)
Definition: gsl_matrix.hh:425
vector_iterator iterator
Definition: gsl_vector.hh:40
Matrix EXPORT_GSL operator*(const Matrix &lhs, const Matrix &rhs)
value_type operator[](size_t i) const
Definition: gsl_vector.hh:129
size_t size_type
Definition: gsl_vector.hh:42
const double & const_reference
Definition: gsl_vector.hh:45
Vector::const_iterator begin() const
Definition: gsl_vector.hh:229
void print(std::ostream &os) const