#pragma once #include #include //#include #include #include namespace MbD { template class Array : public std::vector { public: Array() {} Array(std::vector vec) : std::vector(vec) {} Array(int count) : std::vector(count) {} Array(int count, const T& value) : std::vector(count, value) {} Array(std::vector::iterator begin, std::vector::iterator end) : std::vector(begin, end) {} Array(std::initializer_list list) : std::vector{ list } {} virtual void initialize(); void copyFrom(std::shared_ptr> x); virtual void zeroSelf(); virtual double sumOfSquares() = 0; double rootMeanSquare(); virtual int numberOfElements(); void swapElems(int i, int ii); //double maxMagnitude(); double maxMagnitudeOfVector(); void equalArrayAt(std::shared_ptr> array, int i); }; template inline void Array::initialize() { } template inline void Array::copyFrom(std::shared_ptr> x) { for (int i = 0; i < x->size(); i++) { this->at(i) = x->at(i); } } template inline void Array::zeroSelf() { for (int i = 0; i < this->size(); i++) { this->at(i) = (T)0; } } template inline double Array::rootMeanSquare() { return std::sqrt(this->sumOfSquares() / this->numberOfElements()); } template inline int Array::numberOfElements() { return (int)this->size(); } template inline void Array::swapElems(int i, int ii) { auto temp = this->at(i); this->at(i) = this->at(ii); this->at(ii) = temp; } //template //inline double Array::maxMagnitude() //{ // if (std::is_arithmetic::value) { // return this->maxMagnitudeOfVector(); // } // else { // auto answer = 0.0; // for (int i = 0; i < this->size(); i++) // { // auto mag = this->at(i)->maxMagnitude(); // if (answer < mag) answer = mag; // } // return answer; // } //} template inline double Array::maxMagnitudeOfVector() { auto answer = 0.0; for (int i = 0; i < this->size(); i++) { auto mag = std::abs(this->at(i)); if (answer < mag) answer = mag; } return answer; } template inline void Array::equalArrayAt(std::shared_ptr> array, int i) { for (int ii = 0; ii < this->size(); ii++) { this->at(ii) = array->at(i + ii); } } using ListD = std::initializer_list; using ListListD = std::initializer_list>; using ListListPairD = std::initializer_list>>; }