Skip to content

Commit

Permalink
Do not use a pointer in tvector use direclty std::vector
Browse files Browse the repository at this point in the history
  • Loading branch information
bastien-roucaries committed Jan 19, 2015
1 parent b72031c commit 3b094f3
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 77 deletions.
96 changes: 29 additions & 67 deletions qucs-core/src/tvector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,101 +36,63 @@

namespace qucs {

// Constructor creates an unnamed instance of the tvector class.
template <class nr_type_t>
tvector<nr_type_t>::tvector () {
data = new std::vector <nr_type_t> (0);
}

/* Constructor creates an unnamed instance of the tvector class with a
certain length. */
template <class nr_type_t>
tvector<nr_type_t>::tvector (int s) {
data = new std::vector <nr_type_t> (s);
}

/* The copy constructor creates a new instance based on the given
tvector object. */
template <class nr_type_t>
tvector<nr_type_t>::tvector (const tvector & v) {
data = new std::vector <nr_type_t> (*(v.data));
}

/* The assignment copy constructor creates a new instance based on the
given tvector object. */
template <class nr_type_t>
const tvector<nr_type_t>&
tvector<nr_type_t>::operator=(const tvector<nr_type_t> & v) {
if (&v != this) {
if (data) {
delete data;
}
data = new std::vector <nr_type_t> (*v.data); //new nr_type_t[size];
}
return *this;
}

// Destructor deletes a tvector object.
template <class nr_type_t>
tvector<nr_type_t>::~tvector () {
if (data) delete data;
}

// Returns the tvector element at the given position.
template <class nr_type_t>
nr_type_t tvector<nr_type_t>::get (int i) {
assert (i >= 0 && i < (int)data->size ());
return (*data)[i];
return data.at(i);
}

// Sets the tvector element at the given position.
template <class nr_type_t>
void tvector<nr_type_t>::set (int i, nr_type_t z) {
assert (i >= 0 && i < (int)data->size ());
(*data)[i] = z;
data.at(i) = z;
}

// Sets all the tvector elements to the given value.
template <class nr_type_t>
void tvector<nr_type_t>::set (nr_type_t z) {
for (int i = 0; i < (int)data->size (); i++) (*data)[i] = z;
for (std::size_t i = 0; i < data.size (); i++)
data[i] = z;
}

// Sets the specified tvector elements to the given value.
template <class nr_type_t>
void tvector<nr_type_t>::set (nr_type_t z, int start, int stop) {
for (int i = start; i < stop; i++) (*data)[i] = z;
for (std::size_t i = start; i < stop; i++)
data[i] = z;
}

// Appends the given value to the tvector.
template <class nr_type_t>
void tvector<nr_type_t>::add (nr_type_t z) {
data->push_back (z);
data.push_back (z);
}

// Rejects the given number of values from the start of the tvector.
template <class nr_type_t>
void tvector<nr_type_t>::drop (int n) {
if (n < (int)data->size ()) {
data->erase (data->begin(),data->begin()+n);
if (n < (int)data.size ()) {
data.erase (data.begin(),data.begin()+n);
}
else data->clear (); //size = 0;
else data.clear (); //size = 0;
}

// Rejects the given number of values from the end of the tvector.
template <class nr_type_t>
void tvector<nr_type_t>::truncate (int n) {
if (n < (int) data->size ()) {
if (n < (int) data.size ()) {
//size -= n;
data->erase (data->end()-n,data->end());
data.erase (data.end()-n,data.end());
}
else data->clear (); //size = 0;
else data.clear (); //size = 0;
}

// Sets size to zero. Does not reduce the capacity.
template <class nr_type_t>
void tvector<nr_type_t>::clear (void) {
data->clear ();
data.clear ();
//size = 0;
}

Expand All @@ -139,7 +101,7 @@ void tvector<nr_type_t>::clear (void) {
template <class nr_type_t>
int tvector<nr_type_t>::contains (nr_type_t val, nr_double_t eps) {
int count = 0;
for (int i = 0; i < (int)data->size (); i++) if (abs ((*data)[i] - val) <= eps) count++;
for (int i = 0; i < (int)data.size (); i++) if (abs ((data)[i] - val) <= eps) count++;
return count;
}

Expand All @@ -152,10 +114,10 @@ void tvector<nr_type_t>::set (tvector<nr_type_t> a, int start, int stop) {
// The function swaps the given rows with each other.
template <class nr_type_t>
void tvector<nr_type_t>::exchangeRows (int r1, int r2) {
assert (r1 >= 0 && r2 >= 0 && r1 < (int)data->size () && r2 < (int)data->size ());
nr_type_t s = (*data)[r1];
(*data)[r1] = (*data)[r2];
(*data)[r2] = s;
assert (r1 >= 0 && r2 >= 0 && r1 < (int)data.size () && r2 < (int)data.size ());
nr_type_t s = (data)[r1];
(data)[r1] = (data)[r2];
(data)[r2] = s;
}

// Addition.
Expand All @@ -171,10 +133,10 @@ tvector<nr_type_t> operator + (tvector<nr_type_t> a, tvector<nr_type_t> b) {
// Intrinsic vector addition.
template <class nr_type_t>
tvector<nr_type_t> tvector<nr_type_t>::operator += (tvector<nr_type_t> a) {
assert (a.getSize () == (int)data->size ());
assert (a.getSize () == (int)data.size ());
std::vector<nr_type_t> * src = a.getData ();
std::vector<nr_type_t> * dst = data;
for (int i = 0; i < (int)data->size (); i++) (*dst)[i] += (*src)[i];
for (int i = 0; i < (int)data.size (); i++) (*dst)[i] += (*src)[i];
return *this;
}

Expand All @@ -191,26 +153,26 @@ tvector<nr_type_t> operator - (tvector<nr_type_t> a, tvector<nr_type_t> b) {
// Intrinsic vector subtraction.
template <class nr_type_t>
tvector<nr_type_t> tvector<nr_type_t>::operator -= (tvector<nr_type_t> a) {
assert (a.getSize () == (int)data->size ());
assert (a.getSize () == (int)data.size ());
std::vector<nr_type_t> * src = a.getData ();
std::vector<nr_type_t> * dst = data;
for (int i = 0; i < (int)data->size (); i++) (*dst)[i] -= (*src)[i];
for (int i = 0; i < (int)data.size (); i++) (*dst)[i] -= (*src)[i];
return *this;
}

// Intrinsic scalar multiplication.
template <class nr_type_t>
tvector<nr_type_t> tvector<nr_type_t>::operator *= (nr_double_t s) {
std::vector<nr_type_t> * dst = data;
for (int i = 0; i < (int)data->size (); i++) (*dst)[i] *= s;
for (int i = 0; i < (int)data.size (); i++) (*dst)[i] *= s;
return *this;
}

// Intrinsic scalar division.
template <class nr_type_t>
tvector<nr_type_t> tvector<nr_type_t>::operator /= (nr_double_t s) {
std::vector<nr_type_t> * dst = data;
for (int i = 0; i < (int)data->size (); i++) (*dst)[i] /= s;
for (int i = 0; i < (int)data.size (); i++) (*dst)[i] /= s;
return *this;
}

Expand Down Expand Up @@ -250,7 +212,7 @@ nr_type_t scalar (tvector<nr_type_t> a, tvector<nr_type_t> b) {
// Constant assignment operation.
template <class nr_type_t>
tvector<nr_type_t> tvector<nr_type_t>::operator = (const nr_type_t val) {
for (int i = 0; i < (int)data->size (); i++) (*data)[i] = val;
for (int i = 0; i < (int)data.size (); i++) (*data)[i] = val;
return *this;
}

Expand Down Expand Up @@ -365,7 +327,7 @@ tvector<nr_type_t> conj (tvector<nr_type_t> a) {
// Checks validity of vector.
template <class nr_type_t>
int tvector<nr_type_t>::isFinite (void) {
for (int i = 0; i < (int)data->size (); i++)
for (int i = 0; i < (int)data.size (); i++)
if (!std::isfinite (real ((*data)[i]))) return 0;
return 1;
}
Expand All @@ -374,14 +336,14 @@ int tvector<nr_type_t>::isFinite (void) {
template <class nr_type_t>
void tvector<nr_type_t>::reorder (int * idx) {
tvector<nr_type_t> old = *this;
for (int i = 0; i < (int)data->size (); i++) (*data)[i] = old.get (idx[i]);
for (int i = 0; i < (int)data.size (); i++) (*data)[i] = old.get (idx[i]);
}

#ifdef DEBUG
// Debug function: Prints the vector object.
template <class nr_type_t>
void tvector<nr_type_t>::print (void) {
for (int r = 0; r < (int)data->size (); r++) {
for (int r = 0; r < (int)data.size (); r++) {
fprintf (stderr, "%+.2e%+.2ei\n", (double) real (get (r)),
(double) imag (get (r)));
}
Expand Down
26 changes: 16 additions & 10 deletions qucs-core/src/tvector.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,18 +73,17 @@ template <class nr_type_t>
class tvector
{
public:
tvector ();
tvector (int);
tvector (const tvector &);
const tvector& operator = (const tvector &);
~tvector ();
tvector () = default;
tvector (const std::size_t i) : data(i) {};
tvector (const tvector &) = default;
~tvector () = default;
nr_type_t get (int);
void set (int, nr_type_t);
void set (nr_type_t);
void set (nr_type_t, int, int);
void set (tvector, int, int);
int getSize (void) { return (int)data->size (); }
nr_type_t * getData (void) { return data->data(); }
std::size_t getSize (void) { return data.size (); }
nr_type_t * getData (void) { return data.data(); }
void add (nr_type_t);
void clear (void);
void drop (int);
Expand Down Expand Up @@ -133,12 +132,19 @@ class tvector

// easy accessor operators
nr_type_t operator () (int i) const {
assert (i >= 0 && i < (int)data->size ()); return (*data)[i]; }
return data.at(i);
}
nr_type_t& operator () (int i) {
assert (i >= 0 && i < (int)data->size ()); return (*data)[i]; }
return data.at(i); }
nr_type_t operator [] (int i) const {
return data[i];
}
nr_type_t& operator [] (int i) {
return data[i];
}

private:
std::vector<nr_type_t> * data;
std::vector<nr_type_t> data;

};

Expand Down

0 comments on commit 3b094f3

Please sign in to comment.