/**************************************************************************/ // Basic BERTU numerical vector (0-based [i] AND 1-based (i) indexing ) /* Define vectors running from 0 [i] and from 1 (i), respectively C.A. Bertulani - 03/03/2000 **************************************************************************/ #ifndef VEC_H #define VEC_H #include #include #include #include namespace BERTU { template class Vector { public: typedef Subscript size_type; typedef T value_type; typedef T element_type; typedef T* pointer; typedef T* iterator; typedef T& reference; typedef const T* const_iterator; typedef const T& const_reference; Subscript lbound() const { return 1;} protected: T* v_; T* vm1_; // pointer adjustment for optimzied 1-offset indexing Subscript n_; // internal helper function to create the array // of row pointers void initialize(Subscript N) { // adjust pointers so that they are 1-offset: // v_[] is the internal contiguous array, it is still 0-offset // assert(v_ == NULL); v_ = new T[N]; assert(v_ != NULL); vm1_ = v_-1; n_ = N; } void copy(const T* v) { Subscript N = n_; Subscript i; #ifdef BERTU_UNROLL_LOOPS Subscript Nmod4 = N & 3; Subscript N4 = N - Nmod4; for (i=0; i &A) : v_(0), vm1_(0), n_(0) { initialize(A.n_); copy(A.v_); } Vector(Subscript N, const T& value = T(0)) : v_(0), vm1_(0), n_(0) { initialize(N); set(value); } Vector(Subscript N, const T* v) : v_(0), vm1_(0), n_(0) { initialize(N); copy(v); } Vector(Subscript N, char *s) : v_(0), vm1_(0), n_(0) { initialize(N); std::istrstream ins(s); Subscript i; for (i=0; i> v_[i]; } // methods // Vector& newsize(Subscript N) { if (n_ == N) return *this; destroy(); initialize(N); return *this; } // assignments // Vector& operator=(const Vector &A) { if (v_ == A.v_) return *this; if (n_ == A.n_) // no need to re-alloc copy(A.v_); else { destroy(); initialize(A.n_); copy(A.v_); } return *this; } Vector& operator=(const T& scalar) { set(scalar); return *this; } inline Subscript dim() const { return n_; } inline Subscript size() const { return n_; } inline reference operator()(Subscript i) { #ifdef BERTU_BOUNDS_CHECK assert(1<=i); assert(i <= n_) ; #endif return vm1_[i]; } inline const_reference operator() (Subscript i) const { #ifdef BERTU_BOUNDS_CHECK assert(1<=i); assert(i <= n_) ; #endif return vm1_[i]; } inline reference operator[](Subscript i) { #ifdef BERTU_BOUNDS_CHECK assert(0<=i); assert(i < n_) ; #endif return v_[i]; } inline const_reference operator[](Subscript i) const { #ifdef BERTU_BOUNDS_CHECK assert(0<=i); assert(i < n_) ; #endif return v_[i]; } }; /* *************************** I/O ********************************/ template std::ostream& operator<<(std::ostream &s, const Vector &A) { Subscript N=A.dim(); s << N << endl; for (Subscript i=0; i std::istream & operator>>(std::istream &s, Vector &A) { Subscript N; s >> N; if ( !(N == A.size() )) { A.newsize(N); } for (Subscript i=0; i> A[i]; return s; } // *******************[ basic matrix algorithms ]*************************** template Vector operator+(const Vector &A, const Vector &B) { Subscript N = A.dim(); assert(N==B.dim()); Vector tmp(N); Subscript i; for (i=0; i Vector operator-(const Vector &A, const Vector &B) { Subscript N = A.dim(); assert(N==B.dim()); Vector tmp(N); Subscript i; for (i=0; i Vector operator*(const Vector &A, const Vector &B) { Subscript N = A.dim(); assert(N==B.dim()); Vector tmp(N); Subscript i; for (i=0; i T dot_prod(const Vector &A, const Vector &B) { Subscript N = A.dim(); assert(N == B.dim()); Subscript i; T sum = 0; for (i=0; i