C-XSC - A C++ Class Library for Extended Scientific Computing
2.5.4
|
00001 /* 00002 ** CXSC is a C++ library for eXtended Scientific Computing (V 2.5.4) 00003 ** 00004 ** Copyright (C) 1990-2000 Institut fuer Angewandte Mathematik, 00005 ** Universitaet Karlsruhe, Germany 00006 ** (C) 2000-2014 Wiss. Rechnen/Softwaretechnologie 00007 ** Universitaet Wuppertal, Germany 00008 ** 00009 ** This library is free software; you can redistribute it and/or 00010 ** modify it under the terms of the GNU Library General Public 00011 ** License as published by the Free Software Foundation; either 00012 ** version 2 of the License, or (at your option) any later version. 00013 ** 00014 ** This library is distributed in the hope that it will be useful, 00015 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 ** Library General Public License for more details. 00018 ** 00019 ** You should have received a copy of the GNU Library General Public 00020 ** License along with this library; if not, write to the Free 00021 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 */ 00023 00024 /* CVS $Id: intvector.inl,v 1.19 2014/01/30 17:23:45 cxsc Exp $ */ 00025 00026 #ifndef _CXSC_INTVECTOR_INL_INCLUDED 00027 #define _CXSC_INTVECTOR_INL_INCLUDED 00028 00029 #include "intvector.hpp" 00030 00031 namespace cxsc { 00032 00033 INLINE intvector::intvector () throw():dat(NULL),l(1),u(0),size(0) 00034 { 00035 } 00036 00037 INLINE intvector::intvector(const int &i) throw():l(1),u(i),size(i) 00038 { 00039 dat=new int[i]; 00040 } 00041 00042 #ifdef OLD_CXSC 00043 INLINE intvector::intvector(const class index &i) throw():l(1),u(i._int()),size(i._int()) 00044 { 00045 dat=new int[i._int()]; 00046 } 00047 #endif 00048 00049 INLINE intvector::intvector(const int &i1,const int &i2) 00050 #if(CXSC_INDEX_CHECK) 00051 throw(ERROR_INTVECTOR_WRONG_BOUNDARIES,ERROR_INTVECTOR_NO_MORE_MEMORY):l(i1),u(i2),size(i2-i1+1) 00052 #else 00053 throw():l(i1),u(i2),size(i2-i1+1) 00054 #endif 00055 { 00056 #if(CXSC_INDEX_CHECK) 00057 if(i1>i2) cxscthrow(ERROR_INTVECTOR_WRONG_BOUNDARIES("intvector::intvector(const int &i1,const int &i2)")); 00058 #endif 00059 dat=new int[size]; 00060 } 00061 00062 INLINE intvector::intvector(const intvector_slice &rs) throw():l(rs.start),u(rs.end),size(rs.end-rs.start+1) 00063 { 00064 dat=new int[size]; 00065 for(int i=0, j=l-rs.l;i<size;i++,j++) 00066 dat[i]=rs.dat[j]; 00067 } 00068 00069 INLINE intvector::intvector(const intvector &v) throw():l(v.l),u(v.u),size(v.size) 00070 { 00071 dat=new int[size]; 00072 for (int i=0;i<size;i++) 00073 dat[i]=v.dat[i]; 00074 } 00075 00076 INLINE int & intvector_slice::operator [](const int &i) 00077 #if(CXSC_INDEX_CHECK) 00078 throw(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC) 00079 #else 00080 throw() 00081 #endif 00082 { 00083 #if(CXSC_INDEX_CHECK) 00084 if(i<start||i>end) cxscthrow(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC("int & intvector_slice::operator [](const int &i)")); 00085 #endif 00086 return dat[i-l]; 00087 } 00088 00089 INLINE const int & intvector_slice::operator [](const int &i) const 00090 #if(CXSC_INDEX_CHECK) 00091 throw(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC) 00092 #else 00093 throw() 00094 #endif 00095 { 00096 #if(CXSC_INDEX_CHECK) 00097 if(i<start||i>end) cxscthrow(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC("int & intvector_slice::operator [](const int &i)")); 00098 #endif 00099 return dat[i-l]; 00100 } 00101 00102 INLINE const int & intvector::operator [](const int &i) const 00103 #if(CXSC_INDEX_CHECK) 00104 throw(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC) 00105 #else 00106 throw() 00107 #endif 00108 { 00109 #if(CXSC_INDEX_CHECK) 00110 if(i<l||i>u) cxscthrow(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC("int & intvector::operator [](const int &i)")); 00111 #endif 00112 return dat[i-l]; 00113 } 00114 00115 INLINE int & intvector::operator [](const int &i) 00116 #if(CXSC_INDEX_CHECK) 00117 throw(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC) 00118 #else 00119 throw() 00120 #endif 00121 { 00122 #if(CXSC_INDEX_CHECK) 00123 if(i<l||i>u) cxscthrow(ERROR_INTVECTOR_ELEMENT_NOT_IN_VEC("int & intvector::operator [](const int &i)")); 00124 #endif 00125 return dat[i-l]; 00126 } 00127 00134 INLINE intvector_slice intvector::operator ()(const int &i) 00135 #if(CXSC_INDEX_CHECK) 00136 throw(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG) 00137 #else 00138 throw() 00139 #endif 00140 { 00141 #if(CXSC_INDEX_CHECK) 00142 if(1<l||i>u) cxscthrow(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG("intvector_slice intvector::operator ()(const int &i)")); 00143 #endif 00144 return intvector_slice(*this,1,i); 00145 } 00146 00154 INLINE intvector_slice intvector::operator ()(const int &i1,const int &i2) 00155 #if(CXSC_INDEX_CHECK) 00156 throw(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG) 00157 #else 00158 throw() 00159 #endif 00160 { 00161 #if(CXSC_INDEX_CHECK) 00162 if(i1<l||i2>u) cxscthrow(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG("intvector_slice intvector::operator ()(const int &i1,const int &i2)")); 00163 #endif 00164 return intvector_slice(*this,i1,i2); 00165 } 00166 00167 INLINE intvector_slice intvector_slice::operator ()(const int &i) 00168 #if(CXSC_INDEX_CHECK) 00169 throw(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG) 00170 #else 00171 throw() 00172 #endif 00173 { 00174 #if(CXSC_INDEX_CHECK) 00175 if(1<start||i>end) cxscthrow(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG("intvector_slice intvector_slice::operator ()(const int &i)")); 00176 #endif 00177 return intvector_slice(*this,1,i); 00178 } 00179 00180 INLINE intvector_slice intvector_slice::operator ()(const int &i1,const int &i2) 00181 #if(CXSC_INDEX_CHECK) 00182 throw(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG) 00183 #else 00184 throw() 00185 #endif 00186 { 00187 #if(CXSC_INDEX_CHECK) 00188 if(i1<start||i2>end) cxscthrow(ERROR_INTVECTOR_SUB_ARRAY_TOO_BIG("intvector_slice intvector_slice::operator ()(const int &i1,const int &i2)")); 00189 #endif 00190 return intvector_slice(*this,i1,i2); 00191 } 00192 00193 INLINE intvector &intvector::operator =(const intvector &rv) throw() { return _vvassign<intvector,intvector,int>(*this,rv); } 00194 INLINE intvector &intvector::operator =(const int &r) throw() { return _vsassign<intvector,int>(*this,r); } 00195 INLINE intvector::operator void*() throw() { return _vvoid(*this); } 00196 00197 INLINE intvector_slice & intvector_slice::operator =(const intvector_slice &sl) 00198 #if(CXSC_INDEX_CHECK) 00199 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00200 #else 00201 throw() 00202 #endif 00203 { return _vsvsassign<intvector_slice,intvector_slice>(*this,sl); } 00204 INLINE intvector_slice & intvector_slice::operator =(const intvector &rv) 00205 #if(CXSC_INDEX_CHECK) 00206 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00207 #else 00208 throw() 00209 #endif 00210 { return _vsvassign<intvector_slice,intvector>(*this,rv); } 00211 INLINE intvector_slice & intvector_slice::operator =(const int &r) throw() { return _vssassign<intvector_slice,int>(*this,r); } 00212 INLINE intvector_slice::operator void*() throw() { return _vsvoid(*this); } 00213 00214 //======================== Vector Functions ============================= 00220 INLINE intvector _intvector(const int &r) throw() { return intvector(r); } 00221 00222 INLINE void Resize(intvector &rv) throw() { _vresize(rv); } 00223 INLINE void Resize(intvector &rv, const int &len) 00224 #if(CXSC_INDEX_CHECK) 00225 throw(ERROR__WRONG_BOUNDARIES<intvector>) 00226 #else 00227 throw() 00228 #endif 00229 { _vresize<intvector,int>(rv,len); } 00230 INLINE void Resize(intvector &rv, const int &lb, const int &ub) 00231 #if(CXSC_INDEX_CHECK) 00232 throw(ERROR__WRONG_BOUNDARIES<intvector>) 00233 #else 00234 throw() 00235 #endif 00236 { _vresize<intvector,int>(rv,lb,ub); } 00237 00238 INLINE intvector abs(const intvector &rv) throw() { return _vabs<intvector,intvector>(rv); } 00239 INLINE intvector abs(const intvector_slice &sl) throw() { return _vsabs<intvector_slice,intvector>(sl); } 00240 INLINE bool operator !(const intvector &rv) throw() { return _vnot(rv); } 00241 INLINE bool operator !(const intvector_slice &sl) throw() { return _vsnot(sl); } 00242 00243 //======================= Vector / Scalar =============================== 00244 00245 INLINE intvector operator *(const intvector &rv, const int &s) throw() { return _vsmult<intvector,int,intvector>(rv,s); } 00246 INLINE intvector operator *(const intvector_slice &sl, const int &s) throw() { return _vssmult<intvector_slice,int,intvector>(sl,s); } 00247 INLINE intvector operator *(const int &s, const intvector &rv) throw() { return _vsmult<intvector,int,intvector>(rv,s); } 00248 INLINE intvector operator *(const int &s, const intvector_slice &sl) throw() { return _vssmult<intvector_slice,int,intvector>(sl,s); } 00249 INLINE intvector &operator *=(intvector &rv,const int &r) throw() { return _vsmultassign(rv,r); } 00250 INLINE intvector_slice &intvector_slice::operator *=(const int &r) throw() { return _vssmultassign(*this,r); } 00251 00252 INLINE intvector operator /(const intvector &rv, const int &s) throw() { return _vsdiv<intvector,int,intvector>(rv,s); } 00253 INLINE intvector operator /(const intvector_slice &sl, const int &s) throw() { return _vssdiv<intvector_slice,int,intvector>(sl,s); } 00254 INLINE intvector &operator /=(intvector &rv,const int &r) throw() { return _vsdivassign(rv,r); } 00255 INLINE intvector_slice &intvector_slice::operator /=(const int &r) throw() { return _vssdivassign(*this,r); } 00256 00257 //======================= Vector / Vector =============================== 00258 00259 INLINE intvector &intvector::operator =(const intvector_slice &sl) throw() { return _vvsassign<intvector,intvector_slice,int>(*this,sl); } 00260 00261 00262 INLINE void accumulate(dotprecision &dp, const intvector & rv1, const intvector &rv2) 00263 #if(CXSC_INDEX_CHECK) 00264 throw(OP_WITH_WRONG_DIM) 00265 #else 00266 throw() 00267 #endif 00268 { _vvaccu(dp,rv1,rv2); } 00269 // INLINE void accumulate(dotprecision &dp, const intvector & rv1, const intmatrix_subv &rv2) throw(OP_WITH_WRONG_DIM); 00270 // INLINE void accumulate(dotprecision &dp, const intmatrix_subv & rv1, const intvector &rv2) throw(OP_WITH_WRONG_DIM); 00271 INLINE void accumulate(dotprecision &dp,const intvector_slice &sl,const intvector &rv) 00272 #if(CXSC_INDEX_CHECK) 00273 throw(OP_WITH_WRONG_DIM) 00274 #else 00275 throw() 00276 #endif 00277 { _vsvaccu(dp,sl,rv); } 00278 INLINE void accumulate(dotprecision &dp,const intvector &rv,const intvector_slice &sl) 00279 #if(CXSC_INDEX_CHECK) 00280 throw(OP_WITH_WRONG_DIM) 00281 #else 00282 throw() 00283 #endif 00284 { _vsvaccu(dp,sl,rv); } 00285 INLINE void accumulate(dotprecision &dp, const intvector_slice & sl1, const intvector_slice &sl2) 00286 #if(CXSC_INDEX_CHECK) 00287 throw(OP_WITH_WRONG_DIM) 00288 #else 00289 throw() 00290 #endif 00291 { _vsvsaccu(dp,sl1,sl2); } 00292 00293 INLINE const intvector &operator +(const intvector &rv) throw() { return rv; } 00294 INLINE intvector operator +(const intvector_slice &sl) throw() { return sl; } 00295 INLINE intvector operator +(const intvector &rv1, const intvector &rv2) 00296 #if(CXSC_INDEX_CHECK) 00297 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00298 #else 00299 throw() 00300 #endif 00301 { return _vvplus<intvector,intvector,intvector>(rv1,rv2); } 00302 INLINE intvector operator +(const intvector &rv, const intvector_slice &sl) 00303 #if(CXSC_INDEX_CHECK) 00304 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00305 #else 00306 throw() 00307 #endif 00308 { return _vvsplus<intvector,intvector_slice,intvector>(rv,sl); } 00309 INLINE intvector operator +(const intvector_slice &sl, const intvector &rv) 00310 #if(CXSC_INDEX_CHECK) 00311 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00312 #else 00313 throw() 00314 #endif 00315 { return _vvsplus<intvector,intvector_slice,intvector>(rv,sl); } 00316 INLINE intvector operator +(const intvector_slice &sl1, const intvector_slice &sl2) 00317 #if(CXSC_INDEX_CHECK) 00318 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00319 #else 00320 throw() 00321 #endif 00322 { return _vsvsplus<intvector_slice,intvector_slice,intvector>(sl1,sl2); } 00323 INLINE intvector & operator +=(intvector &rv1, const intvector &rv2) 00324 #if(CXSC_INDEX_CHECK) 00325 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00326 #else 00327 throw() 00328 #endif 00329 { return _vvplusassign(rv1,rv2); } 00330 INLINE intvector &operator +=(intvector &rv, const intvector_slice &sl) 00331 #if(CXSC_INDEX_CHECK) 00332 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00333 #else 00334 throw() 00335 #endif 00336 { return _vvsplusassign(rv,sl); } 00337 INLINE intvector_slice &intvector_slice::operator +=(const intvector &rv) 00338 #if(CXSC_INDEX_CHECK) 00339 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00340 #else 00341 throw() 00342 #endif 00343 { return _vsvplusassign(*this,rv); } 00344 INLINE intvector_slice &intvector_slice::operator +=(const intvector_slice &sl2) 00345 #if(CXSC_INDEX_CHECK) 00346 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00347 #else 00348 throw() 00349 #endif 00350 { return _vsvsplusassign(*this,sl2); } 00351 00352 INLINE intvector operator -(const intvector &rv) throw() { return _vminus(rv); } 00353 INLINE intvector operator -(const intvector_slice &sl) throw() { return _vsminus<intvector_slice,intvector>(sl); } 00354 INLINE intvector operator -(const intvector &rv1, const intvector &rv2) 00355 #if(CXSC_INDEX_CHECK) 00356 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00357 #else 00358 throw() 00359 #endif 00360 { return _vvminus<intvector,intvector,intvector>(rv1,rv2); } 00361 INLINE intvector operator -(const intvector &rv, const intvector_slice &sl) 00362 #if(CXSC_INDEX_CHECK) 00363 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00364 #else 00365 throw() 00366 #endif 00367 { return _vvsminus<intvector,intvector_slice,intvector>(rv,sl); } 00368 INLINE intvector operator -(const intvector_slice &sl, const intvector &rv) 00369 #if(CXSC_INDEX_CHECK) 00370 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00371 #else 00372 throw() 00373 #endif 00374 { return _vsvminus<intvector_slice,intvector,intvector>(sl,rv); } 00375 INLINE intvector operator -(const intvector_slice &sl1, const intvector_slice &sl2) 00376 #if(CXSC_INDEX_CHECK) 00377 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00378 #else 00379 throw() 00380 #endif 00381 { return _vsvsminus<intvector_slice,intvector_slice,intvector>(sl1,sl2); } 00382 INLINE intvector & operator -=(intvector &rv1, const intvector &rv2) 00383 #if(CXSC_INDEX_CHECK) 00384 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00385 #else 00386 throw() 00387 #endif 00388 { return _vvminusassign(rv1,rv2); } 00389 INLINE intvector &operator -=(intvector &rv, const intvector_slice &sl) 00390 #if(CXSC_INDEX_CHECK) 00391 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00392 #else 00393 throw() 00394 #endif 00395 { return _vvsminusassign(rv,sl); } 00396 INLINE intvector_slice &intvector_slice::operator -=(const intvector &rv) 00397 #if(CXSC_INDEX_CHECK) 00398 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00399 #else 00400 throw() 00401 #endif 00402 { return _vsvminusassign(*this,rv); } 00403 INLINE intvector_slice &intvector_slice::operator -=(const intvector_slice &sl2) 00404 #if(CXSC_INDEX_CHECK) 00405 throw(ERROR__OP_WITH_WRONG_DIM<intvector>) 00406 #else 00407 throw() 00408 #endif 00409 { return _vsvsminusassign(*this,sl2); } 00410 00411 INLINE bool operator ==(const intvector &rv1, const intvector &rv2) throw() { return _vveq(rv1,rv2); } 00412 INLINE bool operator ==(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvseq(sl1,sl2); } 00413 INLINE bool operator ==(const intvector_slice &sl, const intvector &rv) throw() { return _vsveq(sl,rv); } 00414 INLINE bool operator ==(const intvector &rv, const intvector_slice &sl) throw() { return _vsveq(sl,rv); } 00415 INLINE bool operator !=(const intvector &rv1, const intvector &rv2) throw() { return _vvneq(rv1,rv2); } 00416 INLINE bool operator !=(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvsneq(sl1,sl2); } 00417 INLINE bool operator !=(const intvector_slice &sl, const intvector &rv) throw() { return _vsvneq(sl,rv); } 00418 INLINE bool operator !=(const intvector &rv, const intvector_slice &sl) throw() { return _vsvneq(sl,rv); } 00419 INLINE bool operator <(const intvector &rv1, const intvector &rv2) throw() { return _vvless(rv1,rv2); } 00420 INLINE bool operator <(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvsless(sl1,sl2); } 00421 INLINE bool operator < (const intvector_slice &sl, const intvector &rv) throw() { return _vsvless(sl,rv); } 00422 INLINE bool operator < (const intvector &rv, const intvector_slice &sl) throw() { return _vvsless(rv,sl); } 00423 INLINE bool operator <=(const intvector &rv1, const intvector &rv2) throw() { return _vvleq(rv1,rv2); } 00424 INLINE bool operator <=(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvsleq(sl1,sl2); } 00425 INLINE bool operator <=(const intvector_slice &sl, const intvector &rv) throw() { return _vsvleq(sl,rv); } 00426 INLINE bool operator <=(const intvector &rv, const intvector_slice &sl) throw() { return _vvsleq(rv,sl); } 00427 INLINE bool operator >(const intvector &rv1, const intvector &rv2) throw() { return _vvless(rv2,rv1); } 00428 INLINE bool operator >(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvsless(sl2,sl1); } 00429 INLINE bool operator >(const intvector_slice &sl, const intvector &rv) throw() { return _vvsless(rv,sl); } 00430 INLINE bool operator >(const intvector &rv, const intvector_slice &sl) throw() { return _vsvless(sl,rv); } 00431 INLINE bool operator >=(const intvector &rv1, const intvector &rv2) throw() { return _vvleq(rv2,rv1); } 00432 INLINE bool operator >=(const intvector_slice &sl1, const intvector_slice &sl2) throw() { return _vsvsleq(sl2,sl1); } 00433 INLINE bool operator >=(const intvector_slice &sl, const intvector &rv) throw() { return _vvsleq(rv,sl); } 00434 INLINE bool operator >=(const intvector &rv, const intvector_slice &sl) throw() { return _vsvleq(sl,rv); } 00435 00436 INLINE std::ostream &operator <<(std::ostream &s, const intvector &rv) throw() { return _vout(s,rv); } 00437 INLINE std::ostream &operator <<(std::ostream &o, const intvector_slice &sl) throw() { return _vsout(o,sl); } 00438 INLINE std::istream &operator >>(std::istream &s, intvector &rv) throw() { return _vin(s,rv); } 00439 INLINE std::istream &operator >>(std::istream &s, intvector_slice &rv) throw() { return _vsin(s,rv); } 00440 00441 INLINE intvector perminv(const intvector& x) { 00442 intvector p(0,VecLen(x)); 00443 for(int i=0 ; i<VecLen(x) ; i++) 00444 p[x[i+Lb(x)]] = i; 00445 return p; 00446 } 00447 00448 00449 } // namespace cxsc 00450 00451 #endif 00452