ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
eigen_gensymm.hpp
Go to the documentation of this file.
1/*
2 * $Id: eigen_gensymm.hpp 125 2012-02-19 18:18:25Z jdl3 $
3 * Copyright (C) 2010, 2011, 2012 John D Lamb
4 * Enum copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
5 *
6 * This program 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 2 of the License, or (at
9 * your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21#ifndef CCGSL_EIGEN_GENSYMM_HPP
22#define CCGSL_EIGEN_GENSYMM_HPP
23
24#include<gsl/gsl_eigen.h>
25#include<new>
26#include<iterator>
27
28#include"vector.hpp"
29#include"vector_complex.hpp"
30#include"matrix.hpp"
31
32namespace gsl {
36 namespace eigen {
41 public:
46 ccgsl_pointer = 0;
47 count = 0; // initially nullptr will do
48 }
49 // Refines random access container
50 // Refines assignable
55 explicit gensymm_workspace( size_t const n ){
56 ccgsl_pointer = gsl_eigen_gensymm_alloc( n );
57 // just plausibly we could allocate gensymm_workspace but not count
58 try { count = new size_t; } catch( std::bad_alloc& e ){
59 // try to tidy up before rethrowing
60 gsl_eigen_gensymm_free( ccgsl_pointer );
61 throw e;
62 }
63 *count = 1; // initially there is just one reference to ccgsl_pointer
64 }
70 explicit gensymm_workspace( gsl_eigen_gensymm_workspace* v ){
71 ccgsl_pointer = v;
72 // just plausibly we could fail to allocate count: no further action needed.
73 count = new size_t;
74 *count = 1; // initially there is just one reference to ccgsl_pointer
75 }
76 // copy constructor
82 count = v.count; if( count != 0 ) ++*count; }
83 // assignment operator
89 // first, possibly delete anything pointed to by this
90 if( count == 0 or --*count == 0 ){
91 if( ccgsl_pointer != 0 ) gsl_eigen_gensymm_free( ccgsl_pointer );
92 delete count;
93 } // Then copy
94 ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this;
95 }
96 // destructor
101 if( count == 0 or --*count == 0 ){
102 // could have allocated null pointer
103 if( ccgsl_pointer != 0 ) gsl_eigen_gensymm_free( ccgsl_pointer );
104 delete count;
105 }
106 }
107#ifdef __GXX_EXPERIMENTAL_CXX0X__
113 std::swap( count, v.count );
114 v.ccgsl_pointer = nullptr;
115 }
122 gensymm_workspace( std::move( v ) ).swap( *this );
123 return *this;
124 }
125#endif
126 // Refines equality comparable
127 // == operator
134 bool operator==( gensymm_workspace const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
135 // != operator
142 bool operator!=( gensymm_workspace const& v ) const { return not operator==( v ); }
143 // Refines forward container
144 // Refines less than comparable
145 // operator<
154 bool operator<( gensymm_workspace const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
155 // operator>
164 bool operator>( gensymm_workspace const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
165 // operator<=
174 bool operator<=( gensymm_workspace const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
175 // operator>=
184 bool operator>=( gensymm_workspace const& v ) const { return ccgsl_pointer >= v.ccgsl_pointer; }
189 bool empty() const { return ccgsl_pointer == 0; }
190 // swap() --- should work even if sizes don't match
197 std::swap( ccgsl_pointer, v.ccgsl_pointer );
198 std::swap( count, v.count );
199 }
204 size_t size() const { return ccgsl_pointer == 0 ? 0 : ccgsl_pointer->size; }
205 private:
209 gsl_eigen_gensymm_workspace* ccgsl_pointer;
213 size_t* count;
214 public:
215 // shared reference functions
220 gsl_eigen_gensymm_workspace* get() const { return ccgsl_pointer; }
226 bool unique() const { return count != 0 and *count == 1; }
231 size_t use_count() const { return count == 0 ? 0 : *count; }
237#ifdef __GXX_EXPERIMENTAL_CXX0X__
238 explicit
239#endif
240 operator bool() const { return ccgsl_pointer != 0; }
241 };
253 inline int gensymm( gsl::matrix& A, gsl::matrix& B,
255 return gsl_eigen_gensymm( A.get(), B.get(), eval.get(), w.get() ); }
260 public:
265 ccgsl_pointer = 0;
266 count = 0; // initially nullptr will do
267 }
268 // Refines random access container
269 // Refines assignable
274 explicit gensymmv_workspace( size_t const n ){
275 ccgsl_pointer = gsl_eigen_gensymmv_alloc( n );
276 // just plausibly we could allocate gensymmv_workspace but not count
277 try { count = new size_t; } catch( std::bad_alloc& e ){
278 // try to tidy up before rethrowing
279 gsl_eigen_gensymmv_free( ccgsl_pointer );
280 throw e;
281 }
282 *count = 1; // initially there is just one reference to ccgsl_pointer
283 }
289 explicit gensymmv_workspace( gsl_eigen_gensymmv_workspace* v ){
290 ccgsl_pointer = v;
291 // just plausibly we could fail to allocate count: no further action needed.
292 count = new size_t;
293 *count = 1; // initially there is just one reference to ccgsl_pointer
294 }
295 // copy constructor
301 count = v.count; if( count != 0 ) ++*count; }
302 // assignment operator
308 // first, possibly delete anything pointed to by this
309 if( count == 0 or --*count == 0 ){
310 if( ccgsl_pointer != 0 ) gsl_eigen_gensymmv_free( ccgsl_pointer );
311 delete count;
312 } // Then copy
313 ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this;
314 }
315 // destructor
320 if( count == 0 or --*count == 0 ){
321 // could have allocated null pointer
322 if( ccgsl_pointer != 0 ) gsl_eigen_gensymmv_free( ccgsl_pointer );
323 delete count;
324 }
325 }
326#ifdef __GXX_EXPERIMENTAL_CXX0X__
332 std::swap( count, v.count );
333 v.ccgsl_pointer = nullptr;
334 }
341 gensymmv_workspace( std::move( v ) ).swap( *this );
342 return *this;
343 }
344#endif
345 // Refines equality comparable
346 // == operator
353 bool operator==( gensymmv_workspace const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
354 // != operator
361 bool operator!=( gensymmv_workspace const& v ) const { return not operator==( v ); }
362 // Refines forward container
363 // Refines less than comparable
364 // operator<
373 bool operator<( gensymmv_workspace const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
374 // operator>
383 bool operator>( gensymmv_workspace const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
384 // operator<=
393 bool operator<=( gensymmv_workspace const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
394 // operator>=
403 bool operator>=( gensymmv_workspace const& v ) const { return ccgsl_pointer >= v.ccgsl_pointer; }
408 bool empty() const { return ccgsl_pointer == 0; }
409 // swap() --- should work even if sizes don't match
416 std::swap( ccgsl_pointer, v.ccgsl_pointer );
417 std::swap( count, v.count );
418 }
423 size_t size() const { return ccgsl_pointer == 0 ? 0 : ccgsl_pointer->size; }
424 private:
428 gsl_eigen_gensymmv_workspace* ccgsl_pointer;
432 size_t* count;
433 public:
434 // shared reference functions
439 gsl_eigen_gensymmv_workspace* get() const { return ccgsl_pointer; }
445 bool unique() const { return count != 0 and *count == 1; }
450 size_t use_count() const { return count == 0 ? 0 : *count; }
456#ifdef __GXX_EXPERIMENTAL_CXX0X__
457 explicit
458#endif
459 operator bool() const { return ccgsl_pointer != 0; }
460 };
475 return gsl_eigen_gensymmv( A.get(), B.get(), eval.get(), evec.get(), w.get() ); }
476 }
477}
478
479#endif
Workspace for gensymmetric matrices.
gensymm_workspace(gensymm_workspace &&v)
Move constructor.
gensymm_workspace & operator=(gensymm_workspace &&v)
Move operator.
size_t use_count() const
Find how many gensymm_workspace objects share this pointer.
bool operator!=(gensymm_workspace const &v) const
Two gensymm_workspace are different equal if their elements are not identical.
bool operator<(gensymm_workspace const &v) const
A container needs to define an ordering for sorting.
gensymm_workspace(gsl_eigen_gensymm_workspace *v)
Could construct from a gsl_eigen_gensymm_workspace.
void swap(gensymm_workspace &v)
Swap two gensymm_workspace.
bool empty() const
Find if the gensymm_workspace is empty.
size_t size() const
The size of the workspace.
bool operator>=(gensymm_workspace const &v) const
A container needs to define an ordering for sorting.
gensymm_workspace & operator=(gensymm_workspace const &v)
The assignment operator.
bool unique() const
Find if this is the only object sharing the gsl_eigen_gensymm_workspace.
bool operator>(gensymm_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator==(gensymm_workspace const &v) const
Two gensymm_workspace are identically equal if their elements are identical.
gsl_eigen_gensymm_workspace * get() const
Get the gsl_eigen_gensymm_workspace.
size_t * count
The shared reference count.
bool operator<=(gensymm_workspace const &v) const
A container needs to define an ordering for sorting.
gsl_eigen_gensymm_workspace * ccgsl_pointer
The shared pointer.
gensymm_workspace(size_t const n)
The default constructor creates a new gensymm_workspace with n elements.
gensymm_workspace(gensymm_workspace const &v)
The copy constructor.
gensymm_workspace()
The default constructor is only really useful for assigning to.
~gensymm_workspace()
The destructor only deletes the pointers if count reaches zero.
Workspace for real gensymmetric matrices (eigenvectors and eigenvalues)
gensymmv_workspace & operator=(gensymmv_workspace &&v)
Move operator.
size_t use_count() const
Find how many gensymmv_workspace objects share this pointer.
size_t size() const
The size of the workspace.
bool empty() const
Find if the gensymmv_workspace is empty.
bool unique() const
Find if this is the only object sharing the gsl_eigen_gensymmv_workspace.
bool operator==(gensymmv_workspace const &v) const
Two gensymmv_workspace are identically equal if their elements are identical.
gensymmv_workspace(gensymmv_workspace &&v)
Move constructor.
bool operator<=(gensymmv_workspace const &v) const
A container needs to define an ordering for sorting.
size_t * count
The shared reference count.
gsl_eigen_gensymmv_workspace * get() const
Get the gsl_eigen_gensymmv_workspace.
gensymmv_workspace()
The default constructor is only really useful for assigning to.
bool operator!=(gensymmv_workspace const &v) const
Two gensymmv_workspace are different equal if their elements are not identical.
gensymmv_workspace & operator=(gensymmv_workspace const &v)
The assignment operator.
~gensymmv_workspace()
The destructor only deletes the pointers if count reaches zero.
gensymmv_workspace(gsl_eigen_gensymmv_workspace *v)
Could construct from a gsl_eigen_gensymmv_workspace.
gensymmv_workspace(size_t const n)
The default constructor creates a new gensymmv_workspace with n elements.
void swap(gensymmv_workspace &v)
Swap two gensymmv_workspace.
bool operator>=(gensymmv_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator>(gensymmv_workspace const &v) const
A container needs to define an ordering for sorting.
gsl_eigen_gensymmv_workspace * ccgsl_pointer
The shared pointer.
gensymmv_workspace(gensymmv_workspace const &v)
The copy constructor.
bool operator<(gensymmv_workspace const &v) const
A container needs to define an ordering for sorting.
This class handles matrix objects as shared handles.
Definition: matrix.hpp:72
gsl_matrix * get()
Get the gsl_matrix.
Definition: matrix.hpp:1207
This class handles vector objects as shared handles.
Definition: vector.hpp:74
int eval(double const x, vector &B, workspace &w)
C++ version of gsl_bspline_eval().
Definition: bspline.hpp:309
int gensymm(gsl::matrix &A, gsl::matrix &B, gsl::vector &eval, gensymm_workspace &w)
C++ version of gsl_eigen_gensymm().
int gensymmv(gsl::matrix &A, gsl::matrix &B, gsl::vector &eval, gsl::matrix &evec, gensymmv_workspace &w)
C++ version of gsl_eigen_gensymmv().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
Definition: rstat.hpp:299
The gsl package creates an interface to the GNU Scientific Library for C++.
Definition: blas.hpp:34