#pragma once #include "cnumber.hpp" #include #include using namespace std; class matrix; class vector { private: long long dimention = 0; cnumber *entries = NULL; bool err = true; public: bool is_error() { return this->err; } vector(){}; vector(const long long dimention) { this->err = false; this->dimention = dimention; free(this->entries); this->entries = (cnumber *)malloc(sizeof(cnumber) * dimention); for (long long i = 0; i < dimention; i++) { this->set_entry(i, cnumber(0, 0)); } } vector(const vector &v) { this->err = false; this->dimention = v.get_dimention(); free(this->entries); this->entries = (cnumber *)malloc(sizeof(cnumber) * v.get_dimention()); for (long long i = 0; i < v.get_dimention(); i++) { this->set_entry(i, v.get_entry(i)); } } ~vector() { this->dimention = 0; free(this->entries); // this->entries = NULL; this->err = true; } long long get_dimention() const { return this->dimention; } const cnumber *get_entries() const { return this->entries; } cnumber get_entry(const long long index) const { if (index < this->get_dimention()) { return this->entries[index]; } return cnumber(0, 0); } void set_entry(const long long index, const cnumber z) { if (index < this->get_dimention()) { this->entries[index] = z; } } const cnumber operator[](const long long index) const { return this->get_entry(index); } // FIXME: Figure out how to make sure you do not try to access something // outside of the index cnumber &operator[](const long long index) { return this->entries[index]; } friend ostream &operator<<(ostream &os, const vector &v) { int longest = 0; for (long long i = 0; i < v.get_dimention(); i++) { ostringstream oss; oss << v[i]; string s = oss.str(); if (longest < s.length()) longest = s.length(); } for (long long i = 0; i < v.get_dimention(); i++) { ostringstream oss; oss << v[i]; string s = oss.str(); int padding = longest - s.length() +1; os << "|" << v[i] << std::setw(padding) << "|"; if (i != v.get_dimention() - 1) os << endl; } return os; } void operator=(const vector &v) { this->dimention = v.get_dimention(); free(this->entries); this->entries = (cnumber *)malloc(sizeof(cnumber) * dimention); for (long long i = 0; i < v.get_dimention(); i++) { this->set_entry(i, v.get_entry(i)); } this->err = false; } const vector operator+(const vector &v) const { if (this->get_dimention() != v.get_dimention()) { return vector(0); } vector sum = vector(v.get_dimention()); for (long long i = 0; i < v.get_dimention(); i++) { sum[i] = this->get_entry(i) + v[i]; } return sum; } const vector operator-(const vector &v) const { if (this->get_dimention() != v.get_dimention()) { return vector(0); } vector sum = vector(v.get_dimention()); for (long long i = 0; i < v.get_dimention(); i++) { sum[i] = this->entries[i] - v[i]; } return sum; } const vector operator*(const matrix &m) const; const vector operator*(const cnumber scalar) const { vector product = vector(this->get_dimention()); for (long long i = 0; i < this->get_dimention(); i++) { product[i] = this->entries[i] * scalar; } return product; } const cnumber operator*(const vector &v) const { cnumber res(0, 0); for (long long i = 0; i < this->get_dimention(); i++) { res = res + this->get_entry(i) * v.get_entry(i); } return res; } };