From c30aaf96c9232538273c7f84b38af5ebd00e31ee Mon Sep 17 00:00:00 2001 From: Alessandro Ferro <49845537+xfarrow@users.noreply.github.com> Date: Sun, 11 Apr 2021 18:06:59 +0200 Subject: [PATCH] Library 2 Added the necessary code from the previous library --- librerie/exercise1/zmytest/test.cpp | 22 +- librerie/exercise2/list/list.cpp | 293 ++++++++++++++++++++++++++- librerie/exercise2/list/list.hpp | 88 ++++---- librerie/exercise2/vector/vector.cpp | 171 +++++++++++++++- librerie/exercise2/vector/vector.hpp | 51 ++--- 5 files changed, 536 insertions(+), 89 deletions(-) mode change 100755 => 100644 librerie/exercise2/list/list.cpp mode change 100755 => 100644 librerie/exercise2/list/list.hpp mode change 100755 => 100644 librerie/exercise2/vector/vector.cpp mode change 100755 => 100644 librerie/exercise2/vector/vector.hpp diff --git a/librerie/exercise1/zmytest/test.cpp b/librerie/exercise1/zmytest/test.cpp index a649600..5c5995c 100644 --- a/librerie/exercise1/zmytest/test.cpp +++ b/librerie/exercise1/zmytest/test.cpp @@ -609,11 +609,11 @@ lasd::List generateListOfStrings(){ for(unsigned long i = 0; i < dim; ++i){ mylist.InsertAtFront(generateRandomString(dist(gen))); } - std::cout<<"Elements of the list:"< generateListOfFloat(){ @@ -625,11 +625,11 @@ lasd::List generateListOfFloat(){ for(unsigned long i = 0; i < dim; ++i){ mylist.InsertAtFront((round(distr(gen)*10000))/100); } - std::cout<<"Elements of the list:"< generateListOfIntegers(){ @@ -640,11 +640,11 @@ lasd::List generateListOfIntegers(){ for(ulong i=0 ; i generateVectorOfIntegers(){ @@ -657,11 +657,11 @@ lasd::Vector generateVectorOfIntegers(){ for(ulong i = 0 ; i generateVectorOfFloat(){ @@ -673,11 +673,11 @@ lasd::Vector generateVectorOfFloat(){ for(unsigned long i = 0; i < dim; ++i){ myvec[i] = (round(distr(gen)*10000))/100; } - std::cout< generateVectorOfStrings(){ @@ -690,7 +690,7 @@ lasd::Vector generateVectorOfStrings(){ for(unsigned long i = 0; i < dim; ++i){ myvec[i] = generateRandomString(dist(gen)); } - std::cout< +List::Node::Node(const Data& newValue){ + value = newValue; + next = nullptr; +} + +// Copy constructor +template +List::Node::Node(const Node& copyFrom){ + value = copyFrom.value; + next = nullptr; +} + +// Move constructor +template +List::Node::Node(Node&& moveFrom){ + std::swap(value, moveFrom.value); + std::swap(next, moveFrom.next); +} + +template +List::Node::Node(Data&& moveFrom){ + std::swap(value, moveFrom); +} + + +// Comparison operator +template +bool List::Node::operator==(const Node& node)const noexcept{ + return (node.value == value); +} + + +template +bool List::Node::operator!=(const Node& node)const noexcept{ + return !(*this == node); +} + + +// Specific constructor +template +List::List(const LinearContainer& con){ + for(ulong i = 0; i +List::List(const List& copyFrom){ + for(ulong i = 0; i +List::List(List&& moveFrom){ + std::swap(size, moveFrom.size); + std::swap(head, moveFrom.head); + std::swap(tail, moveFrom.tail); +} + +template +List::~List(){ + Clear(); +} + +// Copy assignment +template + List& List::operator=(const List& copyFrom){ + if(*this != copyFrom){ + Clear(); + for(ulong i = 0; i + List& List::operator=(List&& moveFrom)noexcept{ + if(*this != moveFrom){ + std::swap(size, moveFrom.size); + std::swap(head, moveFrom.head); + std::swap(tail, moveFrom.tail); + } + return *this; + } + + //Comparison operators + template + bool List::operator==(const List& list) const noexcept{ + if(this->size != list.Size()) return false; + for(ulong i = 0; i < (this->size); ++i){ + if((*this)[i] != list[i]) return false; + } + return true; + } + +template +bool List::operator!=(const List& list) const noexcept{ + return !(*this==list); +} + +// Specific member functions + + template + void List::InsertAtFront(const Data& data){ + struct Node* tmp = new Node(data); + tmp->next = head; + head =tmp; + size++; + + if(size == 1){ + tail = head; + } + } + + + template + void List::InsertAtFront(Data&& data){ + struct Node* tmp = new Node(data); + tmp->next = head; + head =tmp; + size++; + + if(size == 1){ + tail = head; + } + } + + template + void List::RemoveFromFront(){ + if(head == nullptr){ + throw std::length_error("List is empty!"); + } + else{ + struct Node* tmp = head; + head = head->next; + tmp->next = nullptr; + delete tmp; + size--; + + if(head==nullptr){ + tail=nullptr; + } + } + } + + template + Data List::FrontNRemove(){ + if(head == nullptr){ + throw std::length_error("List is empty!"); + } + else{ + Data value = head->value; + RemoveFromFront(); + return value; + } + } + + template + void List::InsertAtBack(const Data& data){ + if(size == 0){ + InsertAtFront(data); + } + else{ + struct Node* last = new Node(data); + tail->next = last; + tail = last; + size++; + } + } + + template + void List::InsertAtBack(Data&& data){ + if(size == 0){ + InsertAtFront(data); + } + else{ + struct Node* last = new Node(data); + tail->next = last; + tail = last; + size++; + } + } + + template + void List::Clear(){ + while(head != nullptr){ + RemoveFromFront(); + } + } + + template + Data& List::Front() const{ + if(size == 0){ + throw std::length_error("List is empty!"); + }else{ + return head->value; + } + } + + template + Data& List::Back() const{ + if(size == 0){ + throw std::length_error("List is empty!"); + }else{ + return tail->value; + } + } + + template + Data& List::operator[](const ulong idx) const{ + if(idx >= size || idx < 0){ + throw std::out_of_range("Out of Range!"); + }else + { + struct Node* tmp = head; + for(ulong i=0; inext; + } + return tmp->value; + } + } + + + template + void List::MapPreOrder(MapFunctor function, void* par){ + MapPreOrder(function, par, head); + } + + template + void List::MapPostOrder(MapFunctor function, void* par){ + MapPostOrder(function, par, head); + } + + template + void List::FoldPreOrder(FoldFunctor function, const void* constPar, void* par) const{ + FoldPreOrder(function, constPar, par, head); + } + + template + void List::FoldPostOrder(FoldFunctor function, const void* constPar, void* par) const{ + FoldPostOrder(function, constPar, par, head); + } + + //OVERLOAD Accessory Function + + template + void List::MapPreOrder(MapFunctor function, void* par, struct Node* node){ + if(node == nullptr) + return; + + function(node->value, par); + MapPreOrder(function, par, node->next); + } + + template + void List::MapPostOrder(MapFunctor function, void* par, struct Node* node){ + if(node == nullptr) + return; + + MapPostOrder(function, par, node->next); + function(node->value, par); + } + + template + void List::FoldPreOrder(FoldFunctor function, const void* constPar, void* par, struct Node* node) const{ + + if(node == nullptr) + return; + + function(node->value, constPar, par); + FoldPreOrder(function, constPar, par, node->next); + } + + template + void List::FoldPostOrder(FoldFunctor function, const void* constPar, void* par, struct Node* node) const{ + if(node == nullptr) + return; + + FoldPostOrder(function, constPar, par, node->next); + function(node->value, constPar, par); + } +/* ************************************************************************** */ } diff --git a/librerie/exercise2/list/list.hpp b/librerie/exercise2/list/list.hpp old mode 100755 new mode 100644 index c80e4df..926649b --- a/librerie/exercise2/list/list.hpp +++ b/librerie/exercise2/list/list.hpp @@ -13,150 +13,150 @@ namespace lasd { /* ************************************************************************** */ template -class List { // Must extend LinearContainer, MappableContainer, and FoldableContainer +class List : virtual public LinearContainer, + virtual public MappableContainer, + virtual public FoldableContainer{ // Must extend LinearContainer, MappableContainer, and FoldableContainer private: - // ... - protected: - // using LinearContainer::???; + using LinearContainer:: size; struct Node { - - // Data - // ... + Data value; + Node* next = nullptr; /* ********************************************************************** */ // Specific constructors - // ... + Node(const Data&); /* ********************************************************************** */ // Copy constructor - // ... + Node(const Node&); // Move constructor - // ... + Node(Node&&); + Node(Data&&); /* ********************************************************************** */ // Destructor - // ... + ~Node() = default; /* ********************************************************************** */ // Comparison operators - // ... + bool operator==(const Node&) const noexcept; + bool operator!=(const Node&) const noexcept; /* ********************************************************************** */ // Specific member functions - // ... - }; - // ... + struct Node* head = nullptr; + struct Node* tail = nullptr; public: // Default constructor - // List() specifiers; + List() = default; /* ************************************************************************ */ // Specific constructor - // List(argument) specifiers; // A list obtained from a LinearContainer + List(const LinearContainer&); // A list obtained from a LinearContainer /* ************************************************************************ */ // Copy constructor - // List(argument) specifiers; + List(const List&); // Move constructor - // List(argument) specifiers; + List(List&&); /* ************************************************************************ */ // Destructor - // ~List() specifiers; + ~List(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + List& operator=(const List&); // Move assignment - // type operator=(argument) specifiers; + List& operator=(List&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const List&) const noexcept; + bool operator!=(const List&) const noexcept; /* ************************************************************************ */ // Specific member functions - // type InsertAtFront(argument) specifier; // Copy of the value - // type InsertAtFront(argument) specifier; // Move of the value - // type RemoveFromFront() specifier; // (must throw std::length_error when empty) - // type FrontNRemove() specifier; // (must throw std::length_error when empty) + void InsertAtFront(const Data&); // Copy of the value + void InsertAtFront(Data&&); // Move of the value + void RemoveFromFront(); // (must throw std::length_error when empty) + Data FrontNRemove(); // (must throw std::length_error when empty) - // type InsertAtBack(argument) specifier; // Copy of the value - // type InsertAtBack(argument) specifier; // Move of the value + void InsertAtBack(const Data&); // Copy of the value + void InsertAtBack(Data&&); // Move of the value /* ************************************************************************ */ // Specific member functions (inherited from Container) - // type Clear() specifiers; // Override Container member + void Clear() override; // Override Container member /* ************************************************************************ */ // Specific member functions (inherited from LinearContainer) - // type Front() specifiers; // Override LinearContainer member (must throw std::length_error when empty) - // type Back() specifiers; // Override LinearContainer member (must throw std::length_error when empty) + Data& Front() const override; // Override LinearContainer member (must throw std::length_error when empty) + Data& Back() const override; // Override LinearContainer member (must throw std::length_error when empty) - // type operator[](argument) specifiers; // Override LinearContainer member (must throw std::out_of_range when out of range) + Data& operator[](const ulong) const override; // Override LinearContainer member (must throw std::out_of_range when out of range) /* ************************************************************************ */ // Specific member functions (inherited from MappableContainer) - // using typename MappableContainer::MapFunctor; + using typename MappableContainer::MapFunctor; - // type MapPreOrder(arguments) specifiers; // Override MappableContainer member - // type MapPostOrder(arguments) specifiers; // Override MappableContainer member + void MapPreOrder(const MapFunctor, void*) override; // Override MappableContainer member + void MapPostOrder(const MapFunctor, void*) override; // Override MappableContainer member /* ************************************************************************ */ // Specific member functions (inherited from FoldableContainer) - // using typename FoldableContainer::FoldFunctor; + using typename FoldableContainer::FoldFunctor; - // type FoldPreOrder(arguments) specifiers; // Override FoldableContainer member - // type FoldPostOrder(arguments) specifiers; // Override FoldableContainer member + void FoldPreOrder(const FoldFunctor, const void*, void*) const override; // Override FoldableContainer member + void FoldPostOrder(const FoldFunctor, const void*, void*) const override; // Override FoldableContainer member protected: // Auxiliary member functions (for MappableContainer) - // type MapPreOrder(arguments) specifiers; // Accessory function executing from one point of the list onwards - // type MapPostOrder(arguments) specifiers; // Accessory function executing from one point of the list onwards + void MapPreOrder(const MapFunctor, void* , struct Node*); // Accessory function executing from one point of the list onwards + void MapPostOrder(const MapFunctor, void* , struct Node*); // Accessory function executing from one point of the list onwards /* ************************************************************************ */ // Auxiliary member functions (for FoldableContainer) - // type FoldPreOrder(arguments) specifiers; // Accessory function executing from one point of the list onwards - // type FoldPostOrder(arguments) specifiers; // Accessory function executing from one point of the list onwards + void FoldPreOrder(const FoldFunctor, const void*, void*, struct Node*) const; // Accessory function executing from one point of the list onwards + void FoldPostOrder(const FoldFunctor, const void*, void*, struct Node*) const;; // Accessory function executing from one point of the list onwards }; diff --git a/librerie/exercise2/vector/vector.cpp b/librerie/exercise2/vector/vector.cpp old mode 100755 new mode 100644 index d374ceb..2ebef36 --- a/librerie/exercise2/vector/vector.cpp +++ b/librerie/exercise2/vector/vector.cpp @@ -1,10 +1,169 @@ namespace lasd { -/* ************************************************************************** */ - -// ... - -/* ************************************************************************** */ - +template +Vector::Vector(const ulong newsize){ + Elements = new Data[newsize]{}; + size = newsize; +} + +template +Vector::Vector(const LinearContainer& con){ + size = con.Size(); + Elements = new Data[size]{}; + for(ulong i=0; 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 + Vector::~Vector(){ + Clear(); + } + + // Copy assignment + template + Vector& Vector::operator=(const Vector& vec){ + Vector* tmpvec = new Vector(vec); + std::swap(*tmpvec, *this); + delete tmpvec; + return *this; + } + + // Move assignment + template + Vector& Vector::operator=(Vector&& vec)noexcept{ + std::swap(Elements,vec.Elements); + std::swap(size, vec.size); + return *this; + } + + // Comparison operators + template + bool Vector::operator==(const Vector& vec) const noexcept{ + if(size == vec.size){ + for(ulong i=0; i + bool Vector::operator!=(const Vector& vec)const noexcept{ + return !(*this == vec); + } + + template + 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 + Data& Vector::Front() const { + if(size != 0) + { + return Elements[0]; + }else{ + throw std::length_error("Access to an empty vector!"); + } + } + + template + Data& Vector::Back() const { + if(size != 0) + { + return Elements[size - 1]; + }else{ + throw std::length_error("Access to an empty vector!"); + } + } + + + template + Data& Vector::operator[](const ulong idx) const{ + if(idx < size) + { + return Elements[idx]; + } + else + { + throw std::out_of_range("Tried to access index " + std::to_string(idx) + " but the dimension of the vector is " + std::to_string(size)); + } + } + + + template + void Vector::MapPreOrder(const MapFunctor fun, void* par){ + for(ulong i=0; i + void Vector::MapPostOrder(const MapFunctor fun, void* par){ + ulong idx = size; + while(idx > 0) + { + fun(Elements[--idx], par); + } + } + + + template + 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 idx = size; + while(idx > 0){ + fun(Elements[--idx], par, acc); + } + } } diff --git a/librerie/exercise2/vector/vector.hpp b/librerie/exercise2/vector/vector.hpp old mode 100755 new mode 100644 index 6f127ff..b5fcbe5 --- a/librerie/exercise2/vector/vector.hpp +++ b/librerie/exercise2/vector/vector.hpp @@ -13,15 +13,17 @@ namespace lasd { /* ************************************************************************** */ template -class Vector { // Must extend LinearContainer, MappableContainer, and FoldableContainer +class Vector : virtual public LinearContainer, + virtual public MappableContainer, + virtual public FoldableContainer{ // Must extend LinearContainer, MappableContainer, and FoldableContainer private: - // ... protected: - // using LinearContainer::???; + using LinearContainer::size; + Data* Elements = nullptr; // ... @@ -29,79 +31,80 @@ public: // Default constructor // Vector() specifiers; + Vector() = default; + /* ************************************************************************ */ // Specific constructors - // Vector(argument) specifiers; // A vector with a given initial dimension - // Vector(argument) specifiers; // A vector obtained from a LinearContainer + Vector(const ulong); // A vector with a given initial dimension + Vector(const LinearContainer&); // A vector obtained from a LinearContainer /* ************************************************************************ */ // Copy constructor - // Vector(argument) specifiers; + Vector(const Vector&); // Move constructor - // Vector(argument) specifiers; + Vector(Vector&&)noexcept; /* ************************************************************************ */ // Destructor - // ~Vector() specifiers; + ~Vector(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + Vector& operator=(const Vector&); // Move assignment - // type operator=(argument) specifiers; + Vector& operator=(Vector&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const Vector&) const noexcept; + bool operator!=(const Vector&) const noexcept; /* ************************************************************************ */ // Specific member functions - // type Resize(argument) specifiers; // Resize the vector to a given size + void Resize(const ulong); // Resize the vector to a given size /* ************************************************************************ */ // Specific member functions (inherited from Container) - // type Clear() specifiers; // Override Container member + void Clear() override; // Override Container member /* ************************************************************************ */ // Specific member functions (inherited from LinearContainer) - // type Front() specifiers; // Override LinearContainer member (must throw std::length_error when empty) - // type Back() specifiers; // Override LinearContainer member (must throw std::length_error when empty) + Data& Front() const override; // Override LinearContainer member (must throw std::length_error when empty) + Data& Back() const override; // Override LinearContainer member (must throw std::length_error when empty) - // type operator[](argument) specifiers; // Override LinearContainer member (must throw std::out_of_range when out of range) + Data& operator[](const ulong) const override; // Override LinearContainer member (must throw std::out_of_range when out of range) /* ************************************************************************ */ // Specific member functions (inherited from MappableContainer) - // using typename MappableContainer::MapFunctor; + using typename MappableContainer::MapFunctor; - // type MapPreOrder(arguments) specifiers; // Override MappableContainer member - // type MapPostOrder(arguments) specifiers; // Override MappableContainer member + void MapPreOrder(const MapFunctor, void*) override; // Override MappableContainer member + void MapPostOrder(const MapFunctor, void*) override; // Override MappableContainer member /* ************************************************************************ */ // Specific member functions (inherited from FoldableContainer) - // using typename FoldableContainer::FoldFunctor; - - // type FoldPreOrder(arguments) specifiers; // Override FoldableContainer member - // type FoldPostOrder(arguments) specifiers; // Override FoldableContainer member + using typename FoldableContainer::FoldFunctor; + void FoldPreOrder(const FoldFunctor, const void*, void*) const override; // Override FoldableContainer member + void FoldPostOrder(const FoldFunctor, const void*, void*) const override; // Override FoldableContainer member }; /* ************************************************************************** */