ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
eigen_genherm.hpp
Go to the documentation of this file.
1/*
2 * $Id: eigen_genherm.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_GENHERM_HPP
22#define CCGSL_EIGEN_GENHERM_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 genherm_workspace( size_t const n ){
56 ccgsl_pointer = gsl_eigen_genherm_alloc( n );
57 // just plausibly we could allocate genherm_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_genherm_free( ccgsl_pointer );
61 throw e;
62 }
63 *count = 1; // initially there is just one reference to ccgsl_pointer
64 }
70 explicit genherm_workspace( gsl_eigen_genherm_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_genherm_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_genherm_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 genherm_workspace( std::move( v ) ).swap( *this );
123 return *this;
124 }
125#endif
126 // Refines equality comparable
127 // == operator
134 bool operator==( genherm_workspace const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
135 // != operator
142 bool operator!=( genherm_workspace const& v ) const { return not operator==( v ); }
143 // Refines forward container
144 // Refines less than comparable
145 // operator<
154 bool operator<( genherm_workspace const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
155 // operator>
164 bool operator>( genherm_workspace const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
165 // operator<=
174 bool operator<=( genherm_workspace const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
175 // operator>=
184 bool operator>=( genherm_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_genherm_workspace* ccgsl_pointer;
213 size_t* count;
214 public:
215 // shared reference functions
220 gsl_eigen_genherm_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 };
255 return gsl_eigen_genherm( 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 genhermv_workspace( size_t const n ){
275 ccgsl_pointer = gsl_eigen_genhermv_alloc( n );
276 // just plausibly we could allocate genhermv_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_genhermv_free( ccgsl_pointer );
280 throw e;
281 }
282 *count = 1; // initially there is just one reference to ccgsl_pointer
283 }
289 explicit genhermv_workspace( gsl_eigen_genhermv_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_genhermv_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_genhermv_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 genhermv_workspace( std::move( v ) ).swap( *this );
342 return *this;
343 }
344#endif
345 // Refines equality comparable
346 // == operator
353 bool operator==( genhermv_workspace const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
354 // != operator
361 bool operator!=( genhermv_workspace const& v ) const { return not operator==( v ); }
362 // Refines forward container
363 // Refines less than comparable
364 // operator<
373 bool operator<( genhermv_workspace const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
374 // operator>
383 bool operator>( genhermv_workspace const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
384 // operator<=
393 bool operator<=( genhermv_workspace const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
394 // operator>=
403 bool operator>=( genhermv_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_genhermv_workspace* ccgsl_pointer;
432 size_t* count;
433 public:
434 // shared reference functions
439 gsl_eigen_genhermv_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_genhermv( A.get(), B.get(), eval.get(), evec.get(), w.get() ); }
476 }
477}
478
479#endif
Workspace for genhermetric matrices.
size_t size() const
The size of the workspace.
genherm_workspace & operator=(genherm_workspace const &v)
The assignment operator.
bool empty() const
Find if the genherm_workspace is empty.
genherm_workspace()
The default constructor is only really useful for assigning to.
bool operator<(genherm_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator==(genherm_workspace const &v) const
Two genherm_workspace are identically equal if their elements are identical.
bool unique() const
Find if this is the only object sharing the gsl_eigen_genherm_workspace.
bool operator!=(genherm_workspace const &v) const
Two genherm_workspace are different equal if their elements are not identical.
bool operator>(genherm_workspace const &v) const
A container needs to define an ordering for sorting.
genherm_workspace(gsl_eigen_genherm_workspace *v)
Could construct from a gsl_eigen_genherm_workspace.
bool operator<=(genherm_workspace const &v) const
A container needs to define an ordering for sorting.
genherm_workspace(genherm_workspace const &v)
The copy constructor.
gsl_eigen_genherm_workspace * ccgsl_pointer
The shared pointer.
bool operator>=(genherm_workspace const &v) const
A container needs to define an ordering for sorting.
size_t use_count() const
Find how many genherm_workspace objects share this pointer.
~genherm_workspace()
The destructor only deletes the pointers if count reaches zero.
gsl_eigen_genherm_workspace * get() const
Get the gsl_eigen_genherm_workspace.
genherm_workspace(size_t const n)
The default constructor creates a new genherm_workspace with n elements.
void swap(genherm_workspace &v)
Swap two genherm_workspace.
genherm_workspace(genherm_workspace &&v)
Move constructor.
size_t * count
The shared reference count.
genherm_workspace & operator=(genherm_workspace &&v)
Move operator.
Workspace for real genhermetric matrices (eigenvectors and eigenvalues)
bool empty() const
Find if the genhermv_workspace is empty.
gsl_eigen_genhermv_workspace * get() const
Get the gsl_eigen_genhermv_workspace.
genhermv_workspace & operator=(genhermv_workspace const &v)
The assignment operator.
genhermv_workspace(gsl_eigen_genhermv_workspace *v)
Could construct from a gsl_eigen_genhermv_workspace.
genhermv_workspace(size_t const n)
The default constructor creates a new genhermv_workspace with n elements.
size_t size() const
The size of the workspace.
gsl_eigen_genhermv_workspace * ccgsl_pointer
The shared pointer.
bool unique() const
Find if this is the only object sharing the gsl_eigen_genhermv_workspace.
bool operator>=(genhermv_workspace const &v) const
A container needs to define an ordering for sorting.
size_t * count
The shared reference count.
size_t use_count() const
Find how many genhermv_workspace objects share this pointer.
genhermv_workspace(genhermv_workspace const &v)
The copy constructor.
bool operator==(genhermv_workspace const &v) const
Two genhermv_workspace are identically equal if their elements are identical.
genhermv_workspace(genhermv_workspace &&v)
Move constructor.
bool operator<=(genhermv_workspace const &v) const
A container needs to define an ordering for sorting.
~genhermv_workspace()
The destructor only deletes the pointers if count reaches zero.
genhermv_workspace & operator=(genhermv_workspace &&v)
Move operator.
bool operator>(genhermv_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator!=(genhermv_workspace const &v) const
Two genhermv_workspace are different equal if their elements are not identical.
void swap(genhermv_workspace &v)
Swap two genhermv_workspace.
genhermv_workspace()
The default constructor is only really useful for assigning to.
bool operator<(genhermv_workspace const &v) const
A container needs to define an ordering for sorting.
This class handles matrix_complex objects as shared handles.
gsl_matrix_complex * get()
Get the gsl_matrix_complex.
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 genherm(gsl::matrix_complex &A, gsl::matrix_complex &B, gsl::vector &eval, genherm_workspace &w)
C++ version of gsl_eigen_genherm().
int genhermv(gsl::matrix_complex &A, gsl::matrix_complex &B, gsl::vector &eval, gsl::matrix_complex &evec, genhermv_workspace &w)
C++ version of gsl_eigen_genhermv().
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