125 shData =
new sharedData();
129 shData->refcounts = 1;
130 shData->temporary =
false;
131 shData->nodata =
false;
132 this->isinternal =
false;
139 shData =
new sharedData();
140 shData->vsize = size;
141 shData->data =
new double[size];
144 shData->refcounts = 1;
145 shData->temporary =
false;
146 shData->nodata =
false;
147 for(
unsigned int i=0; i<shData->vsize; i++ ) {
148 shData->dataref[i].
setRef( shData->data + i );
150 this->isinternal = isinternal;
156 DoubleVector(
unsigned int size,
double value,
bool isinternal =
false ) {
157 shData =
new sharedData();
158 shData->vsize = size;
159 shData->data =
new double[size];
161 shData->refcounts = 1;
162 shData->temporary =
false;
163 shData->nodata =
false;
164 for(
unsigned int i=0; i<shData->vsize; i++ ) {
165 shData->data[i] = value;
166 shData->dataref[i].
setRef( shData->data + i );
168 this->isinternal = isinternal;
174 DoubleVector(
const double* r,
unsigned int dim,
bool isinternal =
false ) {
175 shData =
new sharedData();
177 shData->data =
new double[dim];
179 shData->refcounts = 1;
180 shData->temporary =
false;
181 shData->nodata =
false;
182 for(
unsigned int i=0; i<shData->vsize; i++ ) {
183 shData->data[i] = r[i];
184 shData->dataref[i].
setRef( shData->data + i );
186 this->isinternal = isinternal;
191 shData->refcounts += 1;
193 shData->temporary =
false;
227 shData =
new sharedData();
229 shData->data =
new double[dim];
231 shData->refcounts = 1;
232 shData->temporary = temp;
233 shData->nodata =
false;
234 for(
unsigned int i=0; i<shData->vsize; i++ ) {
235 shData->dataref[i].
setRef( shData->data + i );
237 this->isinternal =
false;
241 shData->refcounts -= 1;
242 if ( shData->refcounts == 0 ) {
244 if ( shData->vsize > 0 ) {
245 delete [](shData->dataref);
246 if ( !(shData->nodata) ) {
247 delete [](shData->data);
255 return shData->vsize;
259 return (shData->vsize==0);
263 if ( shData == b.shData )
return true;
264 if ( shData->vsize != b.shData->vsize )
return false;
265 for(
unsigned int i=0; i<shData->vsize; i++ ) {
266 if ( shData->dataref[i] != b.shData->dataref[i] )
return false;
272 return !( *
this == b );
282 if ( src.shData == shData )
return (*
this);
284 shData->refcounts -= 1;
285 if ( shData->refcounts == 0 ) {
287 if ( shData->vsize > 0 ) {
288 delete [](shData->dataref);
289 if ( !(shData->nodata) ) {
290 delete [](shData->data);
299 shData->temporary =
false;
311 if ( shData == src.shData )
return (*
this);
313 unsigned int max = qMin( shData->vsize, src.
size() );
314 for(
unsigned int i=0; i<max; i++ ) {
315 shData->dataref[i] = src[i];
328 unsigned int max = qMin( shData->vsize, (
unsigned int)(src.size()) );
329 for(
unsigned int i=0; i<max; i++ ) {
330 shData->dataref[i] = src[i];
343 if ( shData == src.shData && srcOffset == 0 && thisOffset == 0 )
return (*
this);
345 unsigned int max = qMin( shData->vsize-thisOffset, src.
size()-srcOffset );
346 for(
unsigned int i=0; i<max; i++ ) {
347 shData->dataref[i+thisOffset] = src[i+srcOffset];
363 if ( stride == 0 )
return (*
this);
365 if ( shData == src.shData && srcOffset == 0 && thisOffset == 0 )
return (*
this);
367 unsigned int max = qMin( shData->vsize-thisOffset, src.
size()-srcOffset );
368 for(
unsigned int i=0; i<max; i=i+stride ) {
369 shData->dataref[i+thisOffset] = src[i+srcOffset];
377 if ( shData->refcounts > 1 ) {
378 sharedData* tmp =
new sharedData();
379 unsigned int size = shData->vsize;
381 tmp->data =
new double[size];
382 if ( shData->nodata ) {
383 for(
unsigned int i=0; i<size; i++ ) {
384 tmp->data[i] = shData->dataref[i];
391 tmp->temporary =
false;
393 for(
unsigned int i=0; i<size; i++ ) {
394 tmp->dataref[i].
setRef( tmp->data + i );
407 if ( shData->temporary ) {
408 for(
unsigned int i=0; i<shData->vsize; i++ ) {
409 shData->dataref[i] = -shData->dataref[i];
414 for(
unsigned int i=0; i<shData->vsize; i++ ) {
415 ret.shData->dataref[i] = -shData->dataref[i];
425 if ( shData->vsize != right.shData->vsize ) {
426 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator+ (dimension must be equals)");
429 if ( right.shData->temporary ) {
430 for(
unsigned int i=0; i<shData->vsize; i++ ) {
431 right.shData->dataref[i] = shData->dataref[i] + right.shData->dataref[i];
434 }
else if ( shData->temporary ) {
435 for(
unsigned int i=0; i<shData->vsize; i++ ) {
436 shData->dataref[i] = shData->dataref[i] + right.shData->dataref[i];
441 for(
unsigned int i=0; i<shData->vsize; i++ ) {
442 ret.shData->dataref[i] = shData->dataref[i] + right.shData->dataref[i];
452 if ( shData->vsize != right.shData->vsize ) {
453 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator- (dimension must be equals)");
456 if ( right.shData->temporary ) {
457 for(
unsigned int i=0; i<shData->vsize; i++ ) {
458 right.shData->dataref[i] = shData->dataref[i] - right.shData->dataref[i];
461 }
else if ( shData->temporary ) {
462 for(
unsigned int i=0; i<shData->vsize; i++ ) {
463 shData->dataref[i] = shData->dataref[i] - right.shData->dataref[i];
468 for(
unsigned int i=0; i<shData->vsize; i++ ) {
469 ret.shData->dataref[i] = shData->dataref[i] - right.shData->dataref[i];
479 if ( shData->vsize != right.shData->vsize ) {
480 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator* (dimension must be equals)");
483 if ( right.shData->temporary ) {
484 for(
unsigned int i=0; i<shData->vsize; i++ ) {
485 right.shData->dataref[i] = shData->dataref[i] * right.shData->dataref[i];
488 }
else if ( shData->temporary ) {
489 for(
unsigned int i=0; i<shData->vsize; i++ ) {
490 shData->dataref[i] = shData->dataref[i] * right.shData->dataref[i];
495 for(
unsigned int i=0; i<shData->vsize; i++ ) {
496 ret.shData->dataref[i] = shData->dataref[i] * right.shData->dataref[i];
506 if ( shData->vsize != right.shData->vsize ) {
507 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator/ (dimension must be equals)");
510 if ( right.shData->temporary ) {
511 for(
unsigned int i=0; i<shData->vsize; i++ ) {
512 right.shData->dataref[i] = shData->dataref[i] / right.shData->dataref[i];
515 }
else if ( shData->temporary ) {
516 for(
unsigned int i=0; i<shData->vsize; i++ ) {
517 shData->dataref[i] = shData->dataref[i] / right.shData->dataref[i];
522 for(
unsigned int i=0; i<shData->vsize; i++ ) {
523 ret.shData->dataref[i] = shData->dataref[i] / right.shData->dataref[i];
533 if ( shData->vsize != right.shData->vsize ) {
534 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator+= (dimension must be equals)");
538 for(
unsigned int i=0; i<shData->vsize; i++ ) {
539 shData->dataref[i] = shData->dataref[i] + right.shData->dataref[i];
548 if ( shData->vsize != right.shData->vsize ) {
549 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator-= (dimension must be equals)");
553 for(
unsigned int i=0; i<shData->vsize; i++ ) {
554 shData->dataref[i] = shData->dataref[i] - right.shData->dataref[i];
563 if ( shData->vsize != right.shData->vsize ) {
564 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator*= (dimension must be equals)");
568 for(
unsigned int i=0; i<shData->vsize; i++ ) {
569 shData->dataref[i] = shData->dataref[i] * right.shData->dataref[i];
578 if ( shData->vsize != right.shData->vsize ) {
579 throw IncompatibleVectors(
"Incompatible DoubleVectors in operator/= (dimension must be equals)");
583 for(
unsigned int i=0; i<shData->vsize; i++ ) {
584 shData->dataref[i] = shData->dataref[i] / right.shData->dataref[i];
591 for(
unsigned int i=0; i<shData->vsize; i++ ) {
592 shData->dataref[i] = shData->dataref[i] + right;
599 for(
unsigned int i=0; i<shData->vsize; i++ ) {
600 shData->dataref[i] = shData->dataref[i] - right;
607 for(
unsigned int i=0; i<shData->vsize; i++ ) {
608 shData->dataref[i] = shData->dataref[i] * right;
615 for(
unsigned int i=0; i<shData->vsize; i++ ) {
616 shData->dataref[i] = shData->dataref[i] / right;
626 if( i >= shData->vsize ) {
631 shData->dataref[i].setSteady();
639 if( i >= shData->vsize ) {
644 shData->dataref[i].setNoSteady();
652 if( i >= shData->vsize ) {
656 return shData->dataref[i].isSteady();
663 for(
unsigned int i=0; i<shData->vsize; i++ ) {
664 shData->dataref[i] = 0;
673 for(
unsigned int i=0; i<shData->vsize; i++ ) {
674 shData->dataref[i] = value;
683 if( index >= shData->vsize ) {
688 return shData->dataref[index];
695 if( index >= shData->vsize ) {
699 return shData->dataref[index];
703 if ( shData->nodata || isinternal ) {
707 if ( newsize > shData->vsize ) {
708 double* newdata =
new double[newsize];
709 memoryCopy( newdata, shData->data, shData->vsize );
710 delete [](shData->data);
711 delete [](shData->dataref);
712 shData->data = newdata;
713 shData->vsize = newsize;
714 shData->dataref =
new doubleRef[ newsize ];
715 for(
unsigned int i=0; i<shData->vsize; i++ ) {
716 shData->dataref[i].
setRef( shData->data + i );
719 shData->vsize = newsize;
726 resize( shData->vsize+1 );
727 shData->data[ shData->vsize-1 ] = value;
761 friend class DoubleMatrix;
767 void resizeNoData(
unsigned int newsize ) {
768 if ( shData->vsize > 0 ) {
769 if ( shData->data ) {
delete [](shData->data); }
770 delete [](shData->dataref);
772 shData->vsize = newsize;
773 shData->dataref =
new doubleRef[ newsize ];
774 shData->nodata =
true;