C-XSC - A C++ Class Library for Extended Scientific Computing  2.5.4
vector.inl
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: vector.inl,v 1.28 2014/01/30 17:23:49 cxsc Exp $ */
00025 
00026 #ifndef _CXSC_VECTOR_INL_INCLUDED
00027 #define _CXSC_VECTOR_INL_INCLUDED
00028 
00029 #include "except.hpp"
00030 
00031 #ifdef CXSC_USE_BLAS
00032 #include "cxsc_blas.hpp"
00033 #endif
00034 
00035 namespace cxsc {
00036 int abs(int a);
00037 
00038         template <class V>
00039         TINLINE void _vresize(V &rv) throw()
00040         {
00041                 rv.size=rv.u=0;
00042                 rv.l=1;
00043                 delete [] rv.dat;
00044                 rv.dat=NULL;
00045         }
00046 
00047         template <class V,class S>
00048         TINLINE void _vresize(V &rv, const int &len)
00049 #if(CXSC_INDEX_CHECK)
00050                 throw(ERROR__WRONG_BOUNDARIES<V>)
00051 #else
00052         throw()
00053 #endif
00054         {
00055                 if(rv.size==len)
00056                         SetLb(rv,1);
00057                 else
00058                 {
00059 #if(CXSC_INDEX_CHECK)
00060                         if(len<0) cxscthrow(ERROR__WRONG_BOUNDARIES<V>(" Resize("+nameof(rv)+" &, const int &)"));
00061 #endif
00062                         S *ndat=new S[len];
00063                         int beg,end;
00064                         beg=(rv.l>1)?rv.l:1;
00065                         end=(rv.u<len)?rv.u:len;
00066                         for(int i=beg-1;i<end;i++)
00067                                 ndat[i]=rv.dat[i-rv.l+1];
00068                         delete [] rv.dat;
00069                         rv.dat=ndat;
00070                         rv.size=rv.u=len;
00071                         rv.l=1;
00072                 }
00073         }
00074 
00075         template <class V,class S>
00076         TINLINE void _vresize(V &rv, const int &lb, const int &ub)
00077 #if(CXSC_INDEX_CHECK)
00078                 throw(ERROR__WRONG_BOUNDARIES<V>)
00079 #else
00080         throw()
00081 #endif
00082         {
00083                 if(rv.size==ub-lb+1)
00084                         SetUb(rv,ub);
00085                 else
00086                 {               
00087                         rv.size=ub-lb+1;
00088 #if(CXSC_INDEX_CHECK)
00089                         if(rv.size<0) cxscthrow(ERROR__WRONG_BOUNDARIES<V>("void Resize("+nameof(rv)+" &, const int &, const int &)"));
00090 #endif
00091                         S *ndat=new S[rv.size];
00092                         int beg,end;
00093                         beg=(rv.l>lb)?rv.l:lb;
00094                         end=(rv.u<ub)?rv.u:ub;
00095                         for(int i=beg;i<=end;i++)
00096                                 ndat[i-lb]=rv.dat[i-rv.l];
00097                         delete [] rv.dat;
00098                         rv.dat=ndat;
00099                         rv.l=lb;
00100                         rv.u=ub;
00101                 }
00102         }
00103 
00104         template <class V1,class V2,class S>
00105         TINLINE V1 &_vvassign(V1 &rv1,const V2 &rv2) throw()
00106         {
00107                 S *ndat=new S[rv2.size];
00108                 rv1.l=rv2.l;
00109                 rv1.u=rv2.u;
00110                 rv1.size=rv2.size;
00111                 
00112                 for (int i=0;i<rv2.size;i++)
00113                         ndat[i]=rv2.dat[i];
00114                 delete [] rv1.dat;
00115                 rv1.dat=ndat;
00116 
00117                 return rv1;
00118         }
00119 
00120         template <class V,class S>
00121         TINLINE V & _vsassign(V &rv,const S &r) throw()
00122         {
00123                 for (int i=0;i<rv.size;i++)
00124                         rv.dat[i]=r;
00125 
00126                 return rv;
00127         }
00128 
00129         template <class VS1,class VS2>
00130         TINLINE VS1 & _vsvsassign(VS1 &sl1,const VS2 &sl2)
00131 #if(CXSC_INDEX_CHECK)
00132                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00133 #else
00134         throw()
00135 #endif
00136         {
00137 #if(CXSC_INDEX_CHECK)
00138                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" "+nameof(sl1)+"::operator =(const "+nameof(sl2)+" &)"));
00139 #endif
00140                 for (int i=sl1.start-sl1.l, j=sl2.start-sl2.l;i<=sl1.end-sl1.l;i++,j++)
00141                         sl1.dat[i]=sl2.dat[j];
00142                 return sl1;
00143         }
00144         
00145         template <class V,class VS,class S>
00146         TINLINE V & _vvsassign(V &rv,const VS &sl) throw()
00147         {
00148                 S *ndat=new S[sl.size];
00149                 rv.l=sl.start;
00150                 rv.u=sl.end;
00151                 rv.size=sl.size;
00152                 for (int i=sl.start-sl.l, j=0;j<rv.size;i++,j++)
00153                         ndat[j]=sl.dat[i];
00154                 delete [] rv.dat;
00155                 rv.dat=ndat;
00156                 return rv;
00157         }
00158 
00159         template <class VS,class V>
00160         TINLINE VS & _vsvassign(VS &sl,const V &rv)
00161 #if(CXSC_INDEX_CHECK)
00162                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
00163 #else
00164         throw()
00165 #endif
00166         {
00167 #if(CXSC_INDEX_CHECK)
00168                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" "+nameof(sl)+"::operator =(const "+nameof(rv)+" &)"));
00169 #endif
00170                 for (int i=sl.start-sl.l, j=0;j<sl.size;i++,j++)
00171                         sl.dat[i]=rv.dat[j];
00172                 return sl;
00173         }
00174 
00175         template <class VS,class S>
00176         TINLINE VS & _vssassign(VS &sl,const S &r) throw()
00177         {
00178                 for (int i=sl.start-sl.l;i<=sl.end-sl.l;i++)
00179                         sl.dat[i]=r;
00180                 return sl;
00181         }
00182 
00183         template <class DP,class V1,class V2>
00184         TINLINE void _vvaccu(DP &dp, const V1 & rv1, const V2 &rv2)
00185 #if(CXSC_INDEX_CHECK)
00186                 throw(OP_WITH_WRONG_DIM)
00187 #else
00188         throw()
00189 #endif
00190         {
00191 #if(CXSC_INDEX_CHECK)
00192                 if(rv1.size!=rv2.size) cxscthrow(OP_WITH_WRONG_DIM("void accumulate("+nameof(dp)+" &, const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00193 #endif
00194                 for(int i=0;i<rv1.size;i++)
00195                         accumulate(dp,rv1.dat[i],rv2.dat[i]);
00196         }
00197 
00198         template <class DP,class VS,class V>
00199         TINLINE void _vsvaccu(DP &dp, const VS & sl, const V &rv)
00200 #if(CXSC_INDEX_CHECK)
00201                 throw(OP_WITH_WRONG_DIM)
00202 #else
00203         throw()
00204 #endif
00205         {
00206 #if(CXSC_INDEX_CHECK)
00207                 if(sl.size!=rv.size) cxscthrow(OP_WITH_WRONG_DIM("void accumulate("+nameof(dp)+" &, const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00208 #endif
00209                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00210                         accumulate(dp,sl.dat[j],rv.dat[i]);
00211         }
00212 
00213         template <class V,class S,class E>
00214         TINLINE E _vsdiv(const V &rv, const S &s) throw()
00215         {
00216                 E p(rv.l,rv.u);
00217 
00218                 for(int i=0;i<rv.size;i++)
00219                         p.dat[i]=rv.dat[i]/s;
00220                 
00221                 return p;
00222         }
00223 
00224         template <class V,class S>
00225         TINLINE V &_vsdivassign(V &rv,const S &r) throw()
00226         {
00227                 for(int i=0;i<rv.size;i++)
00228                         rv.dat[i]/=r;
00229                 return rv;
00230         }
00231 
00232         template <class VS,class S,class E>
00233         TINLINE E _vssdiv(const VS &sl, const S &s) throw()
00234         {
00235                 E p(sl.start,sl.end);
00236 
00237                 for(int i=sl.start-sl.l;i<sl.size;i++)
00238                         p.dat[i]=sl.dat[i]/s;
00239                 
00240                 return p;
00241         }
00242 
00243         template <class V,class S,class E>
00244         TINLINE E _vsmult(const V &rv, const S &s) throw()
00245         {
00246                 E p(rv.l,rv.u);
00247 
00248                 for(int i=0;i<rv.size;i++)
00249                         p.dat[i]=rv.dat[i]*s;
00250                 
00251                 return p;
00252         }
00253 
00254         template <class VS,class S,class E>
00255         TINLINE E _vssmult(const VS &sl, const S &s) throw()
00256         {
00257                 E p(sl.start,sl.end);
00258 
00259                 for(int i=sl.start-sl.l,k=0;k<sl.size;i++,k++)
00260                         p.dat[k]=sl.dat[i]*s;
00261                 
00262                 return p;
00263         }
00264 
00265         template <class V1,class V2,class E>
00266         TINLINE E _vvlmult(const V1 & rv1, const V2 &rv2)
00267 #if(CXSC_INDEX_CHECK)
00268                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00269 #else
00270         throw()
00271 #endif
00272         {
00273 #if(CXSC_INDEX_CHECK)
00274                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00275 #endif
00276                 dotprecision dot(0.0);
00277                 accumulate(dot,rv1,rv2);
00278 /*                for(int i=0;i<rv1.size;i++)
00279                         accumulate(dotakku[0],rv1.dat[i],rv2.dat[i]);*/
00280 
00281                 return E(dot);
00282         }
00283 
00284         template <class VS,class V,class E>
00285         TINLINE E _vsvlmult(const VS & sl, const V &rv)
00286 #if(CXSC_INDEX_CHECK)
00287                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00288 #else
00289         throw()
00290 #endif
00291         {
00292 #if(CXSC_INDEX_CHECK)
00293                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00294 #endif
00295                 dotprecision dot(0.0);
00296                 accumulate(dot,sl,rv);
00297 /*                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00298                         accumulate(dotakku[0],sl.dat[j],rv.dat[i]);*/
00299 
00300                 return E(dot);
00301         }
00302 
00303         template <class VS1,class VS2,class E>
00304         TINLINE E _vsvslmult(const VS1 & sl1, const VS2 &sl2)
00305 #if(CXSC_INDEX_CHECK)
00306                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00307 #else
00308         throw()
00309 #endif
00310         {
00311 #if(CXSC_INDEX_CHECK)
00312                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00313 #endif
00314                 dotprecision dot(0.0);
00315                 accumulate(dot,sl1,sl2);
00316                   /*for(int i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size;i++,j++,k++)
00317                         accumulate(dotakku[0],sl1.dat[i],sl2.dat[j]);*/
00318 
00319                 return E(dot);
00320         }
00321 
00322         template <class V1,class V2,class E>
00323         TINLINE E _vvlimult(const V1 & rv1, const V2 &rv2)
00324 #if(CXSC_INDEX_CHECK)
00325                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00326 #else
00327         throw()
00328 #endif
00329         {
00330 #if(CXSC_INDEX_CHECK)
00331                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00332 #endif
00333                 idotprecision idot(0.0);
00334                 accumulate(idot,rv1,rv2);
00335 
00336                 return E(idot);
00337         }
00338 
00339         template <class VS,class V,class E>
00340         TINLINE E _vsvlimult(const VS & sl, const V &rv)
00341 #if(CXSC_INDEX_CHECK)
00342                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00343 #else
00344         throw()
00345 #endif
00346         {
00347 #if(CXSC_INDEX_CHECK)
00348                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00349 #endif
00350                 idotprecision idot(0.0);
00351                 accumulate(idot,sl,rv);
00352 
00353                 return E(idot);
00354         }
00355 
00356         template <class VS1,class VS2,class E>
00357         TINLINE E _vsvslimult(const VS1 & sl1, const VS2 &sl2)
00358 #if(CXSC_INDEX_CHECK)
00359                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00360 #else
00361         throw()
00362 #endif
00363         {
00364 #if(CXSC_INDEX_CHECK)
00365                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00366 #endif
00367                 idotprecision idot(0.0);
00368                 accumulate(idot,sl1,sl2);
00369 
00370                 return E(idot);
00371         }
00372 
00373         template <class V1,class V2,class E>
00374         TINLINE E _vvmult(const V1 & rv1, const V2 &rv2)
00375 #if(CXSC_INDEX_CHECK)
00376                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00377 #else
00378         throw()
00379 #endif
00380         {
00381 #if(CXSC_INDEX_CHECK)
00382                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00383 #endif
00384 
00385 #ifdef CXSC_USE_BLAS
00386                 if(opdotprec == 1) 
00387                 {
00388                         E ret;
00389                         blasdot(rv1,rv2,ret);
00390                         return ret;
00391                 } 
00392                 else
00393 #endif
00394                 {
00395                         dotprecision dot(0.0);
00396                         dot.set_k(opdotprec);
00397                         accumulate_approx(dot,rv1,rv2);
00398                         return rnd(dot);
00399                 }
00400 /*                 for(int i=0;i<rv1.size;i++)
00401                         accumulate(dotakku[0],rv1.dat[i],rv2.dat[i]);*/
00402 
00403         }
00404 
00405         template <class VS,class V,class E>
00406         TINLINE E _vsvmult(const VS & sl, const V &rv)
00407 #if(CXSC_INDEX_CHECK)
00408                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00409 #else
00410         throw()
00411 #endif
00412         {
00413 #if(CXSC_INDEX_CHECK)
00414                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00415 #endif
00416 #ifdef CXSC_USE_BLAS
00417                 if(opdotprec == 1) 
00418                 {
00419                         E ret;
00420                         blasdot(sl,rv,ret);
00421                         return ret;
00422                 } 
00423                 else
00424 #endif
00425                 {
00426                         dotprecision dot(0.0);
00427                         dot.set_k(opdotprec);
00428                         accumulate_approx(dot,sl,rv);
00429                         return rnd(dot);
00430                 }
00431                   /*for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00432                         accumulate(dotakku[0],sl.dat[j],rv.dat[i]);*/
00433 
00434         }
00435 
00436         template <class VS1,class VS2,class E>
00437         TINLINE E _vsvsmult(const VS1 & sl1, const VS2 &sl2)
00438 #if(CXSC_INDEX_CHECK)
00439                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00440 #else
00441         throw()
00442 #endif
00443         {
00444 #if(CXSC_INDEX_CHECK)
00445                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00446 #endif
00447 #ifdef CXSC_USE_BLAS
00448                 if(opdotprec == 1) 
00449                 {
00450                         E ret;
00451                         blasdot(sl1,sl2,ret);
00452                         return ret;
00453                 } 
00454                 else
00455 #endif
00456                 {
00457                         dotprecision dot(0.0);
00458                         dot.set_k(opdotprec);
00459                         accumulate_approx(dot,sl1,sl2);
00460                         return rnd(dot);
00461                 }
00462 /*                for(int i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size;i++,j++,k++)
00463                         accumulate(dotakku[0],sl1.dat[i],sl2.dat[j]);*/
00464 
00465         }
00466 
00467         template <class V1,class V2,class E>
00468         TINLINE E _vvimult(const V1 & rv1, const V2 &rv2)
00469 #if(CXSC_INDEX_CHECK)
00470                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00471 #else
00472         throw()
00473 #endif
00474         {
00475 #if(CXSC_INDEX_CHECK)
00476                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00477 #endif
00478 #ifdef CXSC_USE_BLAS
00479                 if(opdotprec == 1) 
00480                 {
00481                         E ret;
00482                         blasdot(rv1,rv2,ret);
00483                         return ret;
00484                 } 
00485                 else
00486 #endif
00487                 {
00488                         idotprecision idot(0.0);
00489                         idot.set_k(opdotprec);
00490                         accumulate(idot,rv1,rv2);
00491                         return rnd(idot);
00492                 }
00493 
00494         }
00495 
00496         template <class VS,class V,class E>
00497         TINLINE E _vsvimult(const VS & sl, const V &rv)
00498 #if(CXSC_INDEX_CHECK)
00499                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00500 #else
00501         throw()
00502 #endif
00503         {
00504 #if(CXSC_INDEX_CHECK)
00505                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00506 #endif
00507 #ifdef CXSC_USE_BLAS
00508                 if(opdotprec == 1) 
00509                 {
00510                         E ret;
00511                         blasdot(sl,rv,ret);
00512                         return ret;
00513                 } 
00514                 else
00515 #endif
00516                 {
00517                         idotprecision idot(0.0);
00518                         idot.set_k(opdotprec);
00519                         accumulate(idot,sl,rv);
00520                         return rnd(idot);
00521                 }
00522 
00523         }
00524 
00525         template <class VS1,class VS2,class E>
00526         TINLINE E _vsvsimult(const VS1 & sl1, const VS2 &sl2)
00527 #if(CXSC_INDEX_CHECK)
00528                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00529 #else
00530         throw()
00531 #endif
00532         {
00533 #if(CXSC_INDEX_CHECK)
00534                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00535 #endif
00536 #ifdef CXSC_USE_BLAS
00537                 if(opdotprec == 1) 
00538                 {
00539                         E ret;
00540                         blasdot(sl1,sl2,ret);
00541                         return ret;
00542                 } 
00543                 else
00544 #endif
00545                 {
00546                         idotprecision idot(0.0);
00547                         idot.set_k(opdotprec);
00548                         accumulate(idot,sl1,sl2);
00549                         return rnd(idot);
00550                 }
00551 
00552         }
00553 
00554         template <class V1,class V2,class E>
00555         TINLINE E _vvcmult(const V1 & rv1, const V2 &rv2)
00556 #if(CXSC_INDEX_CHECK)
00557                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00558 #else
00559         throw()
00560 #endif
00561         {
00562 #if(CXSC_INDEX_CHECK)
00563                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00564 #endif
00565 #ifdef CXSC_USE_BLAS
00566                 if(opdotprec == 1) 
00567                 {
00568                         E ret;
00569                         blasdot(rv1,rv2,ret);
00570                         return ret;
00571                 } 
00572                 else
00573 #endif
00574                 {
00575                         cdotprecision cdot(0.0);
00576                         cdot.set_k(opdotprec);
00577                         accumulate_approx(cdot,rv1,rv2);
00578                         return rnd(cdot);
00579                 }
00580 
00581         }
00582 
00583         template <class VS,class V,class E>
00584         TINLINE E _vsvcmult(const VS & sl, const V &rv)
00585 #if(CXSC_INDEX_CHECK)
00586                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00587 #else
00588         throw()
00589 #endif
00590         {
00591 #if(CXSC_INDEX_CHECK)
00592                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00593 #endif
00594 #ifdef CXSC_USE_BLAS
00595                 if(opdotprec == 1) 
00596                 {
00597                         E ret;
00598                         blasdot(sl,rv,ret);
00599                         return ret;
00600                 } 
00601                 else
00602 #endif
00603                 {
00604                         cdotprecision cdot(0.0);
00605                         cdot.set_k(opdotprec);
00606                         accumulate_approx(cdot,sl,rv);
00607                         return rnd(cdot);
00608                 }
00609 
00610         }
00611 
00612         template <class VS1,class VS2,class E>
00613         TINLINE E _vsvscmult(const VS1 & sl1, const VS2 &sl2)
00614 #if(CXSC_INDEX_CHECK)
00615                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00616 #else
00617         throw()
00618 #endif
00619         {
00620 #if(CXSC_INDEX_CHECK)
00621                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00622 #endif
00623 #ifdef CXSC_USE_BLAS
00624                 if(opdotprec == 1) 
00625                 {
00626                         E ret;
00627                         blasdot(sl1,sl2,ret);
00628                         return ret;
00629                 } 
00630                 else
00631 #endif
00632                 {
00633                         cdotprecision cdot(0.0);
00634                         cdot.set_k(opdotprec);
00635                         accumulate_approx(cdot,sl1,sl2);
00636                         return rnd(cdot);
00637                 }
00638 
00639         }
00640 
00641         template <class V1,class V2,class E>
00642         TINLINE E _vvcimult(const V1 & rv1, const V2 &rv2)
00643 #if(CXSC_INDEX_CHECK)
00644                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00645 #else
00646         throw()
00647 #endif
00648         {
00649 #if(CXSC_INDEX_CHECK)
00650                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(E())+" operator *(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00651 #endif
00652 #ifdef CXSC_USE_BLAS
00653                 if(opdotprec == 1) 
00654                 {
00655                         E ret;
00656                         blasdot(rv1,rv2,ret);
00657                         return ret;
00658                 } 
00659                 else
00660 #endif
00661                 {
00662                         cidotprecision cidot(0.0);
00663                         cidot.set_k(opdotprec);
00664                         accumulate(cidot,rv1,rv2);
00665                         return rnd(cidot);
00666                 }
00667 
00668         }
00669 
00670         template <class VS,class V,class E>
00671         TINLINE E _vsvcimult(const VS & sl, const V &rv)
00672 #if(CXSC_INDEX_CHECK)
00673                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00674 #else
00675         throw()
00676 #endif
00677         {
00678 #if(CXSC_INDEX_CHECK)
00679                 if(sl.size!=rv.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(E())+" operator *(const "+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00680 #endif
00681 #ifdef CXSC_USE_BLAS
00682                 if(opdotprec == 1) 
00683                 {
00684                         E ret;
00685                         blasdot(sl,rv,ret);
00686                         return ret;
00687                 } 
00688                 else
00689 #endif
00690                 {
00691                         cidotprecision cidot(0.0);
00692                         cidot.set_k(opdotprec);
00693                         accumulate(cidot,sl,rv);
00694                         return rnd(cidot);
00695                 }
00696 
00697         }
00698 
00699         template <class VS1,class VS2,class E>
00700         TINLINE E _vsvscimult(const VS1 & sl1, const VS2 &sl2)
00701 #if(CXSC_INDEX_CHECK)
00702                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00703 #else
00704         throw()
00705 #endif
00706         {
00707 #if(CXSC_INDEX_CHECK)
00708                 if(sl1.size!=sl2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(E())+" operator *(const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00709 #endif
00710 #ifdef CXSC_USE_BLAS
00711                 if(opdotprec == 1) 
00712                 {
00713                         E ret;
00714                         blasdot(sl1,sl2,ret);
00715                         return ret;
00716                 } 
00717                 else
00718 #endif
00719                 {
00720                         cidotprecision cidot(0.0);
00721                         cidot.set_k(opdotprec);
00722                         accumulate(cidot,sl1,sl2);
00723                         return rnd(cidot);
00724                 }
00725 
00726         }
00727 
00728         template <class V,class S>
00729         TINLINE V &_vsmultassign(V &rv,const S &r) throw()
00730         {
00731                 for(int i=0;i<rv.size;i++)
00732                         rv.dat[i]*=r;
00733                 return rv;
00734         }
00735 
00736         template <class VS,class S>
00737         TINLINE VS &_vssmultassign(VS &rv,const S &r) throw()
00738         {
00739                 for(int i=rv.start-rv.l;i<=rv.end-rv.l;i++)
00740                         rv.dat[i]*=r;
00741                 return rv;
00742         }
00743 
00744         template <class VS,class S>
00745         TINLINE VS &_vssdivassign(VS &rv,const S &r) throw()
00746         {
00747                 for(int i=rv.start-rv.l;i<=rv.end-rv.l;i++)
00748                         rv.dat[i]/=r;
00749                 return rv;
00750         }
00751 
00752         template <class V1,class V2,class E>
00753         TINLINE E _vvplus(const V1 &rv1, const V2 &rv2)
00754 #if(CXSC_INDEX_CHECK)
00755                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00756 #else
00757         throw()
00758 #endif
00759         {
00760                 E sum(rv1.l,rv1.u);
00761 
00762 #if(CXSC_INDEX_CHECK)
00763                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" operator +(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00764 #endif
00765                 for (int i=0;i<rv1.size;i++)
00766                         sum.dat[i]=rv1.dat[i]+rv2.dat[i];
00767                 return sum;
00768         }
00769 
00770         template <class V,class VS,class E>
00771         TINLINE E _vvsplus(const V &rv,const VS &sl)
00772 #if(CXSC_INDEX_CHECK)
00773                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00774 #else
00775         throw()
00776 #endif
00777         {
00778                 E sum(rv.l,rv.u);
00779 
00780 #if(CXSC_INDEX_CHECK)
00781                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(sum)+" operator +(const "+nameof(rv)+" &,const "+nameof(sl)+" &)"));
00782 #endif
00783                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00784                         sum.dat[i]=rv.dat[i]+sl.dat[j];
00785                 return sum;
00786         }
00787 
00788         template <class VS1,class VS2,class E>
00789         TINLINE E _vsvsplus(const VS1 &s1,const VS2 &s2)
00790 #if(CXSC_INDEX_CHECK)
00791                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00792 #else
00793         throw()
00794 #endif
00795         {
00796                 E sum(s1.start,s1.end);
00797 
00798 #if(CXSC_INDEX_CHECK)
00799                 if(s1.size!=s2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sum)+" operator +(const "+nameof(s1)+" &,const "+nameof(s2)+" &)"));
00800 #endif
00801                 for(int i=s1.start-s1.l,j=s2.start-s2.l,k=0;k<s1.size;i++,j++,k++)
00802                         sum.dat[k]=s1.dat[i]+s2.dat[j];
00803                 return sum;
00804         }
00805 
00806         template <class VS1,class VS2,class E>
00807         TINLINE E _vsvsminus(const VS1 &s1,const VS2 &s2)
00808 #if(CXSC_INDEX_CHECK)
00809                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00810 #else
00811         throw()
00812 #endif
00813         {
00814                 E sum(s1.start,s1.end);
00815 
00816 #if(CXSC_INDEX_CHECK)
00817                 if(s1.size!=s2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sum)+" operator -(const "+nameof(s1)+" &,const "+nameof(s2)+" &)"));
00818 #endif
00819                 for(int i=s1.start-s1.l,j=s2.start-s2.l,k=0;k<s1.size;i++,j++,k++)
00820                         sum.dat[k]=s1.dat[i]-s2.dat[j];
00821                 return sum;
00822         }
00823 
00824         template <class V1,class V2>
00825         TINLINE V1 &_vvplusassign(V1 &rv1, const V2 &rv2)
00826 #if(CXSC_INDEX_CHECK)
00827                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00828 #else
00829         throw()
00830 #endif
00831         {
00832 #if(CXSC_INDEX_CHECK)
00833                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" & operator +=("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00834 #endif
00835                 for(int i=0;i<rv1.size;i++)
00836                         rv1.dat[i]+=rv2.dat[i];
00837                 return rv1;
00838         }
00839 
00840         template <class V,class VS>
00841         TINLINE V &_vvsplusassign(V &rv, const VS &sl)
00842 #if(CXSC_INDEX_CHECK)
00843                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00844 #else
00845         throw()
00846 #endif
00847         {
00848 #if(CXSC_INDEX_CHECK)
00849                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" & operator +=("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
00850 #endif
00851                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00852                         rv.dat[i]+=sl.dat[j];
00853                 return rv;
00854         }
00855 
00856         template <class VS,class V>
00857         TINLINE VS &_vsvplusassign(VS &sl, const V &rv)
00858 #if(CXSC_INDEX_CHECK)
00859                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
00860 #else
00861         throw()
00862 #endif
00863         {
00864 #if(CXSC_INDEX_CHECK)
00865                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" & operator +=("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00866 #endif
00867                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00868                         sl.dat[j]+=rv.dat[i];
00869                 return sl;
00870         }
00871 
00872         template <class VS1,class VS2>
00873         TINLINE VS1 &_vsvsplusassign(VS1 &sl1, const VS2 &sl2)
00874 #if(CXSC_INDEX_CHECK)
00875                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00876 #else
00877         throw()
00878 #endif
00879         {
00880 #if(CXSC_INDEX_CHECK)
00881                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" & operator +=("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00882 #endif
00883                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
00884                         sl1.dat[j]+=sl2.dat[k];
00885                 return sl1;
00886         }
00887 
00888         template <class VS1,class VS2>
00889         TINLINE VS1 &_vsvsminusassign(VS1 &sl1, const VS2 &sl2)
00890 #if(CXSC_INDEX_CHECK)
00891                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
00892 #else
00893         throw()
00894 #endif
00895         {
00896 #if(CXSC_INDEX_CHECK)
00897                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" & operator +=("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
00898 #endif
00899                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
00900                         sl1.dat[j]-=sl2.dat[k];
00901                 return sl1;
00902         }
00903 
00904         template <class V1,class V2>
00905         TINLINE V1 &_vvminusassign(V1 &rv1, const V2 &rv2)
00906 #if(CXSC_INDEX_CHECK)
00907                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
00908 #else
00909         throw()
00910 #endif
00911         {
00912 #if(CXSC_INDEX_CHECK)
00913                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" & operator -=("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00914 #endif
00915                 for(int i=0;i<rv1.size;i++)
00916                         rv1.dat[i]-=rv2.dat[i];
00917                 return rv1;
00918         }
00919 
00920         template <class V,class VS>
00921         TINLINE V &_vvsminusassign(V &rv, const VS &sl)
00922 #if(CXSC_INDEX_CHECK)
00923                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
00924 #else
00925         throw()
00926 #endif
00927         {
00928 #if(CXSC_INDEX_CHECK)
00929                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" & operator -=("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
00930 #endif
00931                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00932                         rv.dat[i]-=sl.dat[j];
00933                 return rv;
00934         }
00935 
00936         template <class VS,class V>
00937         TINLINE VS &_vsvminusassign(VS &sl, const V &rv)
00938 #if(CXSC_INDEX_CHECK)
00939                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
00940 #else
00941         throw()
00942 #endif
00943         {
00944 #if(CXSC_INDEX_CHECK)
00945                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" & operator -=("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
00946 #endif
00947                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
00948                         sl.dat[j]-=rv.dat[i];
00949                 return sl;
00950         }
00951 
00952         template <class V>
00953         TINLINE V _vminus(const V &rv) throw()
00954         {
00955                 V sum(rv.l,rv.u);
00956 
00957                 for (int i=0;i<rv.size;i++)
00958                         sum.dat[i]= -rv.dat[i];
00959 
00960                 return sum;
00961         }
00962 
00963         template <class VS,class V>
00964         TINLINE V _vsminus(const VS &sl) throw()
00965         {
00966                 V sum(sl.start,sl.end);
00967 
00968                 for (int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
00969                         sum.dat[i]= -sl.dat[j];
00970 
00971                 return sum;
00972         }
00973 
00974         template <class V1,class V2,class E>
00975         TINLINE E _vvminus(const V1 &rv1, const V2 &rv2)
00976 #if(CXSC_INDEX_CHECK)
00977                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
00978 #else
00979         throw()
00980 #endif
00981         {
00982                 E sum(rv1.l,rv1.u);
00983 
00984 #if(CXSC_INDEX_CHECK)
00985                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator -(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
00986 #endif
00987                 for (int i=0;i<rv1.size;i++)
00988                                 sum.dat[i]=rv1.dat[i]-rv2.dat[i];
00989                 return sum; 
00990         }
00991 
00992         template <class V,class VS,class E>
00993         TINLINE E _vvsminus(const V &rv, const VS &sl)
00994 #if(CXSC_INDEX_CHECK)
00995                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
00996 #else
00997         throw()
00998 #endif
00999         {
01000                 E sum(rv.l,rv.u);
01001 
01002 #if(CXSC_INDEX_CHECK)
01003                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator -(const "+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01004 #endif
01005                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01006                         sum.dat[i]=rv.dat[i]-sl.dat[j];
01007 
01008                 return sum;
01009         }
01010         
01011         template <class VS,class V,class E>
01012         TINLINE E _vsvminus(const VS &sl,const V &rv)
01013 #if(CXSC_INDEX_CHECK)
01014                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01015 #else
01016         throw()
01017 #endif
01018         {
01019                 E sum(sl.start,sl.end);
01020 
01021 #if(CXSC_INDEX_CHECK)
01022                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator -(const "+nameof(sl)+" &,const "+nameof(rv)+" &)"));
01023 #endif
01024                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01025                         sum.dat[i]=sl.dat[j]-rv.dat[i];
01026                 return sum;
01027         }
01028 
01029         template <class V1,class V2,class E>
01030         TINLINE E _vvconv(const V1 &rv1, const V2 &rv2)
01031 #if(CXSC_INDEX_CHECK)
01032                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01033 #else
01034         throw()
01035 #endif
01036         {
01037                 E sum(rv1.l,rv1.u);
01038 
01039 #if(CXSC_INDEX_CHECK)
01040                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator +(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01041 #endif
01042                 for (int i=0;i<rv1.size;i++)
01043                         sum.dat[i]=rv1.dat[i]|rv2.dat[i];
01044                 return sum;
01045         }
01046 
01047         template <class V,class VS,class E>
01048         TINLINE E _vvsconv(const V &rv,const VS &sl)
01049 #if(CXSC_INDEX_CHECK)
01050                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01051 #else
01052         throw()
01053 #endif
01054         {
01055                 E sum(rv.l,rv.u);
01056 
01057 #if(CXSC_INDEX_CHECK)
01058                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator +(const "+nameof(rv)+" &,const "+nameof(sl)+" &)"));
01059 #endif
01060                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01061                         sum.dat[i]=rv.dat[i]|sl.dat[j];
01062                 return sum;
01063         }
01064 
01065         template <class VS1,class VS2,class E>
01066         TINLINE E _vsvsconv(const VS1 &s1,const VS2 &s2)
01067 #if(CXSC_INDEX_CHECK)
01068                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01069 #else
01070         throw()
01071 #endif
01072         {
01073                 E sum(s1.start,s1.end);
01074 
01075 #if(CXSC_INDEX_CHECK)
01076                 if(s1.size!=s2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator +(const "+nameof(s1)+" &,const "+nameof(s2)+" &)"));
01077 #endif
01078                 for(int i=s1.start-s1.l,j=s2.start-s2.l,k=0;k<s1.size;i++,j++,k++)
01079                         sum.dat[k]=s1.dat[i]|s2.dat[j];
01080                 return sum;
01081         }
01082 
01083         template <class V1,class V2>
01084         TINLINE V1 &_vvconvassign(V1 &rv1, const V2 &rv2)
01085 #if(CXSC_INDEX_CHECK)
01086                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01087 #else
01088         throw()
01089 #endif
01090         {
01091 #if(CXSC_INDEX_CHECK)
01092                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" & operator +=("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01093 #endif
01094                 for(int i=0;i<rv1.size;i++)
01095                         rv1.dat[i]|=rv2.dat[i];
01096                 return rv1;
01097         }
01098 
01099         template <class V,class VS>
01100         TINLINE V &_vvsconvassign(V &rv, const VS &sl)
01101 #if(CXSC_INDEX_CHECK)
01102                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01103 #else
01104         throw()
01105 #endif
01106         {
01107 #if(CXSC_INDEX_CHECK)
01108                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" & operator +=("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01109 #endif
01110                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01111                         rv.dat[i]|=sl.dat[j];
01112                 return rv;
01113         }
01114 
01115         template <class VS,class V>
01116         TINLINE VS &_vsvconvassign(VS &sl, const V &rv)
01117 #if(CXSC_INDEX_CHECK)
01118                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01119 #else
01120         throw()
01121 #endif
01122         {
01123 #if(CXSC_INDEX_CHECK)
01124                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" & operator +=("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01125 #endif
01126                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01127                         sl.dat[j]|=rv.dat[i];
01128                 return sl;
01129         }
01130 
01131         template <class VS1,class VS2>
01132         TINLINE VS1 &_vsvsconvassign(VS1 &sl1, const VS2 &sl2)
01133 #if(CXSC_INDEX_CHECK)
01134                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01135 #else
01136         throw()
01137 #endif
01138         {
01139 #if(CXSC_INDEX_CHECK)
01140                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" & operator +=("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01141 #endif
01142                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01143                         sl1.dat[j]|=sl2.dat[k];
01144                 return sl1;
01145         }
01146 
01147         template <class V1,class V2,class E>
01148         TINLINE E _vvsect(const V1 &rv1, const V2 &rv2)
01149 #if(CXSC_INDEX_CHECK)
01150                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01151 #else
01152         throw()
01153 #endif
01154         {
01155                 E sum(rv1.l,rv1.u);
01156 
01157 #if(CXSC_INDEX_CHECK)
01158                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(sum)+" operator +(const "+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01159 #endif
01160                 for (int i=0;i<rv1.size;i++)
01161                         sum.dat[i]=rv1.dat[i]&rv2.dat[i];
01162                 return sum;
01163         }
01164 
01165         template <class V,class VS,class E>
01166         TINLINE E _vvssect(const V &rv,const VS &sl)
01167 #if(CXSC_INDEX_CHECK)
01168                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01169 #else
01170         throw()
01171 #endif
01172         {
01173                 E sum(rv.l,rv.u);
01174 
01175 #if(CXSC_INDEX_CHECK)
01176                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator +(const "+nameof(rv)+" &,const "+nameof(sl)+" &)"));
01177 #endif
01178                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01179                         sum.dat[i]=rv.dat[i]&sl.dat[j];
01180                 return sum;
01181         }
01182 
01183         template <class VS1,class VS2,class E>
01184         TINLINE E _vsvssect(const VS1 &s1,const VS2 &s2)
01185 #if(CXSC_INDEX_CHECK)
01186                 throw(ERROR__OP_WITH_WRONG_DIM<E>)
01187 #else
01188         throw()
01189 #endif
01190         {
01191                 E sum(s1.start,s1.end);
01192 
01193 #if(CXSC_INDEX_CHECK)
01194                 if(s1.size!=s2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<E>(nameof(sum)+" operator +(const "+nameof(s1)+" &,const "+nameof(s2)+" &)"));
01195 #endif
01196                 for(int i=s1.start-s1.l,j=s2.start-s2.l,k=0;k<s1.size;i++,j++,k++)
01197                         sum.dat[k]=s1.dat[i]&s2.dat[j];
01198                 return sum;
01199         }
01200 
01201         template <class V1,class V2>
01202         TINLINE V1 &_vvsectassign(V1 &rv1, const V2 &rv2)
01203 #if(CXSC_INDEX_CHECK)
01204                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01205 #else
01206         throw()
01207 #endif
01208         {
01209 #if(CXSC_INDEX_CHECK)
01210                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" & operator +=("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01211 #endif
01212                 for(int i=0;i<rv1.size;i++)
01213                         rv1.dat[i]&=rv2.dat[i];
01214                 return rv1;
01215         }
01216 
01217         template <class V,class VS>
01218         TINLINE V &_vvssectassign(V &rv, const VS &sl)
01219 #if(CXSC_INDEX_CHECK)
01220                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01221 #else
01222         throw()
01223 #endif
01224         {
01225 #if(CXSC_INDEX_CHECK)
01226                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" & operator +=("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01227 #endif
01228                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01229                         rv.dat[i]&=sl.dat[j];
01230                 return rv;
01231         }
01232 
01233         template <class VS,class V>
01234         TINLINE VS &_vsvsectassign(VS &sl, const V &rv)
01235 #if(CXSC_INDEX_CHECK)
01236                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01237 #else
01238         throw()
01239 #endif
01240         {
01241 #if(CXSC_INDEX_CHECK)
01242                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" & operator +=("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01243 #endif
01244                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01245                         sl.dat[j]&=rv.dat[i];
01246                 return sl;
01247         }
01248 
01249         template <class VS1,class VS2>
01250         TINLINE VS1 &_vsvssectassign(VS1 &sl1, const VS2 &sl2)
01251 #if(CXSC_INDEX_CHECK)
01252                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01253 #else
01254         throw()
01255 #endif
01256         {
01257 #if(CXSC_INDEX_CHECK)
01258                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" & operator +=("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01259 #endif
01260                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01261                         sl1.dat[j]&=sl2.dat[k];
01262                 return sl1;
01263         }
01264 
01265         template <class V1,class V2>
01266         TINLINE bool _vveq(const V1 &rv1, const V2 &rv2) throw()
01267         {
01268                 if(rv1.size!=rv2.size)
01269                         return(false);
01270 
01271                 int i;
01272                 for (i=0;i<rv1.size && rv1.dat[i]==rv2.dat[i];i++);
01273                 
01274                 return (i==rv1.size);
01275         }       
01276 
01277         template <class VS,class V>
01278         TINLINE bool _vsveq(const VS &sl, const V &rv) throw()
01279         {
01280                 if(sl.size!=rv.size)
01281                         return(false);
01282 
01283                 int i,j;
01284                 for (i=0,j=sl.start-sl.l;i<rv.size && sl.dat[j]==rv.dat[i];i++,j++);
01285                 
01286                 return (i==rv.size);
01287         }       
01288 
01289         template <class V1,class V2>
01290         TINLINE bool _vvneq(const V1 &rv1, const V2 &rv2) throw()
01291         {
01292                 if(rv1.size!=rv2.size)
01293                         return(true);
01294 
01295                 int i;
01296                 for (i=0;i<rv1.size && rv1.dat[i]==rv2.dat[i];i++);
01297                 
01298                 return (i!=rv1.size);
01299         }       
01300 
01301         template <class VS,class V>
01302         TINLINE bool _vsvneq(const VS &sl, const V &rv) throw()
01303         {
01304                 if(sl.size!=rv.size)
01305                         return(true);
01306 
01307                 int i,j;
01308                 for (i=0,j=sl.start-sl.l;i<rv.size && sl.dat[j]==rv.dat[i];i++,j++);
01309                 
01310                 return (i!=rv.size);
01311         }       
01312 
01313         template <class V1,class V2>
01314         TINLINE bool _vvless(const V1 &rv1, const V2 &rv2) throw()
01315         {
01316                 if(rv1.size!=rv2.size)
01317                         return(false);
01318                 
01319                 int i;
01320                 for(i=0;i<rv1.size&&(rv1.dat[i]<rv2.dat[i]);i++);
01321 
01322                 return (i==rv1.size);
01323         }
01324 
01325         template <class VS,class V>
01326         TINLINE bool _vsvless(const VS &sl, const V &rv) throw()
01327         {
01328                 if(sl.size!=rv.size)
01329                         return(false);
01330                 
01331                 int i,j;
01332                 for(i=sl.start-sl.l,j=0;j<sl.size&&(sl.dat[i]<rv.dat[j]);i++,j++);
01333 
01334                 return (j==sl.size);
01335         }
01336 
01337         template <class V1,class V2>
01338         TINLINE bool _vvleq(const V1 &rv1, const V2 &rv2) throw()
01339         {
01340                 if(rv1.size!=rv2.size)
01341                         return(false);
01342                 
01343                 int i;
01344                 for(i=0;i<rv1.size&&(rv1.dat[i]<=rv2.dat[i]);i++);
01345 
01346                 return (i==rv1.size);
01347         }
01348 
01349         template <class VS,class V>
01350         TINLINE bool _vsvleq(const VS &sl, const V &rv) throw()
01351         {
01352                 if(sl.size!=rv.size)
01353                         return(false);
01354                 
01355                 int i,j;
01356                 for(i=sl.start-sl.l,j=0;j<sl.size&&(sl.dat[i]<=rv.dat[j]);i++,j++);
01357 
01358                 return (j==sl.size);
01359         }
01360 
01361         template <class V,class VS>
01362         TINLINE bool _vvsless(const V &rv, const VS &sl) throw()
01363         {
01364                 if(sl.size!=rv.size)
01365                         return(false);
01366                 
01367                 int i,j;
01368                 for(i=sl.start-sl.l,j=0;j<sl.size&&(sl.dat[i]>rv.dat[j]);i++,j++);
01369 
01370                 return (j==sl.size);
01371         }
01372 
01373         template <class V,class VS>
01374         TINLINE bool _vvsleq(const V &rv, const VS &sl) throw()
01375         {
01376                 if(sl.size!=rv.size)
01377                         return(false);
01378                 
01379                 int i,j;
01380                 for(i=sl.start-sl.l,j=0;j<sl.size&&(sl.dat[i]>=rv.dat[j]);i++,j++);
01381 
01382                 return (j==sl.size);
01383         }
01384 
01385         template <class V>
01386         TINLINE bool _vnot(const V &rv) throw()
01387         {
01388                 int i;
01389                 for(i=0;i<rv.size;i++)
01390                 {
01391                         if(!!rv.dat[i])
01392                                 return(false);
01393                 }
01394 
01395                 return true;
01396         }
01397 
01398         template <class V>
01399         TINLINE void *_vvoid(const V &rv) throw()
01400         {
01401                 for(int i=0;i<rv.size;i++)
01402                 {
01403                         if(!!rv.dat[i])
01404                                 return (void *)1;
01405                 }
01406 
01407                 return (void *)0;
01408         }
01409 
01410         template <class V>
01411         TINLINE V _vconj(const V &rv) throw()
01412         {
01413                 V erg(rv.l,rv.u);
01414                 
01415                 for(int i=0;i<rv.size;i++)
01416                         erg.dat[i]=conj(rv.dat[i]);
01417 
01418                 return erg;
01419         }
01420 
01421         template <class VS,class E>
01422         TINLINE E _vsconj(const VS &sl) throw()
01423         {
01424                 E erg(sl.start,sl.end);
01425                 
01426                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01427                         erg.dat[i]=conj(sl.dat[j]);
01428 
01429                 return erg;
01430         }
01431 
01432         template <class V,class E>
01433         TINLINE E _vabs(const V &rv) throw()
01434         {
01435                 E erg(rv.l,rv.u);
01436                 
01437                 for(int i=0;i<rv.size;i++)
01438                         erg.dat[i]=abs(rv.dat[i]);
01439 
01440                 return erg;
01441         }
01442 
01443         template <class VS,class E>
01444         TINLINE E _vsabs(const VS &sl) throw()
01445         {
01446                 E erg(sl.start,sl.end);
01447                 
01448                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01449                         erg.dat[i]=abs(sl.dat[j]);
01450 
01451                 return erg;
01452         }
01453 
01454         template <class V,class E>
01455         TINLINE E _vdiam(const V &rv) throw()
01456         {
01457                 E erg(rv.l,rv.u);
01458                 
01459                 for(int i=0;i<rv.size;i++)
01460                         erg.dat[i]=diam(rv.dat[i]);
01461 
01462                 return erg;
01463         }
01464 
01465         template <class VS,class E>
01466         TINLINE E _vsdiam(const VS &sl) throw()
01467         {
01468                 E erg(sl.start,sl.end);
01469                 
01470                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01471                         erg.dat[i]=diam(sl.dat[j]);
01472 
01473                 return erg;
01474         }
01475 
01476         template <class V,class E>
01477         TINLINE E _vmid(const V &rv) throw()
01478         {
01479                 E erg(rv.l,rv.u);
01480                 
01481                 for(int i=0;i<rv.size;i++)
01482                         erg.dat[i]=mid(rv.dat[i]);
01483 
01484                 return erg;
01485         }
01486 
01487         template <class VS,class E>
01488         TINLINE E _vsmid(const VS &sl) throw()
01489         {
01490                 E erg(sl.start,sl.end);
01491                 
01492                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01493                         erg.dat[i]=mid(sl.dat[j]);
01494 
01495                 return erg;
01496         }
01497 
01498         template <class V,class E>
01499         TINLINE E _vinf(const V &rv) throw()
01500         {
01501                 E erg(rv.l,rv.u);
01502                 
01503                 for(int i=0;i<rv.size;i++)
01504                         erg.dat[i]=Inf(rv.dat[i]);
01505 
01506                 return erg;
01507         }
01508 
01509         template <class VS,class E>
01510         TINLINE E _vsinf(const VS &sl) throw()
01511         {
01512                 E erg(sl.start,sl.end);
01513                 
01514                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01515                         erg.dat[i]=Inf(sl.dat[j]);
01516 
01517                 return erg;
01518         }
01519 
01520         template <class V,class E>
01521         TINLINE E _vsup(const V &rv) throw()
01522         {
01523                 E erg(rv.l,rv.u);
01524                 
01525                 for(int i=0;i<rv.size;i++)
01526                         erg.dat[i]=Sup(rv.dat[i]);
01527 
01528                 return erg;
01529         }
01530 
01531         template <class VS,class E>
01532         TINLINE E _vssup(const VS &sl) throw()
01533         {
01534                 E erg(sl.start,sl.end);
01535                 
01536                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01537                         erg.dat[i]=Sup(sl.dat[j]);
01538 
01539                 return erg;
01540         }
01541 
01542         template <class V,class E>
01543         TINLINE E _vre(const V &rv) throw()
01544         {
01545                 E erg(rv.l,rv.u);
01546                 
01547                 for(int i=0;i<rv.size;i++)
01548                         erg.dat[i]=Re(rv.dat[i]);
01549 
01550                 return erg;
01551         }
01552 
01553         template <class VS,class E>
01554         TINLINE E _vsre(const VS &sl) throw()
01555         {
01556                 E erg(sl.start,sl.end);
01557                 
01558                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01559                         erg.dat[i]=Re(sl.dat[j]);
01560 
01561                 return erg;
01562         }
01563 
01564         template <class V,class E>
01565         TINLINE E _vim(const V &rv) throw()
01566         {
01567                 E erg(rv.l,rv.u);
01568                 
01569                 for(int i=0;i<rv.size;i++)
01570                         erg.dat[i]=Im(rv.dat[i]);
01571 
01572                 return erg;
01573         }
01574 
01575         template <class VS,class E>
01576         TINLINE E _vsim(const VS &sl) throw()
01577         {
01578                 E erg(sl.start,sl.end);
01579                 
01580                 for(int i=0,j=sl.start-sl.l;i<sl.size;i++,j++)
01581                         erg.dat[i]=Im(sl.dat[j]);
01582 
01583                 return erg;
01584         }
01585 
01586         template <class V,class S>
01587         TINLINE V &_vsusetsup(V &v, const S &s) throw()
01588         {
01589                 for(int i=0;i<v.size;i++)
01590                         UncheckedSetInf(v.dat[i],s);
01591                 return v;
01592         }
01593 
01594         template <class V,class S>
01595         TINLINE V &_vsusetinf(V &v, const S &s) throw()
01596         {
01597                 for(int i=0;i<v.size;i++)
01598                         UncheckedSetInf(v.dat[i],s);
01599                 return v;
01600         }
01601 
01602         template <class V,class S>
01603         TINLINE V &_vssetinf(V &v, const S &s) throw()
01604         {
01605                 for(int i=0;i<v.size;i++)
01606                         SetInf(v.dat[i],s);
01607                 return v;
01608         }
01609 
01610         template <class V,class S>
01611         TINLINE V &_vssetsup(V &v, const S &s) throw()
01612         {
01613                 for(int i=0;i<v.size;i++)
01614                         SetSup(v.dat[i],s);
01615                 return v;
01616         }
01617 
01618         template <class V,class S>
01619         TINLINE V &_vssetre(V &v, const S &s) throw()
01620         {
01621                 for(int i=0;i<v.size;i++)
01622                         SetRe(v.dat[i],s);
01623                 return v;
01624         }
01625 
01626         template <class V,class S>
01627         TINLINE V &_vssetim(V &v, const S &s) throw()
01628         {
01629                 for(int i=0;i<v.size;i++)
01630                         SetIm(v.dat[i],s);
01631                 return v;
01632         }
01633 
01634         template <class VS,class S>
01635         TINLINE VS &_vssusetsup(VS &vs, const S &s) throw()
01636         {
01637                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01638                         UncheckedSetInf(vs.dat[i],s);
01639                 return vs;
01640         }
01641 
01642         template <class VS,class S>
01643         TINLINE VS &_vssusetinf(VS &vs, const S &s) throw()
01644         {
01645                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01646                         UncheckedSetInf(vs.dat[i],s);
01647                 return vs;
01648         }
01649 
01650         template <class VS,class S>
01651         TINLINE VS &_vsssetinf(VS &vs, const S &s) throw()
01652         {
01653                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01654                         SetInf(vs.dat[i],s);
01655                 return vs;
01656         }
01657 
01658         template <class VS,class S>
01659         TINLINE VS &_vsssetsup(VS &vs, const S &s) throw()
01660         {
01661                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01662                         SetSup(vs.dat[i],s);
01663                 return vs;
01664         }
01665 
01666         template <class VS,class S>
01667         TINLINE VS &_vsssetre(VS &vs, const S &s) throw()
01668         {
01669                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01670                         SetRe(vs.dat[i],s);
01671                 return vs;
01672         }
01673 
01674         template <class VS,class S>
01675         TINLINE VS &_vsssetim(VS &vs, const S &s) throw()
01676         {
01677                 for(int i=vs.start-vs.l;i<=vs.end-vs.l;i++)
01678                         SetIm(vs.dat[i],s);
01679                 return vs;
01680         }
01681 
01682         template <class V1,class V2>
01683         TINLINE V1 &_vvsetinf(V1 &rv1, const V2 &rv2)
01684 #if(CXSC_INDEX_CHECK)
01685                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01686 #else
01687         throw()
01688 #endif
01689         {
01690 #if(CXSC_INDEX_CHECK)
01691                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" & SetInf("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01692 #endif
01693                 for(int i=0;i<rv1.size;i++)
01694                         SetInf(rv1.dat[i],rv2.dat[i]);
01695                 return rv1;
01696         }
01697 
01698         template <class V,class VS>
01699         TINLINE V &_vvssetinf(V &rv, const VS &sl)
01700 #if(CXSC_INDEX_CHECK)
01701                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01702 #else
01703         throw()
01704 #endif
01705         {
01706 #if(CXSC_INDEX_CHECK)
01707                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" & SetInf("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01708 #endif
01709                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01710                         SetInf(rv.dat[i],sl.dat[j]);
01711                 return rv;
01712         }
01713 
01714         template <class VS,class V>
01715         TINLINE VS &_vsvsetinf(VS &sl, const V &rv)
01716 #if(CXSC_INDEX_CHECK)
01717                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01718 #else
01719         throw()
01720 #endif
01721         {
01722 #if(CXSC_INDEX_CHECK)
01723                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" & SetInf("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01724 #endif
01725                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01726                         SetInf(sl.dat[j],rv.dat[i]);
01727                 return sl;
01728         }
01729 
01730         template <class VS1,class VS2>
01731         TINLINE VS1 &_vsvssetinf(VS1 &sl1, const VS2 &sl2)
01732 #if(CXSC_INDEX_CHECK)
01733                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01734 #else
01735         throw()
01736 #endif
01737         {
01738 #if(CXSC_INDEX_CHECK)
01739                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &SetInf("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01740 #endif
01741                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01742                         SetInf(sl1.dat[j],sl2.dat[k]);
01743                 return sl1;
01744         }
01745 
01746         template <class V1,class V2>
01747         TINLINE V1 &_vvsetsup(V1 &rv1, const V2 &rv2)
01748 #if(CXSC_INDEX_CHECK)
01749                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01750 #else
01751         throw()
01752 #endif
01753         {
01754 #if(CXSC_INDEX_CHECK)
01755                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" &SetSup("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01756 #endif
01757                 for(int i=0;i<rv1.size;i++)
01758                         SetSup(rv1.dat[i],rv2.dat[i]);
01759                 return rv1;
01760         }
01761 
01762         template <class V,class VS>
01763         TINLINE V &_vvssetsup(V &rv, const VS &sl)
01764 #if(CXSC_INDEX_CHECK)
01765                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01766 #else
01767         throw()
01768 #endif
01769         {
01770 #if(CXSC_INDEX_CHECK)
01771                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" &SetSup("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01772 #endif
01773                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01774                         SetSup(rv.dat[i],sl.dat[j]);
01775                 return rv;
01776         }
01777 
01778         template <class VS,class V>
01779         TINLINE VS &_vsvsetsup(VS &sl, const V &rv)
01780 #if(CXSC_INDEX_CHECK)
01781                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01782 #else
01783         throw()
01784 #endif
01785         {
01786 #if(CXSC_INDEX_CHECK)
01787                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" &SetSup("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01788 #endif
01789                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01790                         SetSup(sl.dat[j],rv.dat[i]);
01791                 return sl;
01792         }
01793 
01794         template <class VS1,class VS2>
01795         TINLINE VS1 &_vsvssetsup(VS1 &sl1, const VS2 &sl2)
01796 #if(CXSC_INDEX_CHECK)
01797                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01798 #else
01799         throw()
01800 #endif
01801         {
01802 #if(CXSC_INDEX_CHECK)
01803                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &SetSup("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01804 #endif
01805                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01806                         SetSup(sl1.dat[j],sl2.dat[k]);
01807                 return sl1;
01808         }
01809 
01810         template <class V1,class V2>
01811         TINLINE V1 &_vvusetinf(V1 &rv1, const V2 &rv2)
01812 #if(CXSC_INDEX_CHECK)
01813                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01814 #else
01815         throw()
01816 #endif
01817         {
01818 #if(CXSC_INDEX_CHECK)
01819                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" &UncheckedSetInf("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01820 #endif
01821                 for(int i=0;i<rv1.size;i++)
01822                         UncheckedSetInf(rv1.dat[i],rv2.dat[i]);
01823                 return rv1;
01824         }
01825 
01826         template <class V,class VS>
01827         TINLINE V &_vvsusetinf(V &rv, const VS &sl)
01828 #if(CXSC_INDEX_CHECK)
01829                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01830 #else
01831         throw()
01832 #endif
01833         {
01834 #if(CXSC_INDEX_CHECK)
01835                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" &UncheckedSetInf("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01836 #endif
01837                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01838                         UncheckedSetInf(rv.dat[i],sl.dat[j]);
01839                 return rv;
01840         }
01841 
01842         template <class VS,class V>
01843         TINLINE VS &_vsvusetinf(VS &sl, const V &rv)
01844 #if(CXSC_INDEX_CHECK)
01845                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01846 #else
01847         throw()
01848 #endif
01849         {
01850 #if(CXSC_INDEX_CHECK)
01851                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" &UncheckedSetInf("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01852 #endif
01853                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01854                         UncheckedSetInf(sl.dat[j],rv.dat[i]);
01855                 return sl;
01856         }
01857 
01858         template <class VS1,class VS2>
01859         TINLINE VS1 &_vsvsusetinf(VS1 &sl1, const VS2 &sl2)
01860 #if(CXSC_INDEX_CHECK)
01861                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01862 #else
01863         throw()
01864 #endif
01865         {
01866 #if(CXSC_INDEX_CHECK)
01867                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &UncheckedSetInf("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01868 #endif
01869                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01870                         UncheckedSetInf(sl1.dat[j],sl2.dat[k]);
01871                 return sl1;
01872         }
01873 
01874         template <class V1,class V2>
01875         TINLINE V1 &_vvusetsup(V1 &rv1, const V2 &rv2)
01876 #if(CXSC_INDEX_CHECK)
01877                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01878 #else
01879         throw()
01880 #endif
01881         {
01882 #if(CXSC_INDEX_CHECK)
01883                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" &UncheckedSetSup("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01884 #endif
01885                 for(int i=0;i<rv1.size;i++)
01886                         UncheckedSetSup(rv1.dat[i],rv2.dat[i]);
01887                 return rv1;
01888         }
01889 
01890         template <class V,class VS>
01891         TINLINE V &_vvsusetsup(V &rv, const VS &sl)
01892 #if(CXSC_INDEX_CHECK)
01893                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01894 #else
01895         throw()
01896 #endif
01897         {
01898 #if(CXSC_INDEX_CHECK)
01899                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" &UncheckedSetSup("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01900 #endif
01901                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01902                         UncheckedSetSup(rv.dat[i],sl.dat[j]);
01903                 return rv;
01904         }
01905 
01906         template <class VS,class V>
01907         TINLINE VS &_vsvusetsup(VS &sl, const V &rv)
01908 #if(CXSC_INDEX_CHECK)
01909                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01910 #else
01911         throw()
01912 #endif
01913         {
01914 #if(CXSC_INDEX_CHECK)
01915                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" &UncheckedSetSup("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01916 #endif
01917                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01918                         UncheckedSetSup(sl.dat[j],rv.dat[i]);
01919                 return sl;
01920         }
01921 
01922         template <class VS1,class VS2>
01923         TINLINE VS1 &_vsvsusetsup(VS1 &sl1, const VS2 &sl2)
01924 #if(CXSC_INDEX_CHECK)
01925                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01926 #else
01927         throw()
01928 #endif
01929         {
01930 #if(CXSC_INDEX_CHECK)
01931                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &UncheckedSetSup("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01932 #endif
01933                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01934                         UncheckedSetSup(sl1.dat[j],sl2.dat[k]);
01935                 return sl1;
01936         }
01937 
01938         template <class V1,class V2>
01939         TINLINE V1 &_vvsetim(V1 &rv1, const V2 &rv2)
01940 #if(CXSC_INDEX_CHECK)
01941                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
01942 #else
01943         throw()
01944 #endif
01945         {
01946 #if(CXSC_INDEX_CHECK)
01947                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" &SetIm("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
01948 #endif
01949                 for(int i=0;i<rv1.size;i++)
01950                         SetIm(rv1.dat[i],rv2.dat[i]);
01951                 return rv1;
01952         }
01953 
01954         template <class V,class VS>
01955         TINLINE V &_vvssetim(V &rv, const VS &sl)
01956 #if(CXSC_INDEX_CHECK)
01957                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
01958 #else
01959         throw()
01960 #endif
01961         {
01962 #if(CXSC_INDEX_CHECK)
01963                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" &SetIm("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
01964 #endif
01965                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01966                         SetIm(rv.dat[i],sl.dat[j]);
01967                 return rv;
01968         }
01969 
01970         template <class VS,class V>
01971         TINLINE VS &_vsvsetim(VS &sl, const V &rv)
01972 #if(CXSC_INDEX_CHECK)
01973                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
01974 #else
01975         throw()
01976 #endif
01977         {
01978 #if(CXSC_INDEX_CHECK)
01979                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>("SetIm("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
01980 #endif
01981                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
01982                         SetIm(sl.dat[j],rv.dat[i]);
01983                 return sl;
01984         }
01985 
01986         template <class VS1,class VS2>
01987         TINLINE VS1 &_vsvssetim(VS1 &sl1, const VS2 &sl2)
01988 #if(CXSC_INDEX_CHECK)
01989                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
01990 #else
01991         throw()
01992 #endif
01993         {
01994 #if(CXSC_INDEX_CHECK)
01995                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &SetIm("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
01996 #endif
01997                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
01998                         SetIm(sl1.dat[j],sl2.dat[k]);
01999                 return sl1;
02000         }
02001 
02002         template <class V1,class V2>
02003         TINLINE V1 &_vvsetre(V1 &rv1, const V2 &rv2)
02004 #if(CXSC_INDEX_CHECK)
02005                 throw(ERROR__OP_WITH_WRONG_DIM<V1>)
02006 #else
02007         throw()
02008 #endif
02009         {
02010 #if(CXSC_INDEX_CHECK)
02011                 if(rv1.size!=rv2.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V1>(nameof(rv1)+" &SetRe("+nameof(rv1)+" &, const "+nameof(rv2)+" &)"));
02012 #endif
02013                 for(int i=0;i<rv1.size;i++)
02014                         SetRe(rv1.dat[i],rv2.dat[i]);
02015                 return rv1;
02016         }
02017 
02018         template <class V,class VS>
02019         TINLINE V &_vvssetre(V &rv, const VS &sl)
02020 #if(CXSC_INDEX_CHECK)
02021                 throw(ERROR__OP_WITH_WRONG_DIM<V>)
02022 #else
02023         throw()
02024 #endif
02025         {
02026 #if(CXSC_INDEX_CHECK)
02027                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<V>(nameof(rv)+" &SetRe("+nameof(rv)+" &, const "+nameof(sl)+" &)"));
02028 #endif
02029                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
02030                         SetRe(rv.dat[i],sl.dat[j]);
02031                 return rv;
02032         }
02033 
02034         template <class VS,class V>
02035         TINLINE VS &_vsvsetre(VS &sl, const V &rv)
02036 #if(CXSC_INDEX_CHECK)
02037                 throw(ERROR__OP_WITH_WRONG_DIM<VS>)
02038 #else
02039         throw()
02040 #endif
02041         {
02042 #if(CXSC_INDEX_CHECK)
02043                 if(rv.size!=sl.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS>(nameof(sl)+" &SetRe("+nameof(sl)+" &, const "+nameof(rv)+" &)"));
02044 #endif
02045                 for(int i=0,j=sl.start-sl.l;i<rv.size;i++,j++)
02046                         SetRe(sl.dat[j],rv.dat[i]);
02047                 return sl;
02048         }
02049 
02050         template <class VS1,class VS2>
02051         TINLINE VS1 &_vsvssetre(VS1 &sl1, const VS2 &sl2)
02052 #if(CXSC_INDEX_CHECK)
02053                 throw(ERROR__OP_WITH_WRONG_DIM<VS1>)
02054 #else
02055         throw()
02056 #endif
02057         {
02058 #if(CXSC_INDEX_CHECK)
02059                 if(sl2.size!=sl1.size) cxscthrow(ERROR__OP_WITH_WRONG_DIM<VS1>(nameof(sl1)+" &SetRe("+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
02060 #endif
02061                 for(int i=0,j=sl1.start-sl1.l,k=sl2.start-sl2.l;i<sl2.size;i++,j++,k++)
02062                         SetRe(sl1.dat[j],sl2.dat[k]);
02063                 return sl1;
02064         }
02065 
02066         template <class DP,class VS1,class VS2>
02067         TINLINE void _vsvsaccu(DP &dp, const VS1 & sl1, const VS2 &sl2)
02068 #if(CXSC_INDEX_CHECK)
02069                 throw(OP_WITH_WRONG_DIM)
02070 #else
02071         throw()
02072 #endif
02073         {
02074 #if(CXSC_INDEX_CHECK)
02075                 if(sl1.size!=sl2.size) cxscthrow(OP_WITH_WRONG_DIM("void accumulate("+nameof(dp)+" &, const "+nameof(sl1)+" &, const "+nameof(sl2)+" &)"));
02076 #endif
02077                 for(int i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size;k++,i++,j++)
02078                         accumulate(dp,sl1.dat[i],sl2.dat[j]);
02079         }
02080 
02081         template <class VS1,class VS2>
02082         TINLINE bool _vsvseq(const VS1 &sl1, const VS2 &sl2) throw()
02083         {
02084                 if(sl1.size!=sl2.size)
02085                         return(false);
02086 
02087                 int i,j,k;
02088                 for (i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size && sl1.dat[i]==sl2.dat[j];k++,j++,i++);
02089                 
02090                 return (k==sl1.size);
02091         }       
02092 
02093         template <class VS1,class VS2>
02094         TINLINE bool _vsvsneq(const VS1 &sl1, const VS2 &sl2) throw()
02095         {
02096                 if(sl1.size!=sl2.size)
02097                         return(true);
02098 
02099                 int i,j,k;
02100                 for (i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size && sl1.dat[i]==sl2.dat[j];i++,j++,k++);
02101                 
02102                 return (k!=sl1.size);
02103         }       
02104 
02105         template <class VS1,class VS2>
02106         TINLINE bool _vsvsless(const VS1 &sl1, const VS2 &sl2) throw()
02107         {
02108                 if(sl1.size!=sl2.size)
02109                         return(false);
02110 
02111                 int i,j,k;
02112                 for (i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size && sl1.dat[i]<sl2.dat[j];k++,j++,i++);
02113                 
02114                 return (k==sl1.size);
02115         }       
02116 
02117         template <class VS1,class VS2>
02118         TINLINE bool _vsvsleq(const VS1 &sl1, const VS2 &sl2) throw()
02119         {
02120                 if(sl1.size!=sl2.size)
02121                         return(true);
02122 
02123                 int i,j,k;
02124                 for (i=sl1.start-sl1.l,j=sl2.start-sl2.l,k=0;k<sl1.size && sl1.dat[i]<=sl2.dat[j];i++,j++,k++);
02125                 
02126                 return (k==sl1.size);
02127         }       
02128 
02129         template <class VS>
02130         TINLINE bool _vsnot(const VS &sl) throw()
02131         {
02132                 for(int i=sl.start-sl.l,k=0;k<sl.size;i++,k++)
02133                 {
02134                         if(!!sl.dat[i])
02135                                 return(false);
02136                 }
02137 
02138                 return true;
02139         }
02140 
02141         template <class VS>
02142         TINLINE void *_vsvoid(const VS &sl) throw()
02143         {
02144                 for(int i=sl.start-sl.l,k=0;i<sl.size;i++,k++)
02145                 {
02146                         if(!!sl.dat[i])
02147                                 return (void *)1;
02148                 }
02149 
02150                 return (void *)0;
02151         }
02152 
02153         template <class V>
02154         std::ostream &_vout(std::ostream &s, const V &rv) throw()
02155         {
02156                 for(int j=0;j<rv.size;j++)
02157                         s<<rv.dat[j]<<std::endl;
02158                 return s;
02159         }
02160 
02161         template <class V>
02162         std::istream &_vin(std::istream &s, V &rv) throw()
02163         {
02164                 for(int j=0;j<rv.size;j++)
02165                         s>>rv.dat[j];
02166                 return s;
02167         }
02168 
02169 
02170         template <class V>
02171         std::ostream &_vsout(std::ostream &s, const V &rv) throw()
02172         {
02173                 for(int j=rv.start;j<=rv.end;j++)
02174                         s<<rv[j]<<std::endl;
02175                 return s;
02176         }
02177 
02178         template <class V>
02179         std::istream &_vsin(std::istream &s, V &rv) throw()
02180         {
02181                 for(int j=rv.start;j<=rv.end;j++)
02182                         s>>rv[j];
02183                 return s;
02184         }
02185 
02186 } // namespace cxsc
02187 
02188 #endif