namespace lasd { // Specific constructor template typename Vector::Vector(const ulong dimension){ Elements = new Data[dimenion] {}; size = dimenion; } // Specific constructor template typename Vector::Vector(const LinearContainer& con){ size = con.Size(); Elements = new Data[size] {}; for(ulong i ; i Vector::Vector(const Vector& vec){ size = vec.size; Elements = new Data[size] {}; for(ulong i=0 ; i Vector::Vector(Vector&& vec) noexcept{ std::swap(Elements, vec.Elements); std::swap(size, vec.size); } // Destructor template typename Vector::~Vector(){ delete[] Elements; } // Copy assignment template typename Vector& Vector::operator=(const Vector& vec){ Vector* tmpvec = new Vector(vec); std::swap(*tmpvec,*this); delete tmpvec; return *this; } // Move assignment template typename Vector& Vector::operator=(Vector&& vec) noexcept{ std::swap(Elements, vec.Elements); std::swap(size, vec.size); return *this; } // Comparison operators template typename bool Vector::operator==(const Vector& vec) const noexcept{ if(size!=vec.size) return false; for(ulong i=0 ; i bool Vector::operator!=(const Vector& vec) const noexcept{ return !(*this == vec); } // Specific member function // template typename // void Vector::Resize(const ulong newsize){ // if(newsize == 0){ // Clear(); // } // else{ // size = newsize; // if(newsize < size){ // Data* tmpvec = new Data[newsize] {}; // for(ulong i=0;i size){ // Data* tmpvec = new Data[newsize] {}; // for(ulong i=0;i void Vector::Resize(const ulong newsize){ if(newsize == 0){ Clear(); }else if(size != newsize){ ulong limit = (size < newsize) ? size : newsize; Data* TmpElements = new Data[newsize] {}; for(ulong i = 0 ; i void Vector::Clear(){ delete[] Elements; Elements = nullptr; size = 0; } template typename Data& Vector::Front() const{ if(size!=0){ return Elements[0]; }else{ return std::length_error("Access to an empty vector"); } } template typename Data& Vector::Back() const{ if(size!=0){ return Elements[size-1]; }else{ return std::length_error("Access to an empty vector"); } } template typename Data& Vector::operator[](const ulong index) const{ if(index < size){ return Elements[index]; }else{ throw std::out_of_range("Access at index " + std::to_string(index) + " invalid because the vector size is" + std::to_string(size)); } } template typename void Vector::MapPreOrder(const MapFunctor fun, void* par){ for(ulong i = 0 ; i void Vector::MapPostOrder(const MapFunctor fun, void* par){ ulong i = size; while(i>0){ fun(Elements[--i], par); } } template typename void Vector::FoldPreOrder(const FoldFunctor fun, const void* par, void* acc) const{ for(ulong i = 0 ; i void Vector::FoldPostOrder(const FoldFunctor fun, const void* par, void* acc) const{ ulong i = size; while(i>0){ fun(Elements[--i], par, acc); } }