Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
vector.h
Go to the documentation of this file.
1/*
2 * Vector, VectorView, ConstVectorView classes wrap the gsl vector routines;
3 * "views" mimic the semantic of C++ references: any operation performed
4 * on a "view" is actually performed on the "viewed object"
5 *
6 * Authors:
7 * Marco Cecchetti <mrcekets at gmail.com>
8 *
9 * Copyright 2008 authors
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it either under the terms of the GNU Lesser General Public
13 * License version 2.1 as published by the Free Software Foundation
14 * (the "LGPL") or, at your option, under the terms of the Mozilla
15 * Public License Version 1.1 (the "MPL"). If you do not alter this
16 * notice, a recipient may use your version of this file under either
17 * the MPL or the LGPL.
18 *
19 * You should have received a copy of the LGPL along with this library
20 * in the file COPYING-LGPL-2.1; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * You should have received a copy of the MPL along with this library
23 * in the file COPYING-MPL-1.1
24 *
25 * The contents of this file are subject to the Mozilla Public License
26 * Version 1.1 (the "License"); you may not use this file except in
27 * compliance with the License. You may obtain a copy of the License at
28 * http://www.mozilla.org/MPL/
29 *
30 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
31 * OF ANY KIND, either express or implied. See the LGPL or the MPL for
32 * the specific language governing rights and limitations.
33 */
34
35
36
37
38#ifndef _NL_VECTOR_H_
39#define _NL_VECTOR_H_
40
41#include <cassert>
42#include <algorithm> // for std::swap
43#include <vector>
44#include <sstream>
45#include <string>
46
47
48#include <gsl/gsl_vector.h>
49#include <gsl/gsl_blas.h>
50
51
52namespace Geom { namespace NL {
53
54namespace detail
55{
56
58{
59 public:
60 double const& operator[](size_t i) const
61 {
62 return *gsl_vector_const_ptr(m_vector, i);
63 }
64
65 const gsl_vector* get_gsl_vector() const
66 {
67 return m_vector;
68 }
69 bool is_zero() const
70 {
71 return gsl_vector_isnull(m_vector);
72 }
73
74 bool is_positive() const
75 {
76 for ( size_t i = 0; i < size(); ++i )
77 {
78 if ( (*this)[i] <= 0 ) return false;
79 }
80 return true;
81 }
82
83 bool is_negative() const
84 {
85 for ( size_t i = 0; i < size(); ++i )
86 {
87 if ( (*this)[i] >= 0 ) return false;
88 }
89 return true;
90 }
91
92 bool is_non_negative() const
93 {
94 for ( size_t i = 0; i < size(); ++i )
95 {
96 if ( (*this)[i] < 0 ) return false;
97 }
98 return true;
99 }
100
101 double max() const
102 {
103 return gsl_vector_max(m_vector);
104 }
105
106 double min() const
107 {
108 return gsl_vector_min(m_vector);
109 }
110
111 size_t max_index() const
112 {
113 return gsl_vector_max_index(m_vector);
114 }
115
116 size_t min_index() const
117 {
118 return gsl_vector_min_index(m_vector);
119 }
120
121 size_t size() const
122 {
123 return m_size;
124 }
125
126 std::string str() const;
127
129 {
130 }
131
132 protected:
133 size_t m_size;
134 gsl_vector* m_vector;
135
136}; // end class BaseVectorImpl
137
138
139inline
140bool operator== (BaseVectorImpl const& v1, BaseVectorImpl const& v2)
141{
142 if (v1.size() != v2.size()) return false;
143
144 for (size_t i = 0; i < v1.size(); ++i)
145 {
146 if (v1[i] != v2[i]) return false;
147 }
148 return true;
149}
150
151template< class charT >
152inline
153std::basic_ostream<charT> &
154operator<< (std::basic_ostream<charT> & os, const BaseVectorImpl & _vector)
155{
156 if (_vector.size() == 0 ) return os;
157 os << "[" << _vector[0];
158 for (unsigned int i = 1; i < _vector.size(); ++i)
159 {
160 os << ", " << _vector[i];
161 }
162 os << "]";
163 return os;
164}
165
166inline
167std::string BaseVectorImpl::str() const
168{
169 std::ostringstream oss;
170 oss << (*this);
171 return oss.str();
172}
173
174inline
175double dot(BaseVectorImpl const& v1, BaseVectorImpl const& v2)
176{
177 double result;
178 gsl_blas_ddot(v1.get_gsl_vector(), v2.get_gsl_vector(), &result);
179 return result;
180}
181
182
184{
185 public:
187
188 public:
189 void set_all(double x)
190 {
191 gsl_vector_set_all(m_vector, x);
192 }
193
194 void set_basis(size_t i)
195 {
196 gsl_vector_set_basis(m_vector, i);
197 }
198
199 using base_type::operator[];
200
201 double & operator[](size_t i)
202 {
203 return *gsl_vector_ptr(m_vector, i);
204 }
205
207
208 gsl_vector* get_gsl_vector()
209 {
210 return m_vector;
211 }
212
213 void swap_elements(size_t i, size_t j)
214 {
215 gsl_vector_swap_elements(m_vector, i, j);
216 }
217
218 void reverse()
219 {
220 gsl_vector_reverse(m_vector);
221 }
222
223 VectorImpl & scale(double x)
224 {
225 gsl_vector_scale(m_vector, x);
226 return (*this);
227 }
228
230 {
231 gsl_vector_add_constant(m_vector, x);
232 return (*this);
233 }
234
236 {
237 gsl_vector_add(m_vector, _vector.get_gsl_vector());
238 return (*this);
239 }
240
242 {
243 gsl_vector_sub(m_vector, _vector.get_gsl_vector());
244 return (*this);
245 }
246
247}; // end class VectorImpl
248
249} // end namespace detail
250
251
252using detail::operator==;
253using detail::operator<<;
254
256{
257 public:
259
260 public:
261 Vector(size_t n)
262 {
263 m_size = n;
264 m_vector = gsl_vector_alloc(n);
265 }
266
267 Vector(size_t n, double x)
268 {
269 m_size = n;
270 m_vector = gsl_vector_alloc(n);
271 gsl_vector_set_all(m_vector, x);
272 }
273
274 // create a vector with n elements all set to zero
275 // but the i-th that is set to 1
276 Vector(size_t n, size_t i)
277 {
278 m_size = n;
279 m_vector = gsl_vector_alloc(n);
280 gsl_vector_set_basis(m_vector, i);
281 }
282
283 Vector(Vector const& _vector)
284 : base_type()
285 {
286 m_size = _vector.size();
287 m_vector = gsl_vector_alloc(size());
288 gsl_vector_memcpy(m_vector, _vector.m_vector);
289 }
290
291 explicit
293 {
294 m_size = _vector.size();
295 m_vector = gsl_vector_alloc(size());
296 gsl_vector_memcpy(m_vector, _vector.get_gsl_vector());
297 }
298
299 ~Vector() override
300 {
301 gsl_vector_free(m_vector);
302 }
303
304
305 Vector & operator=(Vector const& _vector)
306 {
307 assert( size() == _vector.size() );
308 gsl_vector_memcpy(m_vector, _vector.m_vector);
309 return (*this);
310 }
311
313 {
314 assert( size() == _vector.size() );
315 gsl_vector_memcpy(m_vector, _vector.get_gsl_vector());
316 return (*this);
317 }
318
319 Vector & scale(double x)
320 {
321 return static_cast<Vector&>( base_type::scale(x) );
322 }
323
324 Vector & translate(double x)
325 {
326 return static_cast<Vector&>( base_type::translate(x) );
327 }
328
330 {
331 return static_cast<Vector&>( base_type::operator+=(_vector) );
332 }
333
335 {
336 return static_cast<Vector&>( base_type::operator-=(_vector) );
337 }
338
339 friend
340 void swap(Vector & v1, Vector & v2);
341 friend
342 void swap_any(Vector & v1, Vector & v2);
343
344}; // end class Vector
345
346
347// warning! these operations invalidate any view of the passed vector objects
348inline
349void swap(Vector & v1, Vector & v2)
350{
351 assert(v1.size() == v2.size());
352 using std::swap;
353 swap(v1.m_vector, v2.m_vector);
354}
355
356inline
357void swap_any(Vector & v1, Vector & v2)
358{
359 using std::swap;
360 swap(v1.m_vector, v2.m_vector);
361 swap(v1.m_size, v2.m_size);
362}
363
364
366{
367 public:
369
370 public:
371 ConstVectorView(const base_type & _vector, size_t n, size_t offset = 0)
372 : m_vector_view( gsl_vector_const_subvector(_vector.get_gsl_vector(), offset, n) )
373 {
374 m_size = n;
375 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
376 }
377
378 ConstVectorView(const base_type & _vector, size_t n, size_t offset , size_t stride)
379 : m_vector_view( gsl_vector_const_subvector_with_stride(_vector.get_gsl_vector(), offset, stride, n) )
380 {
381 m_size = n;
382 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
383 }
384
385 ConstVectorView(const double* _vector, size_t n, size_t offset = 0)
386 : m_vector_view( gsl_vector_const_view_array(_vector + offset, n) )
387 {
388 m_size = n;
389 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
390 }
391
392 ConstVectorView(const double* _vector, size_t n, size_t offset, size_t stride)
393 : m_vector_view( gsl_vector_const_view_array_with_stride(_vector + offset, stride, n) )
394 {
395 m_size = n;
396 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
397 }
398
399 explicit
400 ConstVectorView(gsl_vector_const_view _gsl_vector_view)
401 : m_vector_view(_gsl_vector_view)
402 {
403 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
404 m_size = m_vector->size;
405 }
406
407 explicit
408 ConstVectorView(const std::vector<double>& _vector)
409 : m_vector_view( gsl_vector_const_view_array(&(_vector[0]), _vector.size()) )
410 {
411 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
412 m_size = _vector.size();
413 }
414
416 : base_type(),
418 {
419 m_size = _vector.size();
420 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
421 }
422
423 ConstVectorView(const base_type & _vector)
424 : m_vector_view(gsl_vector_const_subvector(_vector.get_gsl_vector(), 0, _vector.size()))
425 {
426 m_size = _vector.size();
427 m_vector = const_cast<gsl_vector*>( &(m_vector_view.vector) );
428 }
429
430 private:
431 gsl_vector_const_view m_vector_view;
432
433}; // end class ConstVectorView
434
435
436
437
439{
440 public:
442
443 public:
444 VectorView(base_type & _vector, size_t n, size_t offset = 0, size_t stride = 1)
445 {
446 m_size = n;
447 if (stride == 1)
448 {
450 = gsl_vector_subvector(_vector.get_gsl_vector(), offset, n);
451 m_vector = &(m_vector_view.vector);
452 }
453 else
454 {
456 = gsl_vector_subvector_with_stride(_vector.get_gsl_vector(), offset, stride, n);
457 m_vector = &(m_vector_view.vector);
458 }
459 }
460
461 VectorView(double* _vector, size_t n, size_t offset = 0, size_t stride = 1)
462 {
463 m_size = n;
464 if (stride == 1)
465 {
467 = gsl_vector_view_array(_vector + offset, n);
468 m_vector = &(m_vector_view.vector);
469 }
470 else
471 {
473 = gsl_vector_view_array_with_stride(_vector + offset, stride, n);
474 m_vector = &(m_vector_view.vector);
475 }
476
477 }
478
479 VectorView(const VectorView & _vector)
480 : base_type()
481 {
482 m_size = _vector.size();
484 m_vector = &(m_vector_view.vector);
485 }
486
488 {
489 m_size = _vector.size();
490 m_vector_view = gsl_vector_subvector(_vector.get_gsl_vector(), 0, size());
491 m_vector = &(m_vector_view.vector);
492 }
493
494 explicit
495 VectorView(gsl_vector_view _gsl_vector_view)
496 : m_vector_view(_gsl_vector_view)
497 {
498 m_vector = &(m_vector_view.vector);
499 m_size = m_vector->size;
500 }
501
502 explicit
503 VectorView(std::vector<double> & _vector)
504 {
505 m_size = _vector.size();
506 m_vector_view = gsl_vector_view_array(&(_vector[0]), _vector.size());
507 m_vector = &(m_vector_view.vector);
508 }
509
511 {
512 assert( size() == _vector.size() );
513 gsl_vector_memcpy(m_vector, _vector.get_gsl_vector());
514 return (*this);
515 }
516
518 {
519 assert( size() == _vector.size() );
520 gsl_vector_memcpy(m_vector, _vector.get_gsl_vector());
521 return (*this);
522 }
523
524 VectorView & scale(double x)
525 {
526 return static_cast<VectorView&>( base_type::scale(x) );
527 }
528
530 {
531 return static_cast<VectorView&>( base_type::translate(x) );
532 }
533
535 {
536 return static_cast<VectorView&>( base_type::operator+=(_vector) );
537 }
538
540 {
541 return static_cast<VectorView&>( base_type::operator-=(_vector) );
542 }
543
544 friend
545 void swap_view(VectorView & v1, VectorView & v2);
546
547 private:
548 gsl_vector_view m_vector_view;
549
550}; // end class VectorView
551
552
553inline
555{
556 assert( v1.size() == v2.size() );
557 using std::swap;
558 swap(v1.m_vector_view, v2.m_vector_view); // not swap m_vector too
559}
560
561inline
563{
564 const detail::BaseVectorImpl & bvi
565 = static_cast<const detail::BaseVectorImpl &>(view);
566 const VectorView & vv = reinterpret_cast<const VectorView &>(bvi);
567 return vv;
568}
569
570inline
572{
574 = static_cast<detail::BaseVectorImpl &>(view);
575 VectorView & vv = reinterpret_cast<VectorView &>(bvi);
576 return vv;
577}
578
579
580} } // end namespaces
581
582
583#endif /*_NL_VECTOR_H_*/
584
585/*
586 Local Variables:
587 mode:c++
588 c-file-style:"stroustrup"
589 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
590 indent-tabs-mode:nil
591 fill-column:99
592 End:
593*/
594// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
detail::BaseVectorImpl base_type
Definition vector.h:368
ConstVectorView(const std::vector< double > &_vector)
Definition vector.h:408
gsl_vector_const_view m_vector_view
Definition vector.h:431
ConstVectorView(gsl_vector_const_view _gsl_vector_view)
Definition vector.h:400
ConstVectorView(const base_type &_vector, size_t n, size_t offset=0)
Definition vector.h:371
ConstVectorView(const base_type &_vector, size_t n, size_t offset, size_t stride)
Definition vector.h:378
ConstVectorView(const double *_vector, size_t n, size_t offset=0)
Definition vector.h:385
ConstVectorView(const base_type &_vector)
Definition vector.h:423
ConstVectorView(const ConstVectorView &_vector)
Definition vector.h:415
ConstVectorView(const double *_vector, size_t n, size_t offset, size_t stride)
Definition vector.h:392
VectorView(double *_vector, size_t n, size_t offset=0, size_t stride=1)
Definition vector.h:461
VectorView & operator-=(base_type::base_type const &_vector)
Definition vector.h:539
VectorView & operator=(base_type::base_type const &_vector)
Definition vector.h:517
VectorView & operator+=(base_type::base_type const &_vector)
Definition vector.h:534
friend void swap_view(VectorView &v1, VectorView &v2)
Definition vector.h:554
VectorView(Vector &_vector)
Definition vector.h:487
VectorView & scale(double x)
Definition vector.h:524
gsl_vector_view m_vector_view
Definition vector.h:548
detail::VectorImpl base_type
Definition vector.h:441
VectorView(gsl_vector_view _gsl_vector_view)
Definition vector.h:495
VectorView(std::vector< double > &_vector)
Definition vector.h:503
VectorView & operator=(VectorView const &_vector)
Definition vector.h:510
VectorView & translate(double x)
Definition vector.h:529
VectorView(const VectorView &_vector)
Definition vector.h:479
VectorView(base_type &_vector, size_t n, size_t offset=0, size_t stride=1)
Definition vector.h:444
Vector(base_type::base_type const &_vector)
Definition vector.h:292
Vector & operator-=(base_type::base_type const &_vector)
Definition vector.h:334
Vector(size_t n, double x)
Definition vector.h:267
Vector & operator=(Vector const &_vector)
Definition vector.h:305
Vector & operator+=(base_type::base_type const &_vector)
Definition vector.h:329
friend void swap_any(Vector &v1, Vector &v2)
Definition vector.h:357
Vector(size_t n, size_t i)
Definition vector.h:276
Vector & scale(double x)
Definition vector.h:319
Vector & translate(double x)
Definition vector.h:324
Vector(size_t n)
Definition vector.h:261
Vector(Vector const &_vector)
Definition vector.h:283
friend void swap(Vector &v1, Vector &v2)
Definition vector.h:349
Vector & operator=(base_type::base_type const &_vector)
Definition vector.h:312
detail::VectorImpl base_type
Definition vector.h:258
~Vector() override
Definition vector.h:299
const gsl_vector * get_gsl_vector() const
Definition vector.h:65
std::string str() const
Definition vector.h:167
double const & operator[](size_t i) const
Definition vector.h:60
gsl_vector * get_gsl_vector()
Definition vector.h:208
double & operator[](size_t i)
Definition vector.h:201
void set_all(double x)
Definition vector.h:189
VectorImpl & operator+=(base_type const &_vector)
Definition vector.h:235
void swap_elements(size_t i, size_t j)
Definition vector.h:213
VectorImpl & scale(double x)
Definition vector.h:223
BaseVectorImpl base_type
Definition vector.h:186
VectorImpl & operator-=(base_type const &_vector)
Definition vector.h:241
VectorImpl & translate(double x)
Definition vector.h:229
void set_basis(size_t i)
Definition vector.h:194
Css & result
double offset
double dot(BaseVectorImpl const &v1, BaseVectorImpl const &v2)
Definition vector.h:175
const VectorView & const_vector_view_cast(const ConstVectorView &view)
Definition vector.h:562
void swap_any(Matrix &m1, Matrix &m2)
Definition matrix.h:440
void swap(Matrix &m1, Matrix &m2)
Definition matrix.h:433
void swap_view(MatrixView &m1, MatrixView &m2)
Definition matrix.h:571
Various utility functions.
Definition affine.h:22
int stride