00001 #include <iostream> 00002 #include <iomanip> 00003 #include "MagVec.h" 00004 00005 00006 MagVec::MagVec() { 00007 00008 Nele = 0; 00009 ptr_data = 0; // set pointer to null 00010 00011 } 00012 00013 00014 MagVec::MagVec(int N) { 00015 00016 Nele = N; 00017 ptr_data = new double[Nele]; 00018 for(int i=0;i<Nele;i++) *(ptr_data+i)=0.; 00019 } 00020 00021 MagVec::MagVec(const MagVec& v) { 00022 00023 Nele = v.Nele; 00024 ptr_data = new double[Nele]; 00025 for(int i=0;i<Nele;i++) *(ptr_data+i)=v[i]; 00026 00027 } 00028 00029 MagVec::~MagVec() 00030 {delete [] ptr_data;} 00031 00032 00033 double& MagVec::operator[](int i) { 00034 00035 if( i < 0 ) { std::cerr << "MagVec: Index < zero! " << std::endl; return ptr_data[0]; }; 00036 if( i >= Nele ) { std::cerr << "MagVec: Index too large! " << std::endl; return ptr_data[0]; }; 00037 00038 return *(ptr_data+i); 00039 00040 } 00041 00042 const double& MagVec::operator[](int i) const { 00043 00044 if( i < 0 ) { std::cerr << "MagVec: Index < zero! " << std::endl; return ptr_data[0]; }; 00045 if( i >= Nele ) { std::cerr << "MagVec: Index too large! " << std::endl; return ptr_data[0]; }; 00046 00047 return *(ptr_data+i); 00048 00049 } 00050 00051 MagVec& MagVec::operator=(const MagVec& v) { 00052 00053 if(Nele!=0 && Nele!=v.Nele) { 00054 std::cerr << "MagVec Assignment: size does not match!" << std::endl; return *this; 00055 } 00056 00057 if ( ptr_data != v.ptr_data ) { 00058 reSize(v.Nele); 00059 for(int i=0;i<Nele;i++) *(ptr_data+i) = v[i]; 00060 } 00061 00062 return *this; 00063 00064 } 00065 00066 MagVec MagVec::operator+(const MagVec& v) { 00067 00068 if( Nele != v.Nele ) { std::cerr << "operator+: vectors size does not match!" << std::endl; return *this; }; 00069 MagVec b(Nele); 00070 00071 for (int i=0;i<Nele;i++) b[i] = *(ptr_data+i) + v[i]; 00072 return b; 00073 00074 } 00075 00076 MagVec MagVec::operator+(const MagVec& v) const { 00077 00078 if( Nele != v.Nele ) { std::cerr << "operator+: vectors size does not match!" << std::endl; return *this; }; 00079 MagVec b(Nele); 00080 00081 for (int i=0;i<Nele;i++) b[i] = *(ptr_data+i) + v[i]; 00082 return b; 00083 00084 } 00085 00086 MagVec& MagVec::operator+=(const MagVec& v) { 00087 00088 if( Nele != v.Nele ) { std::cerr << "operator+=: vectors size does not match!" << std::endl; return *this; }; 00089 00090 for (int i=0;i<Nele;i++) *(ptr_data+i)+=v[i]; 00091 return *this; 00092 00093 } 00094 00095 MagVec MagVec::operator-(const MagVec& v) { 00096 00097 if( Nele != v.Nele ) { std::cerr << "operator+: vectors size does not match!" << std::endl; return *this; } 00098 MagVec b(Nele); 00099 00100 for (int i=0;i<Nele;i++) b[i] = *(ptr_data+i) - v[i]; 00101 return b; 00102 00103 } 00104 00105 MagVec MagVec::operator-(const MagVec& v) const{ 00106 00107 if( Nele != v.Nele ) { std::cerr << "operator+: vectors size does not match!" << std::endl; return *this; } 00108 MagVec b(Nele); 00109 00110 for (int i=0;i<Nele;i++) b[i] = *(ptr_data+i) - v[i]; 00111 return b; 00112 00113 } 00114 00115 MagVec& MagVec::operator-=(const MagVec& v) { 00116 00117 if( Nele != v.Nele ) { std::cerr << "operator+=: vectors size does not match!" << std::endl; return *this; } 00118 00119 00120 00121 for (int i=0;i<Nele;i++) *(ptr_data+i)-=v[i]; 00122 return *this; 00123 00124 } 00125 00126 double MagVec::operator*(const MagVec& v) { 00127 double b=0.; 00128 if( Nele != v.Nele ) { std::cerr << "scalar product: vectors size does not match!" << std::endl; return b; } 00129 00130 for (int i=0;i<Nele;i++) b += *(ptr_data+i)*v[i]; 00131 return b; 00132 } 00133 00134 double MagVec::operator*(const MagVec& v) const { 00135 double b=0.; 00136 if( Nele != v.Nele ) { std::cerr << "scalar product: vectors size does not match!" << std::endl; return b; } 00137 00138 for (int i=0;i<Nele;i++) b += *(ptr_data+i)*v[i]; 00139 return b; 00140 } 00141 00142 00143 00144 MagVec& MagVec::operator*=(const double& d) { 00145 00146 for (int i=0;i<Nele;i++) *(ptr_data+i)*= d; 00147 00148 return *this; 00149 00150 } 00151 00152 00153 void MagVec::reSize(int Nnew) { 00154 00155 00156 if ( Nnew>=0 && Nnew != Nele ) { 00157 double* p = ptr_data; 00158 int Nele_old = Nele; 00159 ptr_data = new double[Nnew]; 00160 Nele = Nnew; 00161 int k = Nele <= Nele_old ? Nele : Nele_old; 00162 00163 p += k; 00164 double* q = ptr_data + k; 00165 while (q > ptr_data) *(--q) = *(--p); 00166 00167 delete [] p; 00168 } 00169 00170 00171 00172 } 00173 00174 int MagVec::n_elem() const { 00175 00176 return Nele; 00177 00178 }