ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
vector.hpp
Go to the documentation of this file.
1/*
2 * $Id: vector.hpp 313 2014-02-22 14:29:57Z jdl3 $
3 * Copyright (C) 2010, 2011, 2012, 2019, 2020, 2021, 2024 John D Lamb
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or (at
8 * your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20#ifndef CCGSL_VECTOR_HPP
21#define CCGSL_VECTOR_HPP
22
23#include<gsl/gsl_vector.h>
24#include<new>
25#include<iterator>
26
27#include"exception.hpp"
28#include"block.hpp"
29
30// This file is used as a template
31
32namespace gsl {
33 // declare matrix class
34 class matrix;
35 namespace multimin {
36 // declare class
37 class function;
38 // declare class
39 class function_fdf;
40 }
41 namespace multifit {
42 // declare class
43 class function;
44 // declare class
45 class function_fdf;
46 namespace nlinear {
47 // declare class
48 class function_fdf;
49 }
50 }
51 namespace multilarge {
52 namespace nlinear {
53 // declare class
54 class function_fdf;
55 }
56 }
57 namespace multiroot {
58 // declare class
59 class function;
60 // declare class
61 class function_fdf;
62 }
74 class vector {
75 friend class multimin::function;
77 friend class multifit::function;
79 friend class multiroot::function;
83 public:
88 owns_data = false;
89 ccgsl_pointer = 0;
90 count = 0; // initially nullptr will do
91 }
92 // Refines random access container
93 // Refines assignable
98 explicit vector( size_t const n )
99 : owns_data(true) {
100 if( n > 0 ) ccgsl_pointer = gsl_vector_alloc( n );
101 else { ccgsl_pointer = new gsl_vector; ccgsl_pointer->size = 0; ccgsl_pointer->data = 0; }
102 // just plausibly we could allocate vector but not count
103 try { count = new size_t; } catch( std::bad_alloc& e ){
104 // try to tidy up before rethrowing
105 if( n > 0 ) gsl_vector_free( ccgsl_pointer );
106 else delete ccgsl_pointer;
107 throw e;
108 }
109 *count = 1; // initially there is just one reference to ccgsl_pointer
110 }
111#ifndef DOXYGEN_SKIP
116 explicit vector( int const n )
117 : owns_data(true){
118 if( n > 0 ) ccgsl_pointer = gsl_vector_alloc( static_cast<size_t>( n ) );
119 else if(n<0)
120 gsl_error("failed tring to make a vector of negative length",
121 __FILE__, __LINE__, exception::GSL_EDOM );
122 else { ccgsl_pointer = new gsl_vector; ccgsl_pointer->size = 0; ccgsl_pointer->data = 0; }
123 // just plausibly we could allocate vector but not count
124 try { count = new size_t; } catch( std::bad_alloc& e ){
125 // try to tidy up before rethrowing
126 if( n > 0 ) gsl_vector_free( ccgsl_pointer );
127 else delete ccgsl_pointer;
128 throw e;
129 }
130 *count = 1; // initially there is just one reference to ccgsl_pointer
131 }
132#endif // DOXYGEN_SKIP
138 explicit vector( gsl_vector* v )
139 : owns_data(true){
140 ccgsl_pointer = v;
141 // just plausibly we could fail to allocate count: no further action needed.
142 count = new size_t;
143 *count = 1; // initially there is just one reference to ccgsl_pointer
144 }
145#ifdef __GXX_EXPERIMENTAL_CXX0X__
150 vector( std::initializer_list<double> initializer_list )
151 : owns_data{true}{
152 size_t const n = initializer_list.size();
153 ccgsl_pointer = gsl_vector_alloc( n );
154 // just plausibly we could allocate vector but not count
155 try { count = new size_t; } catch( std::bad_alloc& e ){
156 // try to tidy up before rethrowing
157 if( n > 0 ) gsl_vector_free( ccgsl_pointer );
158 else delete ccgsl_pointer;
159 throw e;
160 }
161 *count = 1; // initially there is just one reference to ccgsl_pointer
162 // now copy
163 auto p = begin();
164 for( auto x : initializer_list ){ *p = x; ++p; }
165 }
166#endif
167 // copy constructor
172 vector( vector const& v )
174 if( count != 0 ) ++*count; // vector is now shared.
175 }
181 : owns_data(v.owns_data),
183 if( count != 0 ) ++*count; // vector is now shared.
184 }
185 // assignment operator
190 vector& operator=( vector const& v ){
191 // first, possibly delete anything pointed to by @c this
192 if( count == 0 or --*count == 0 ){
193 if( ccgsl_pointer != 0 ){
194 if( ccgsl_pointer->size > 0 ) gsl_vector_free( ccgsl_pointer );
195 else delete ccgsl_pointer; }
196 delete count;
197 }
198 // Then copy
201 count = v.count;
202 if( count != 0 ) ++*count; // block is now shared.
203 return *this;
204 }
217 template<typename V> vector( V& v, size_t const stride = 1 )
218 : owns_data(true){
219 size_t const n = v.size() / stride;
220 ccgsl_pointer = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
221 ccgsl_pointer->size = n;
222 ccgsl_pointer->stride = stride;
223 ccgsl_pointer->data = v.data();
224 ccgsl_pointer->block = 0;
225 ccgsl_pointer->owner = 0;
226 // just plausibly we could allocate vector but not count
227 try { count = new size_t; } catch( std::bad_alloc& e ){
228 // try to tidy up before rethrowing
229 if( n > 0 ) gsl_vector_free( ccgsl_pointer );
230 else delete ccgsl_pointer;
231 throw e;
232 }
233 *count = 1; // initially there is just one reference to ccgsl_pointer
234 }
235 // clone()
241 vector clone() const {
242 vector copy( get()->size );
243 // Now copy
244 gsl_vector_memcpy( copy.get(), get() );
245 // return new object
246 return copy;
247 }
248 // destructor
253 if( count != 0 and --*count == 0 ){
254 // could have allocated null pointer
255 if( ccgsl_pointer != 0 and owns_data ){
256 // only a vector created by wrap_gsl_vector_without_ownership
257 if( ccgsl_pointer->size > 0 ) gsl_vector_free( ccgsl_pointer );
258 else delete ccgsl_pointer; }
259 delete count;
260 }
261 }
262
263 // Allow possibility of assigning from gsl_vector without sharing
273 if( count != 0 and --*count == 0 ){
274 // could have allocated null pointer
275 if( ccgsl_pointer != 0 ){
276 if( ccgsl_pointer->size != 0 ) gsl_vector_free( ccgsl_pointer );
277 else delete ccgsl_pointer; }
278 }
279 ccgsl_pointer = v;
280 if(0 == count) count = new size_t;
281 *count = 1;
282 owns_data = false; // should never be able to delete ccgsl_pointer
283 }
284 // Refines equality comparable
285 // == operator
292 bool operator==( vector const& v ) const {
293 // trivially equal if gsl_vector*s are identical
294 if( ccgsl_pointer == v.ccgsl_pointer ) return true;
295 // trivially not equal if one is zero: != should be same as xor here
296 if( (ccgsl_pointer == 0) != (v.ccgsl_pointer == 0 ) ) return false;
297 // trivially not equal if sizes are different
298 if( ccgsl_pointer->size != v.ccgsl_pointer->size ) return false;
299 // check elementwise for equality
300 for( size_t i = 0; i < ccgsl_pointer->size; ++i )
301 if( gsl_vector_get( ccgsl_pointer, i ) != gsl_vector_get( v.ccgsl_pointer, i ) ) return false;
302 return true;
303 }
307 void reset(){ vector().swap( *this ); }
308#ifdef __GXX_EXPERIMENTAL_CXX0X__
314 ccgsl_pointer( v.ccgsl_pointer ), count( nullptr ){
315 std::swap( count, v.count );
316 v.ccgsl_pointer = nullptr;
317 }
324 vector( std::move( v ) ).swap( *this );
325 return *this;
326 }
327#endif
328 // != operator
335 bool operator!=( vector const& v ) const { return not operator==( v ); }
336 // Refines forward container
337 // Refines less than comparable
338 // operator<
347 bool operator<( vector const& v ) const {
348 // null vector comes first
349 if( ccgsl_pointer == 0 ) return v.ccgsl_pointer != 0;
350 // if v is null then this > v
351 if( v.ccgsl_pointer == 0 ) return false;
352 // Now compare elementwise
353 size_t const size = ccgsl_pointer->size;
354 size_t const v_size = v.ccgsl_pointer->size;
355 size_t const min = size > v_size ? size : v_size;
356 for( size_t i = 0; i < min; ++i ){
357 double const t = gsl_vector_get( ccgsl_pointer, i );
358 double const u =gsl_vector_get( v.ccgsl_pointer, i );
359 if( t < u ) return true;
360 if( u < t ) return false;
361 }
362 // elements match.
363 return size < v_size;
364 }
365 // operator>
374 bool operator>( vector const& v ) const {
375 // null vector comes first
376 if( ccgsl_pointer == 0 ) return false;
377 // if v is null then this > v
378 if( v.ccgsl_pointer == 0 ) return true;
379 // Now compare elementwise
380 size_t const size = ccgsl_pointer->size;
381 size_t const v_size = v.ccgsl_pointer->size;
382 size_t const min = size > v_size ? size : v_size;
383 for( size_t i = 0; i < min; ++i ){
384 double const t = gsl_vector_get( ccgsl_pointer, i );
385 double const u =gsl_vector_get( v.ccgsl_pointer, i );
386 if( t > u ) return true;
387 if( u > t ) return false;
388 }
389 // elements match.
390 return size > v_size;
391 }
392 // operator<=
401 bool operator<=( vector const& v ) const {
402 return operator<( v ) or operator==( v );
403 }
404 // operator>=
413 bool operator>=( vector const& v ) const {
414 return operator>( v ) or operator==( v );
415 }
416 // Refines container
417 // type value_type
421 typedef double value_type;
422 // type reference
427 // type const_reference
432 // type pointer
437 // type const_pointer
441 typedef value_type const* const_pointer;
442 // type iterator
443 private:
448 template<typename container, typename content,bool reverse_t> class iterator_base {
449 friend class vector;
450 public:
454 typedef std::random_access_iterator_tag iterator_category;
458 typedef double value_type;
467 // // type iterator_traits<vector>::difference_type
471 typedef ptrdiff_t difference_type;
472 public:
473 // // operator*
479 // Always try to return something
480 static content something = 0;
481 // First check that iterator is initialised.
482 if( v == 0 ){
483 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
484 return something;
485 } else if( v->ccgsl_pointer == 0 ){
486 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
487 return something;
488 }
489 // Check that position make sense
490 if( position >= static_cast<difference_type>( v->size() ) ){
491 gsl_error( "trying to dereference beyond rbegin()", __FILE__, __LINE__, exception::GSL_EFAILED );
492 return something;
493 }
494 if( position <= -1 ){
495 gsl_error( "trying to dereference beyond begin()", __FILE__, __LINE__, exception::GSL_EFAILED );
496 return something;
497 }
498 // position and v are valid: return data
499 return *(v->ccgsl_pointer->data + position * v->ccgsl_pointer->stride);
500 }
501 // // operator->
507 // First check that iterator is initialised.
508 if( v == 0 ){
509 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
510 return 0;
511 } else if( v->ccgsl_pointer == 0 ){
512 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
513 return 0;
514 }
515 // Check that position make sense
516 if( position >= static_cast<difference_type>( v->size() ) ){
517 gsl_error( "trying to dereference end()", __FILE__, __LINE__, exception::GSL_EFAILED );
518 return 0;
519 }
520 if( position <= -1 ){
521 gsl_error( "trying to dereference rend()", __FILE__, __LINE__, exception::GSL_EFAILED );
522 return 0;
523 }
524 // position and v are valid: return data
525 return v->ccgsl_pointer->data + position * v->ccgsl_pointer->stride;
526 }
527 // // operator[]
534 // Always try to return something
535 static content something = 0;
536 // First check that iterator is initialised.
537 if( v == 0 ){
538 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
539 return something;
540 } else if( v->ccgsl_pointer == 0 ){
541 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
542 return something;
543 }
544 // Check that position make sense
545 difference_type const p = reverse_t ? position - n : position + n;
546 if( p >= static_cast<difference_type>( v->size() ) ){
547 gsl_error( "trying to dereference beyond rbegin()", __FILE__, __LINE__, exception::GSL_EFAILED );
548 return something;
549 }
550 if( p <= -1 ){
551 gsl_error( "trying to dereference beyond begin()", __FILE__, __LINE__, exception::GSL_EFAILED );
552 return something;
553 }
554 // p is a valid position
555 return *(v->ccgsl_pointer->data + p * v->ccgsl_pointer->stride);
556 }
557 // // operator-: find distance between two iterators
564 // Warn if either iterator undefined
565 if( v == 0 or i.v == 0 ){
566 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
567 return 0;
568 } else if( v->ccgsl_pointer == 0 or i.v->ccgsl_pointer == 0 ){
569 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
570 return 0;
571 }
572 // Warn if iterators do not point to same vector
573 if( v->ccgsl_pointer != i.v->ccgsl_pointer ){
574 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
576 return 0;
577 }
578 return reverse_t ? i.position - position : position - i.position;
579 }
580 // // operator!=
581 // // operator<
588 return this->v == i.v and this->position == i.position;
589 }
596 return not this->operator==( i );
597 }
606 // Warn if either iterator undefined
607 if( v == 0 or i.v == 0 ){
608 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
609 return false;
610 }
611 // Warn if iterators do not point to same vector
612 if( v->ccgsl_pointer != i.v->ccgsl_pointer ){
613 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
615 return false;
616 }
617 return reverse_t ? i.position < position : position < i.position;
618 }
619 protected:
624 void increment(){
625 // Only makes sense if v points to a vector
626 if( v == 0 ){
627 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
628 return;
629 } else if( v->ccgsl_pointer == 0 ){
630 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
631 return;
632 }
633 // increment position and check against size
634 if( reverse_t ){ if( position >= 0 ) --position; }
635 else { if( position < static_cast<difference_type>( v->size() ) ) ++position; }
636 }
641 void decrement(){
642 // Only makes sense if v points to a vector
643 if( v == 0 ){
644 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
645 return;
646 } else if( v->ccgsl_pointer == 0 ){
647 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
648 return;
649 }
650 // decrement position and check against size
651 if( reverse_t ){ if( position < static_cast<difference_type>( v->size() ) ) ++position; }
652 else { if( position >= 0 ) --position; }
653 }
658 void shift( difference_type const n ){
659 // Warn if iterator undefined
660 if( v == 0 ){
661 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
662 return;
663 } else if( v->ccgsl_pointer == 0 ){
664 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
665 return;
666 }
667 position += reverse_t ? -n : n;
668 }
672 iterator_base(){ v = 0; }
679 : v( v ), position( position ){}
683 container* v;
688 };
689 // Need to know about const_iterator_t
690 template<bool reverse_t> class const_iterator_t;
694 template<bool reverse_t> class iterator_t : public iterator_base<vector,double,reverse_t>{
695 public:
696 // // Refines output iterator
697 // // operator=
705 return *this;
706 }
707 // // Refines forward iterator
708 // // operator++ (both)
715 return *this;
716 }
722 // return value
725 return result;
726 }
727 // // Refines bidirectional iterator
728 // // operator-- (both)
735 return *this;
736 }
742 // return value
745 return result;
746 }
752 // // operator+=
759 this->shift( n );
760 return *this;
761 }
762 // // operator-=
769 this->shift( -n );
770 return *this;
771 }
772 // // operator+ (n+i)(i+n)
781 result.shift( n );
782 return result;
783 }
784 // // operator- (n-i)(i-n)(i-j)
793 result.shift( -n );
794 return result;
795 }
803 }
810 // Warn if either iterator undefined
811 if( this->v == 0 or i.v == 0 ){
812 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
813 return 0;
814 } else if( this->v->ccgsl_pointer == 0 or i.v->ccgsl_pointer == 0 ){
815 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
816 return 0;
817 }
818 // Warn if iterators do not point to same vector
819 if( this->v->ccgsl_pointer != i.v->ccgsl_pointer ){
820 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
822 return 0;
823 }
824 return reverse_t ? i.position - this->position : this->position - i.position;
825 }
832 return this->v == i.v and this->position == i.position;
833 }
840 return not this->operator==( i );
841 }
847 bool operator<( const_iterator_t<reverse_t> const& i ) const {
848 // Warn if either iterator undefined
849 if( this->v == 0 or i.v == 0 ){
850 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
851 return false;
852 }
853 // Warn if iterators do not point to same vector
854 if( this->v->ccgsl_pointer != i.v->ccgsl_pointer ){
855 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
857 return false;
858 }
859 return reverse_t ? i.position < this->position : this->position < i.position;
860 }
864 iterator_t() : iterator_base<vector,double,reverse_t>(){}
865 protected:
866 friend class vector;
867 // We need a constructor for vector
874 : iterator_base<vector,double,reverse_t>( v, position ){}
875 };
879 template<bool reverse_t> class const_iterator_t
880 : public iterator_base<vector const,double,reverse_t>{
881 public:
882 // // Refines output iterator
883 // // operator=
891 return *this;
892 }
893 // // Refines forward iterator
894 // // operator++ (both)
901 return *this;
902 }
908 // return value
911 return result;
912 }
913 // // Refines bidirectional iterator
914 // // operator-- (both)
921 return *this;
922 }
928 // return value
931 return result;
932 }
938 // // operator+=
945 this->shift( n );
946 return *this;
947 }
948 // // operator-=
955 this->shift( -n );
956 return *this;
957 }
958 // // operator+ (n+i)(i+n)
967 result += n;
968 return result;
969 }
970 // // operator- (n-i)(i-n)(i-j)
979 result -= n;
980 return result;
981 }
989 }
996 // Warn if either iterator undefined
997 if( this->v == 0 or i.v == 0 ){
998 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
999 return 0;
1000 } else if( this->v->ccgsl_pointer == 0 or i.v->ccgsl_pointer == 0 ){
1001 gsl_error( "vector not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
1002 return 0;
1003 }
1004 // Warn if iterators do not point to same vector
1005 if( this->v->ccgsl_pointer != i.v->ccgsl_pointer ){
1006 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1008 return 0;
1009 }
1010 return reverse_t ? i.position - this->position : this->position - i.position;
1011 }
1015 const_iterator_t() : iterator_base<vector,double,reverse_t>(){}
1023 }
1029 bool operator==( iterator_t<reverse_t> const& i ) const {
1030 return this->v == i.v and this->position == i.position;
1031 }
1037 bool operator!=( iterator_t<reverse_t> const& i ) const {
1038 return not this->operator==( i );
1039 }
1045 bool operator<( iterator_t<reverse_t> const& i ) const {
1046 // Warn if either iterator undefined
1047 if( this->v == 0 or i.v == 0 ){
1048 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
1049 return false;
1050 }
1051 // Warn if iterators do not point to same vector
1052 if( this->v->ccgsl_pointer != i.v->ccgsl_pointer ){
1053 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1055 return false;
1056 }
1057 return reverse_t ? i.position < this->position : this->position < i.position;
1058 }
1065 return this->v == i.v and this->position == i.position;
1066 }
1073 return not this->operator==( i );
1074 }
1081 // Warn if either iterator undefined
1082 if( this->v == 0 or i.v == 0 ){
1083 gsl_error( "iterator not initialised", __FILE__, __LINE__, exception::GSL_EFAILED );
1084 return false;
1085 }
1086 // Warn if iterators do not point to same vector
1087 if( this->v->ccgsl_pointer != i.v->ccgsl_pointer ){
1088 gsl_error( "trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1090 return false;
1091 }
1092 return reverse_t ? i.position < this->position : this->position < i.position;
1093 }
1094 protected:
1095 // We need a constructor for vector
1096 friend class vector;
1103 : iterator_base<vector const,double,reverse_t>( v, position ){}
1104 };
1105 public:
1122 // type difference_type
1127 // type size_type
1131 typedef size_t size_type;
1132 // begin()
1138 return iterator( this, 0 );
1139 }
1145 return const_iterator( this, 0 );
1146 }
1147 // end()
1153 if( ccgsl_pointer == 0 ) return iterator( this, 0 );
1154 return iterator( this, size() );
1155 }
1161 if( ccgsl_pointer == 0 ) return const_iterator( this, 0 );
1162 return const_iterator( this, size() );
1163 }
1164 // size()
1169 size_type size() const { return ccgsl_pointer == 0 ? 0 : ccgsl_pointer->size; }
1177 double* data() {
1178 if( ccgsl_pointer == 0 ) gsl_error( "null vector", __FILE__, __LINE__, GSL_EFAULT );
1179#ifndef GSL_RANGE_CHECK_OFF
1180 if( ccgsl_pointer->stride != 1 )
1181 gsl_error( "vector does not have stride of size 1", __FILE__, __LINE__, GSL_EBADLEN );
1182#endif
1183 return ccgsl_pointer->data; }
1191 double const* data() const {
1192 if( ccgsl_pointer == 0 ) gsl_error( "null vector", __FILE__, __LINE__, GSL_EFAULT );
1193#ifndef GSL_RANGE_CHECK_OFF
1194 if( ccgsl_pointer->stride != 1 )
1195 gsl_error( "vector does not have stride of size 1", __FILE__, __LINE__, GSL_EBADLEN );
1196#endif
1197 return ccgsl_pointer->data; }
1198 // max_size()
1204 size_type max_size() const { return ccgsl_pointer == 0 ? 0 : ccgsl_pointer->size; }
1205 // empty()
1210 bool empty() const { return ccgsl_pointer == 0 or ccgsl_pointer->size == 0; }
1211 // swap() --- should work even if sizes don't match
1217 void swap( vector& v ){
1218 std::swap( ccgsl_pointer, v.ccgsl_pointer );
1219 std::swap( count, v.count );
1220 }
1221 // Refines reversible container
1222 // rbegin()
1228 if( ccgsl_pointer ==0 ) return reverse_iterator( this, 0 );
1229 return reverse_iterator( this, size() - 1 );
1230 }
1236 if( ccgsl_pointer ==0 ) return const_reverse_iterator( this, 0 );
1237 return const_reverse_iterator( this, size() - 1 );
1238 }
1239 // rend()
1245 return reverse_iterator( this, -1 );
1246 }
1252 return const_reverse_iterator( this, -1 );
1253 }
1254 // operator[]
1260 double& operator[]( size_t const n ){
1261 // Always try to return something
1262 static double something = 0;
1263 // First check that iterator is initialised.
1264 if( ccgsl_pointer == 0 ){
1265 gsl_error( "vector is null", __FILE__, __LINE__, exception::GSL_EFAULT );
1266 return something;
1267 }
1268#ifndef GSL_RANGE_CHECK_OFF
1269 // Check that position make sense
1270 if( n >= size() ){
1271 gsl_error( "trying to read beyond end of vector", __FILE__, __LINE__, exception::GSL_EINVAL );
1272 return something;
1273 }
1274 // n is a valid position
1275#endif
1276 return *(ccgsl_pointer->data + n * ccgsl_pointer->stride);
1277 }
1283 double const& operator[]( size_t const n ) const {
1284 // Always try to return something
1285 static double something = 0;
1286 // First check that iterator is initialised.
1287 if( ccgsl_pointer == 0 ){
1288 gsl_error( "vector is null", __FILE__, __LINE__, exception::GSL_EFAULT );
1289 return something;
1290 }
1291#ifndef GSL_RANGE_CHECK_OFF
1292 // Check that position make sense
1293 if( n >= size() ){
1294 gsl_error( "trying to read beyond end of vector", __FILE__, __LINE__, exception::GSL_EINVAL );
1295 return something;
1296 }
1297 // n is a valid position
1298#endif
1299 return *(ccgsl_pointer->data + n * ccgsl_pointer->stride);
1300 }
1301 private:
1309 gsl_vector* ccgsl_pointer;
1313 size_t* count;
1314 public:
1315 // shared reference functions
1320 gsl_vector* get() { return ccgsl_pointer; }
1325 gsl_vector const* get() const { return ccgsl_pointer; }
1331 bool unique() const { return count != 0 and *count == 1; }
1336 size_t use_count() const { return count == 0 ? 0 : *count; }
1342#ifdef __GXX_EXPERIMENTAL_CXX0X__
1343 explicit
1344#endif
1345 operator bool() const { return ccgsl_pointer != 0; }
1346
1347 // GSL functions
1354 static vector calloc( size_t const n ){ return vector( gsl_vector_calloc( n ) ); }
1358 void set_zero(){ gsl_vector_set_zero( get() ); }
1363 void set_all( double x ){ gsl_vector_set_all( get(), x ); }
1369 int set_basis( size_t i ){ return gsl_vector_set_basis( get(), i ); }
1375 int memcpy( vector const& src ){ return gsl_vector_memcpy( get(), src.get() ); }
1380 int reverse(){ return gsl_vector_reverse( get() ); }
1387 int swap_elements( size_t const i, size_t const j ){
1388 return gsl_vector_swap_elements( get(), i, j ); }
1393 double max() const { return gsl_vector_max( get() ); }
1398 double min() const { return gsl_vector_min( get() ); }
1404 void minmax( double* min_out, double* max_out ) const {
1405 gsl_vector_minmax( get(), min_out, max_out ); }
1410 size_t max_index() const { return gsl_vector_max_index( get() ); }
1415 size_t min_index() const { return gsl_vector_min_index( get() ); }
1421 void minmax_index( size_t* imin, size_t* imax ) const {
1422 gsl_vector_minmax_index( get(), imin, imax ); }
1428 void minmax_index( size_t& imin, size_t& imax ) const {
1429 gsl_vector_minmax_index( get(), &imin, &imax ); }
1435 int add( vector const& b ){ return gsl_vector_add( get(), b.get() ); }
1441 int sub( vector const& b ){ return gsl_vector_sub( get(), b.get() ); }
1447 int mul( vector const& b ){ return gsl_vector_mul( get(), b.get() ); }
1453 int div( vector const& b ){ return gsl_vector_div( get(), b.get() ); }
1459 int scale( double const x ){ return gsl_vector_scale( get(), x ); }
1465 int add_constant( double const x ){ return gsl_vector_add_constant( get(), x ); }
1473 int axpby( double const alpha, vector const& x,
1474 double const beta ){
1475 return gsl_vector_axpby( alpha, x.get(), beta, get() );
1476 }
1482 double sum( vector const& a ) const { return gsl_vector_sum( a.get() ); }
1487 int isnull() const { return gsl_vector_isnull( get() ); }
1492 int ispos() const { return gsl_vector_ispos( get() ); }
1497 int isneg() const { return gsl_vector_isneg( get() ); }
1502 int isnonneg() const { return gsl_vector_isnonneg( get() ); }
1508 double get( size_t const i ) const { return gsl_vector_get( get(), i ); }
1514 void set( size_t const i, double x ){ gsl_vector_set( get(), i, x ); }
1520 double* ptr( size_t const i ){ return gsl_vector_ptr( get(), i ); }
1526 double const* const_ptr( size_t const i ) const { return gsl_vector_const_ptr( get(), i ); }
1532 int fread( FILE* stream ){ return gsl_vector_fread( stream, get() ); }
1538 int fwrite( FILE* stream ) const { return gsl_vector_fwrite( stream, get() ); }
1544 int fscanf( FILE* stream ){ return gsl_vector_fscanf( stream, get() ); }
1551 int fprintf( FILE* stream, char const* format ) const {
1552 return gsl_vector_fprintf( stream, get(), format ); }
1560 vector( block& b, size_t const offset, size_t const n, size_t const stride = 1 ){
1561 ccgsl_pointer = gsl_vector_alloc_from_block( b.get(), offset, n, stride );
1562 // just plausibly we could allocate vector but not count
1563 try { count = new size_t; } catch( std::bad_alloc& e ){
1564 // try to tidy up before rethrowing
1565 gsl_vector_free( ccgsl_pointer );
1566 throw e;
1567 }
1568 *count = 1; // initially there is just one reference to ccgsl_pointer
1569 }
1577 vector( vector& v, size_t const offset, size_t const n, size_t const stride = 1 ){
1578 ccgsl_pointer = gsl_vector_alloc_from_vector( v.get(), offset, n, stride );
1579 // just plausibly we could allocate vector but not count
1580 try { count = new size_t; } catch( std::bad_alloc& e ){
1581 // try to tidy up before rethrowing
1582 gsl_vector_free( ccgsl_pointer );
1583 throw e;
1584 }
1585 *count = 1; // initially there is just one reference to ccgsl_pointer
1586 }
1593 static vector view_array( double* v, size_t n ){
1594 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1595 *w = gsl_vector_view_array( v, n ).vector;
1596 return vector( w );
1597 }
1598
1606 static vector view_array_with_stride( double* base, size_t stride, size_t n ){
1607 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1608 *w = gsl_vector_view_array_with_stride( base, stride, n ).vector;
1609 return vector( w );
1610 }
1611
1612
1619 static vector const const_view_array( double const* v, size_t n ){
1620 gsl_vector* w = static_cast<gsl_vector *>( malloc( sizeof( gsl_vector ) ) );
1621 *w = gsl_vector_const_view_array( v, n ).vector;
1622 return vector( w );
1623 }
1624
1632 static vector const const_view_array_with_stride( double const* base, size_t stride, size_t n ){
1633 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1634 *w = gsl_vector_const_view_array_with_stride( base, stride, n ).vector;
1635 return vector( w );
1636 }
1637
1638
1639#ifndef DOXYGEN_SKIP
1646 static vector const view_array( double const* v, size_t n ){
1647 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1648 *w = gsl_vector_const_view_array( v, n ).vector;
1649 return vector( w );
1650 }
1651#endif //DOXYGEN_SKIP
1652
1653
1654#ifndef DOXYGEN_SKIP
1662 static vector const view_array_with_stride( double const* base, size_t stride, size_t n ){
1663 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1664 *w = gsl_vector_const_view_array_with_stride( base, stride, n ).vector;
1665 return vector( w );
1666 }
1667#endif //DOXYGEN_SKIP
1668
1669
1676 vector subvector( size_t i, size_t n ){
1677 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1678 *w = gsl_vector_subvector( get(), i, n ).vector;
1679 return vector( w );
1680 }
1681
1682
1690 vector subvector_with_stride( size_t i, size_t stride, size_t n ){
1691 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1692 *w = gsl_vector_subvector_with_stride( get(), i, stride, n ).vector;
1693 return vector( w );
1694 }
1695
1696
1703 vector const const_subvector( size_t i, size_t n ) const {
1704 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1705 *w = gsl_vector_const_subvector( get(), i, n ).vector;
1706 return vector( w );
1707 }
1708
1709
1717 vector const const_subvector_with_stride( size_t i, size_t stride, size_t n ) const {
1718 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1719 *w = gsl_vector_const_subvector_with_stride( get(), i, stride, n ).vector;
1720 return vector( w );
1721 }
1722
1723
1724#ifndef DOXYGEN_SKIP
1731 vector const subvector( size_t i, size_t n ) const {
1732 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1733 *w = gsl_vector_const_subvector( get(), i, n ).vector;
1734 return vector( w );
1735 }
1736#endif //DOXYGEN_SKIP
1737
1738
1739#ifndef DOXYGEN_SKIP
1747 vector const subvector_with_stride( size_t i, size_t stride, size_t n ) const {
1748 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1749 *w = gsl_vector_const_subvector_with_stride( get(), i, stride, n ).vector;
1750 return vector( w );
1751 }
1752#endif //DOXYGEN_SKIP
1753
1754
1761 template<typename ARRAY>
1762 static vector view_array( ARRAY& v, size_t n = 0 ){
1763 if(n > v.size())
1764 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1765 if(0 == n)
1766 n = v.size();
1767 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1768 *w = gsl_vector_view_array( v.data(), n ).vector;
1769 return vector( w );
1770 }
1771
1772
1780 template<typename ARRAY>
1781 static vector view_array_with_stride( ARRAY& base, size_t stride, size_t n=0 ){
1782 if(0 == n)
1783 n = base.size()/stride;
1784 if((n-1)*stride > base.size())
1785 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1786 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1787 *w = gsl_vector_view_array_with_stride( base.data(), stride, n ).vector;
1788 return vector( w );
1789 }
1790
1791
1798 template<typename ARRAY>
1799 static vector const const_view_array( ARRAY const& v, size_t n=0 ){
1800 if(n > v.size())
1801 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1802 if(0 == n)
1803 n = v.size();
1804 gsl_vector* w = static_cast<gsl_vector *>( malloc( sizeof( gsl_vector ) ) );
1805 *w = gsl_vector_const_view_array( v.data(), n ).vector;
1806 return vector( w );
1807 }
1808
1809
1817 template<typename ARRAY>
1818 static vector const const_view_array_with_stride( ARRAY const& base, size_t stride, size_t n=0 ){
1819 if(0 == n)
1820 n = base.size()/stride;
1821 if((n-1)*stride > base.size())
1822 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1823 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1824 *w = gsl_vector_const_view_array_with_stride( base.data(), stride, n ).vector;
1825 return vector( w );
1826 }
1827
1828
1829#ifndef DOXYGEN_SKIP
1836 template<typename ARRAY>
1837 static vector const view_array( ARRAY const& v, size_t n=0 ){
1838 if(n > v.size())
1839 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1840 if(0 == n)
1841 n = v.size();
1842 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1843 *w = gsl_vector_const_view_array( v.data(), n ).vector;
1844 return vector( w );
1845 }
1846#endif //DOXYGEN_SKIP
1847
1848
1849#ifndef DOXYGEN_SKIP
1857 template<typename ARRAY>
1858 static vector const view_array_with_stride( ARRAY const& base, size_t stride, size_t n ){
1859 if(0 == n)
1860 n = base.size()/stride;
1861 if((n-1)*stride > base.size())
1862 gsl_error( "n is too big", __FILE__, __LINE__, exception::GSL_EBADLEN );
1863 gsl_vector* w = static_cast<gsl_vector*>( malloc( sizeof( gsl_vector ) ) );
1864 *w = gsl_vector_const_view_array_with_stride( base.data(), stride, n ).vector;
1865 return vector( w );
1866 }
1867#endif //DOXYGEN_SKIP
1868
1869 // Extra allocators from matrix objects. The definition must come after matrix.
1876 static vector alloc_row_from_matrix( matrix& m, size_t const i );
1883 static vector alloc_col_from_matrix( matrix& m, size_t const j );
1890 static double get( gsl_vector const* v, size_t const i ){ return gsl_vector_get( v, i ); }
1891 };
1892
1899 inline vector::iterator operator+
1900 ( vector::iterator::difference_type const n, vector::iterator const& i ){ return i + n; }
1901
1908 inline vector::const_iterator operator+
1909 ( vector::const_iterator::difference_type const n, vector::const_iterator const& i ){ return i + n; }
1910
1919 return i + n; }
1920
1929 return i + n; }
1930
1931}
1932#endif
This class handles vectors as shared handles.
Definition: block.hpp:42
@ GSL_EDOM
input domain error, e.g sqrt(-1)
Definition: exception.hpp:472
@ GSL_EFAILED
generic failure
Definition: exception.hpp:476
@ GSL_EINVAL
invalid argument supplied by user
Definition: exception.hpp:475
@ GSL_EBADLEN
matrix, vector lengths are not conformant
Definition: exception.hpp:490
@ GSL_EFAULT
invalid pointer
Definition: exception.hpp:474
This class handles matrix objects as shared handles.
Definition: matrix.hpp:72
Class that extends gsl_multifit_function so that it can be constructed from arbitrary function object...
Class that extends gsl_multifit_nlinear_fdf so that it can be constructed from arbitrary function obj...
Class that extends gsl_multilarge_nlinear_fdf so that it can be constructed from arbitrary function o...
Class that extends gsl_multimin_function_fdf so that it can be constructed from arbitrary function ob...
Class that extends gsl_multimin_function so that it can be constructed from arbitrary function object...
Class that extends gsl_multiroot_function_fdf so that it can be constructed from arbitrary function o...
Class that extends gsl_multiroot_function so that it can be constructed from arbitrary function objec...
A class template for the const iterators.
Definition: vector.hpp:880
const_iterator_t(vector const *v, difference_type position)
This constructor allows vector to create non-default iterators.
Definition: vector.hpp:1102
bool operator<(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
Definition: vector.hpp:1045
const_iterator_t< reverse_t > operator+(difference_type const n) const
The + operator.
Definition: vector.hpp:965
const_iterator_t()
The default constructor.
Definition: vector.hpp:1015
const_iterator_t(iterator_t< reverse_t > const &i)
A copy constructor.
Definition: vector.hpp:1020
bool operator!=(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:1072
const_iterator_t< reverse_t > & operator+=(difference_type const n)
The += operator.
Definition: vector.hpp:944
bool operator<(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:1080
bool operator!=(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
Definition: vector.hpp:1037
bool operator==(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:1064
const_iterator_t< reverse_t > operator-(difference_type const n) const
The - operator: subtract distance from iterator.
Definition: vector.hpp:977
const_iterator_t< reverse_t > operator++(int)
The postfix ++ operator.
Definition: vector.hpp:907
const_iterator_t< reverse_t > & operator-=(difference_type const n)
The -= operator.
Definition: vector.hpp:954
iterator_base< vectorconst, double, reverse_t >::difference_type difference_type
Difference type.
Definition: vector.hpp:937
difference_type operator-(const_iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
Definition: vector.hpp:987
const_iterator_t< reverse_t > & operator--()
The prefix – operator.
Definition: vector.hpp:919
const_iterator_t< reverse_t > & operator=(const_iterator_t< reverse_t > const &i)
We can assign one output iterator from another.
Definition: vector.hpp:888
difference_type operator-(iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
Definition: vector.hpp:995
const_iterator_t< reverse_t > operator--(int)
The postfix – operator.
Definition: vector.hpp:927
bool operator==(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
Definition: vector.hpp:1029
const_iterator_t< reverse_t > & operator++()
The prefix ++ operator.
Definition: vector.hpp:899
The container must have iterator types.
Definition: vector.hpp:448
void shift(difference_type const n)
Shift iterator n places.
Definition: vector.hpp:658
std::random_access_iterator_tag iterator_category
An iterator must have an iterator category.
Definition: vector.hpp:454
double value_type
An iterator must have a value type.
Definition: vector.hpp:458
value_type & reference
An iterator must have a reference type.
Definition: vector.hpp:466
value_type * pointer
An iterator must have a pointer typea.
Definition: vector.hpp:462
bool operator<(iterator_base< container, content, reverse_t > const &i) const
The < operator is used to compare iterators.
Definition: vector.hpp:605
iterator_base()
The iterator is default constructible.
Definition: vector.hpp:672
ptrdiff_t difference_type
An iterator must have a difference_type.
Definition: vector.hpp:471
iterator_base(container *v, difference_type position)
This constructor allows vector to create non-default iterators.
Definition: vector.hpp:678
bool operator!=(iterator_base< container, content, reverse_t > const &i) const
The != operator.
Definition: vector.hpp:595
reference operator[](difference_type const n) const
Get element at i + n by reference ([] operator).
Definition: vector.hpp:533
bool operator==(iterator_base< container, content, reverse_t > const &i) const
The == operator.
Definition: vector.hpp:587
container * v
Store a pointer to a vector we can iterate over: 0 if no vector.
Definition: vector.hpp:683
reference operator*() const
Dereference the pointer.
Definition: vector.hpp:478
pointer operator->() const
Dereference the pointer.
Definition: vector.hpp:506
difference_type operator-(iterator_base< container, content, reverse_t > const &i) const
The - operator: find distance between two iterators.
Definition: vector.hpp:563
void increment()
Increment the iterator.
Definition: vector.hpp:624
void decrement()
Decrement the iterator.
Definition: vector.hpp:641
difference_type position
Mark position of iterator within vector.
Definition: vector.hpp:687
A class template for the two non-const iterators.
Definition: vector.hpp:694
iterator_t< reverse_t > & operator=(iterator_t< reverse_t > const &i)
We can assign one output iterator from another.
Definition: vector.hpp:702
iterator_t< reverse_t > & operator--()
The prefix – operator.
Definition: vector.hpp:733
iterator_t< reverse_t > & operator++()
The prefix ++ operator.
Definition: vector.hpp:713
iterator_base< vector, double, reverse_t >::difference_type difference_type
Difference type.
Definition: vector.hpp:751
iterator_t< reverse_t > & operator-=(difference_type const n)
The -= operator.
Definition: vector.hpp:768
iterator_t< reverse_t > operator++(int)
The postfix ++ operator.
Definition: vector.hpp:721
difference_type operator-(iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
Definition: vector.hpp:801
difference_type operator-(const_iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
Definition: vector.hpp:809
iterator_t< reverse_t > operator-(difference_type const n) const
The - operator: subtract distance from iterator.
Definition: vector.hpp:791
iterator_t(vector *v, difference_type position)
This constructor allows vector to create non-default iterators.
Definition: vector.hpp:873
iterator_t()
The default constructor.
Definition: vector.hpp:864
iterator_t< reverse_t > operator+(difference_type const n) const
The + operator.
Definition: vector.hpp:779
bool operator==(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:831
bool operator!=(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:839
iterator_t< reverse_t > & operator+=(difference_type const n)
The += operator.
Definition: vector.hpp:758
bool operator<(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
Definition: vector.hpp:847
iterator_t< reverse_t > operator--(int)
The postfix – operator.
Definition: vector.hpp:741
This class handles vector objects as shared handles.
Definition: vector.hpp:74
gsl_vector * get()
Get the gsl_vector.
Definition: vector.hpp:1320
bool operator!=(vector const &v) const
Two vector objects are different equal if their elements are not identical.
Definition: vector.hpp:335
size_type size() const
The size (number of elements) of the vector.
Definition: vector.hpp:1169
vector(vector &v)
The copy constructor.
Definition: vector.hpp:180
const_iterator_t< true > const_reverse_iterator
The const_reverse_t type.
Definition: vector.hpp:1117
vector const const_subvector(size_t i, size_t n) const
C++ version of gsl_vector_const_subvector().
Definition: vector.hpp:1703
int fscanf(FILE *stream)
C++ version of gsl_vector_fscanf().
Definition: vector.hpp:1544
static vector view_array_with_stride(ARRAY &base, size_t stride, size_t n=0)
C++ version of gsl_vector_view_array_with_stride().
Definition: vector.hpp:1781
void set_all(double x)
C++ version of gsl_vector_set_all().
Definition: vector.hpp:1363
bool empty() const
Find if the vector is empty.
Definition: vector.hpp:1210
friend class multifit::function_fdf
Definition: vector.hpp:78
static vector alloc_row_from_matrix(matrix &m, size_t const i)
C++ version of gsl_vector_alloc_row_from_matrix().
double min() const
C++ version of gsl_vector_min().
Definition: vector.hpp:1398
void wrap_gsl_vector_without_ownership(gsl_vector *v)
This function is intended mainly for internal use.
Definition: vector.hpp:272
const_iterator_t< false > const_iterator
The const_iterator type.
Definition: vector.hpp:1109
const_iterator begin() const
Get iterator pointing to first vector element.
Definition: vector.hpp:1144
size_type max_size() const
The max size (number of elements) of the vector.
Definition: vector.hpp:1204
int isnull() const
C++ version of gsl_vector_isnull().
Definition: vector.hpp:1487
bool unique() const
Find if this is the only object sharing the gsl_vector.
Definition: vector.hpp:1331
int isnonneg() const
C++ version of gsl_vector_isnonneg().
Definition: vector.hpp:1502
double const * const_ptr(size_t const i) const
C++ version of gsl_vector_const_ptr().
Definition: vector.hpp:1526
void swap(vector &v)
Swap two vector objects.
Definition: vector.hpp:1217
int div(vector const &b)
C++ version of gsl_vector_div().
Definition: vector.hpp:1453
vector(vector &v, size_t const offset, size_t const n, size_t const stride=1)
C++ version of gsl_vector_alloc_from_vector().
Definition: vector.hpp:1577
reverse_iterator rbegin()
Get iterator pointing to first vector element.
Definition: vector.hpp:1227
size_t size_type
A container must have a size_type.
Definition: vector.hpp:1131
static vector view_array_with_stride(double *base, size_t stride, size_t n)
C++ version of gsl_vector_view_array_with_stride().
Definition: vector.hpp:1606
vector const const_subvector_with_stride(size_t i, size_t stride, size_t n) const
C++ version of gsl_vector_const_subvector_with_stride().
Definition: vector.hpp:1717
bool owns_data
Used to allow a vector that does not own its data.
Definition: vector.hpp:1305
const_reverse_iterator rbegin() const
Get iterator pointing to first vector element.
Definition: vector.hpp:1235
static vector calloc(size_t const n)
C++ version of gsl_vector_calloc().
Definition: vector.hpp:1354
int axpby(double const alpha, vector const &x, double const beta)
C++ version of gsl_vector_axpby().
Definition: vector.hpp:1473
iterator_t< false > iterator
The iterator type.
Definition: vector.hpp:1113
static vector view_array(double *v, size_t n)
C++ version of gsl_vector_view_array().
Definition: vector.hpp:1593
void reset()
Stop sharing ownership of the shared pointer.
Definition: vector.hpp:307
value_type const * const_pointer
A container must have a constant pointer type.
Definition: vector.hpp:441
value_type & reference
A container must have a reference type.
Definition: vector.hpp:426
static vector const const_view_array(ARRAY const &v, size_t n=0)
C++ version of gsl_vector _const_view_array().
Definition: vector.hpp:1799
bool operator==(vector const &v) const
Two vector objects are identically equal if their elements are identical.
Definition: vector.hpp:292
double max() const
C++ version of gsl_vector_max().
Definition: vector.hpp:1393
double value_type
A container must have a value_type.
Definition: vector.hpp:421
const_iterator end() const
Get iterator pointing beyond last vector element.
Definition: vector.hpp:1160
vector(block &b, size_t const offset, size_t const n, size_t const stride=1)
C++ version of gsl_vector_alloc_from_block().
Definition: vector.hpp:1560
size_t use_count() const
Find how many vector objects share this pointer.
Definition: vector.hpp:1336
int sub(vector const &b)
C++ version of gsl_vector_sub().
Definition: vector.hpp:1441
bool operator>=(vector const &v) const
A container needs to define an ordering for sorting.
Definition: vector.hpp:413
vector()
The default constructor is only really useful for assigning to.
Definition: vector.hpp:87
int swap_elements(size_t const i, size_t const j)
C++ version of gsl_vector_swap_elements().
Definition: vector.hpp:1387
iterator end()
Get iterator pointing beyond last vector element.
Definition: vector.hpp:1152
int add(vector const &b)
C++ version of gsl_vector_add().
Definition: vector.hpp:1435
reverse_iterator rend()
Get iterator pointing beyond last vector element.
Definition: vector.hpp:1244
vector & operator=(vector &&v)
Move operator.
Definition: vector.hpp:323
bool operator<=(vector const &v) const
A container needs to define an ordering for sorting.
Definition: vector.hpp:401
vector(V &v, size_t const stride=1)
Construct from an object that implements data() and size().
Definition: vector.hpp:217
double * data()
Give access to the data block.
Definition: vector.hpp:1177
double get(size_t const i) const
C++ version of gsl_vector_get().
Definition: vector.hpp:1508
int scale(double const x)
C++ version of gsl_vector_scale().
Definition: vector.hpp:1459
static vector const const_view_array_with_stride(double const *base, size_t stride, size_t n)
C++ version of gsl_vector_const_view_array_with_stride().
Definition: vector.hpp:1632
~vector()
The destructor only deletes the pointers if count reaches zero.
Definition: vector.hpp:252
size_t max_index() const
C++ version of gsl_vector_max_index().
Definition: vector.hpp:1410
vector(size_t const n)
The default constructor creates a new vector with n elements.
Definition: vector.hpp:98
int isneg() const
C++ version of gsl_vector_isneg().
Definition: vector.hpp:1497
iterator begin()
Get iterator pointing to first vector element.
Definition: vector.hpp:1137
double sum(vector const &a) const
C++ version of gsl_vector_sum().
Definition: vector.hpp:1482
void minmax_index(size_t &imin, size_t &imax) const
C++ version of gsl_vector_minmax_index().
Definition: vector.hpp:1428
const_iterator::difference_type difference_type
A container must have a difference_type.
Definition: vector.hpp:1126
bool operator<(vector const &v) const
A container needs to define an ordering for sorting.
Definition: vector.hpp:347
vector(vector &&v)
Move constructor.
Definition: vector.hpp:313
void set_zero()
C++ version of gsl_vector_set_zero().
Definition: vector.hpp:1358
value_type const & const_reference
A container must have a constant reference type.
Definition: vector.hpp:431
double * ptr(size_t const i)
C++ version of gsl_vector_ptr().
Definition: vector.hpp:1520
int ispos() const
C++ version of gsl_vector_ispos().
Definition: vector.hpp:1492
gsl_vector * ccgsl_pointer
The shared pointer.
Definition: vector.hpp:1309
vector & operator=(vector const &v)
The assignment operator.
Definition: vector.hpp:190
value_type * pointer
A container must have a pointer type.
Definition: vector.hpp:436
void minmax_index(size_t *imin, size_t *imax) const
C++ version of gsl_vector_minmax_index().
Definition: vector.hpp:1421
static vector const const_view_array_with_stride(ARRAY const &base, size_t stride, size_t n=0)
C++ version of gsl_vector_const_view_array_with_stride().
Definition: vector.hpp:1818
int fread(FILE *stream)
C++ version of gsl_vector_fread().
Definition: vector.hpp:1532
vector subvector(size_t i, size_t n)
C++ version of gsl_vector_subvector().
Definition: vector.hpp:1676
size_t * count
The shared reference count.
Definition: vector.hpp:1313
vector(vector const &v)
The copy constructor.
Definition: vector.hpp:172
void set(size_t const i, double x)
C++ version of gsl_vector_set().
Definition: vector.hpp:1514
void minmax(double *min_out, double *max_out) const
C++ version of gsl_vector_minmax().
Definition: vector.hpp:1404
gsl_vector const * get() const
Get the gsl_vector.
Definition: vector.hpp:1325
vector subvector_with_stride(size_t i, size_t stride, size_t n)
C++ version of gsl_vector_subvectorwith_stride().
Definition: vector.hpp:1690
double & operator[](size_t const n)
Get element at position n by reference ([] operator).
Definition: vector.hpp:1260
int mul(vector const &b)
C++ version of gsl_vector_mul().
Definition: vector.hpp:1447
int add_constant(double const x)
C++ version of gsl_vector_add_constant().
Definition: vector.hpp:1465
int memcpy(vector const &src)
C++ version of gsl_vector_memcpy().
Definition: vector.hpp:1375
iterator_t< true > reverse_iterator
The reverse_iterator type.
Definition: vector.hpp:1121
static vector view_array(ARRAY &v, size_t n=0)
C++ version of gsl_vector_view_array().
Definition: vector.hpp:1762
size_t min_index() const
C++ version of gsl_vector_min_index().
Definition: vector.hpp:1415
double const & operator[](size_t const n) const
Get element at position n by reference ([] operator).
Definition: vector.hpp:1283
const_reverse_iterator rend() const
Get iterator pointing beyond last vector element.
Definition: vector.hpp:1251
int fprintf(FILE *stream, char const *format) const
C++ version of gsl_vector_fprintf().
Definition: vector.hpp:1551
vector(std::initializer_list< double > initializer_list)
Could construct from a std::initializer_list in C++11.
Definition: vector.hpp:150
static vector const const_view_array(double const *v, size_t n)
C++ version of gsl_vector _const_view_array().
Definition: vector.hpp:1619
bool operator>(vector const &v) const
A container needs to define an ordering for sorting.
Definition: vector.hpp:374
int reverse()
C++ version of gsl_vector_reverse().
Definition: vector.hpp:1380
static vector alloc_col_from_matrix(matrix &m, size_t const j)
C++ version of gsl_vector_alloc_col_from_matrix().
static double get(gsl_vector const *v, size_t const i)
C++ version of get().
Definition: vector.hpp:1890
double const * data() const
Give access to the data block.
Definition: vector.hpp:1191
int fwrite(FILE *stream) const
C++ version of gsl_vector_fwrite().
Definition: vector.hpp:1538
int set_basis(size_t i)
C++ version of gsl_vector_set_basis().
Definition: vector.hpp:1369
vector clone() const
The clone function.
Definition: vector.hpp:241
double beta(rng const &r, double const a, double const b)
C++ version of gsl_ran_beta().
Definition: randist.hpp:262
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
Definition: rstat.hpp:299
double b(int order, double qq)
C++ version of gsl_sf_mathieu_b().
Definition: sf_mathieu.hpp:298
double a(int order, double qq)
C++ version of gsl_sf_mathieu_a().
Definition: sf_mathieu.hpp:272
gsl_sf_result result
Typedef for gsl_sf_result.
Definition: sf_result.hpp:30
The gsl package creates an interface to the GNU Scientific Library for C++.
Definition: blas.hpp:34