From c550ec0ef448d8b3377c57e89595e09295fec3c0 Mon Sep 17 00:00:00 2001 From: Alessandro Ferro <49845537+xfarrow@users.noreply.github.com> Date: Mon, 26 Apr 2021 19:12:17 +0200 Subject: [PATCH] Library 3 --- librerie/exercise3/Exercise3.pdf | Bin 0 -> 59705 bytes librerie/exercise3/binarytree/binarytree.cpp | 180 ++++++++++++++- librerie/exercise3/binarytree/binarytree.hpp | 222 +++++++++---------- librerie/exercise3/container/container.cpp | 16 +- 4 files changed, 301 insertions(+), 117 deletions(-) create mode 100644 librerie/exercise3/Exercise3.pdf diff --git a/librerie/exercise3/Exercise3.pdf b/librerie/exercise3/Exercise3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa82f8019e0b058733397792a74eb98df3afd3ef GIT binary patch literal 59705 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/librerie/exercise3/binarytree/binarytree.cpp b/librerie/exercise3/binarytree/binarytree.cpp index 37c673b..fd21f92 100644 --- a/librerie/exercise3/binarytree/binarytree.cpp +++ b/librerie/exercise3/binarytree/binarytree.cpp @@ -5,7 +5,185 @@ namespace lasd { /* ************************************************************************** */ -// ... +// checks if two trees which have the same root node are identical +template +bool BinaryTree::Node::operator==(const Node& toEvaluate){ + return EqualNodes(this, &toEvaluate); +} + +bool BinaryTree::Node::EqualNodes(Node* n1, Node* n2){ + if(n1->IsLeaf() && n2->IsLeaf() && n1->data == n2->data) return true; + if( (n1->HasLeftChild() && !n2->HasLeftChild()) || (n1->HasRightChild() && !n2->HasRightChild()) ) return false; + return( n1->data == n2->data && + EqualNodes(n1->LeftChild(),n2->LeftChild()) && + EqualNodes(n1->RightChild(),n2->RightChild()) + ) +} + +template +bool BinaryTree::Node::operator!=(const Node& toEvaluate){ + return !(*this == toEvaluate) +} + +template +Data& BinaryTree::Node::Element(){ + return this->data; +} + +template +const Data& BinaryTree::Node::Element(){ + return this->data; +} + +template +bool BinaryTree::operator==(const BinaryTree& toCompare) const noexcept{ + return(Root() == toCompare.Root()); +} + +template +bool BinaryTree::operator!=(const BinaryTree& toCompare) const noexcept{ + return(Root() != toCompare.Root()); +} + +template +void BinaryTree::MapPreOrder(const MapFunctor function, void* par){ + MapPreOrder(function, par, &Root()); +} + +template +void BinaryTree::MapPostOrder(const MapFunctor function, void* par){ + MapPostOrder(function, par, &Root()); +} + +template +void BinaryTree::FoldPreOrder(const FoldFunctor function, const void* par, void* acc){ + FoldPreOrder(function, par, acc, &Root()); +} + +template +void BinaryTree::FoldPostOrder(const FoldFunctor function, const void* par, void* acc) const{ + FoldPostOrder(function, par, acc, &Root()); +} + +template +void BinaryTree::MapInOrder(const MapFunctor function, void* par){ + MapInOrder(function, par, &Root()); +} + +template +void BinaryTree::FoldInOrder(const MapFunctor function, const void* par, void* acc) const{ + FoldInOrder(function, par, acc, &Root()); +} + +template +void BinaryTree::MapBreadth(const MapFunctor function, void* par){ + MapBreadth(function, par, &Root()); +} + +template +void BinaryTree::FoldBreadth(const FoldFunctor function, const void* par, void* acc) const{ + FoldBreadth(function, par, acc, &Root()); +} + +/* ----- AUX ----- */ + +template +void BinaryTree::MapPreOrder(const MapFunctor function, void* par, Node* node){ + if(node != nullptr){ + function(node->Element(), par); + if(node->HasLeftChild()){ + MapPreOrder(function, par, node->LeftChild()); + } + if(node->HasRightChild()){ + MapPreOrder(function, par, node->RightChild()); + } + } +} + +template +void BinaryTree::MapPostOrder(const MapFunctor function, void* par, Node* node){ + if(node != nullptr){ + if(node->HasLeftChild()){ + MapPreOrder(function, par, node->LeftChild()); + } + if(node->HasRightChild()){ + MapPreOrder(function, par, node->RightChild()); + } + function(node->Element(), par); + } +} + +template +void BinaryTree::FoldPreOrder(const FoldFunctor function, const void* par, void* acc, const Node* node){ + if(node != nullptr){ + function(node->Element(), par, acc); + if(node->HasLeftChild()){ + FoldPreOrder(function, par, acc, node->LeftChild()); + } + if(node->HasRightChild()){ + FoldPreOrder(function, par, acc, node->RightChild()); + } + } +} + +template +void BinaryTree::FoldPostOrder(const FoldFunctor function, const void* par, void* acc, const Node* node){ + if(node != nullptr){ + if(node->HasLeftChild()){ + FoldPreOrder(function, par, acc, node->LeftChild()); + } + if(node->HasRightChild()){ + MapPreOrder(function, par, acc, node->RightChild()); + } + function(node->Element(), par, acc); + } +} +template +void BinaryTree::MapInOrder(const MapFunctor function, void* par, Node* node){ + if(node != nullptr){ + if(node->HasLeftChild()){ + MapInOrder(function, par, node->LeftChild()); + } + function(node->Element(), par); + if(node->HasRightChild()){ + MapInOrder(function, par, node->RightChild()); + } + } +} + +template +void FoldInOrder(const FoldFunctor function, const void* par, void* acc, const Node* node) const{ + if(node != nullptr){ + if(node->HasLeftChild()){ + FoldInOrder(function, par, acc, node->LeftChild()); + } + function(node->Element(), par, acc); + if(node->HasRightChild()){ + FoldPreOrder(function, par, acc, node->RightChild()); + } + } +} + +template +void MapBreadth(const MapFunctor function, void* par, Node* node){ + QueueLst toVisit; + if(node != nullptr){ + toVisit.Enqueue(node); + while(!toVisit.Empty()){ + func(toVisit.Head()->Element(), par); + + if(toVisit.Head()->HasLeftChild()){ + toVisit.Enqueue(&(toVisit.Head()->LeftChild())); + } + if(toVisit.Head()->HasRightChild()){ + toVisit.Enqueue(&(toVisit.Head()->RightChild())); + } + ql.Dequeue(); + } + } +} + + /* ************************************************************************** */ diff --git a/librerie/exercise3/binarytree/binarytree.hpp b/librerie/exercise3/binarytree/binarytree.hpp index f3333a5..9d885e4 100644 --- a/librerie/exercise3/binarytree/binarytree.hpp +++ b/librerie/exercise3/binarytree/binarytree.hpp @@ -8,7 +8,13 @@ #include "../iterator/iterator.hpp" -// #include "..." +#include "../queue/queue.hpp" +#include "../queue/vec/queuevec.hpp" +#include "../queue/lst/queuelst.hpp" + +#include "../stack/stack.hpp" +#include "../stack/lst/stacklst.hpp" +#include "../stack/vec/stackvec.hpp" /* ************************************************************************** */ @@ -17,17 +23,16 @@ namespace lasd { /* ************************************************************************** */ template -class BinaryTree { // Must extend InOrder/BreadthMappableContainer and InOrder/BreadthFoldableContainer +class BinaryTree : virtual public InOrderMappableContainer, + virtual public BreadthMappableContainer, + virtual public InOrderFoldableContainer, + virtual public BreadthFoldableContainer{ // Must extend InOrder/BreadthMappableContainer and InOrder/BreadthFoldableContainer private: - // ... - protected: - // using InOrder/BreadthMappableContainer::???; - - // ... + using BreadthMappableContainer::size; public: @@ -35,399 +40,392 @@ public: private: - // ... - protected: + Data data; + + // Comparison operators + bool operator==(const Node&) const noexcept; // Comparison of abstract types is possible, but should not be visible. + bool operator!=(const Node&) const noexcept; // Comparison of abstract types is possible, but should not be visible. + + bool EqualNodes(Node*, Node*); - // ... public: - // friend class BinaryTree; + friend class BinaryTree; /* ********************************************************************** */ // Destructor - // ~Node() specifiers + virtual ~Node() = default; /* ********************************************************************** */ // Copy assignment - // type operator=(argument); // Copy assignment of abstract types should not be possible. + Node& operator=(const Node&) = delete; // Copy assignment of abstract types should not be possible. // Move assignment - // type operator=(argument); // Move assignment of abstract types should not be possible. + Node& operator=(Node&&) noexcept = delete; // Move assignment of abstract types should not be possible. /* ********************************************************************** */ - // Comparison operators - // type operator==(argument) specifiers; // Comparison of abstract types is possible, but should not be visible. - // type operator!=(argument) specifiers; // Comparison of abstract types is possible, but should not be visible. - /* ********************************************************************** */ // Specific member functions - // type Element() specifiers; // Mutable access to the element (concrete function should not throw exceptions) - // type Element() specifiers; // Immutable access to the element (concrete function should not throw exceptions) + Data& Element(); // Mutable access to the element (concrete function should not throw exceptions) + const Data& Element() const; // Immutable access to the element (concrete function should not throw exceptions) - // type IsLeaf() specifiers; // (concrete function should not throw exceptions) - // type HasLeftChild() specifiers; // (concrete function should not throw exceptions) - // type HasRightChild() specifiers; // (concrete function should not throw exceptions) + virtual bool IsLeaf() const noexcept = 0; // (concrete function should not throw exceptions) + virtual bool HasLeftChild() const noexcept = 0; // (concrete function should not throw exceptions) + virtual bool HasRightChild() const noexcept = 0; // (concrete function should not throw exceptions) - // type LeftChild() specifiers; // (concrete function must throw std::out_of_range when not existent) - // type RightChild() specifiers; // (concrete function must throw std::out_of_range when not existent) + virtual Node& LeftChild() const = 0; // (concrete function must throw std::out_of_range when not existent) + virtual Node& RightChild() const = 0; // (concrete function must throw std::out_of_range when not existent) }; /* ************************************************************************ */ // Destructor - // ~BinaryTree() specifiers + virtual ~BinaryTree() = default; /* ************************************************************************ */ // Copy assignment - // type operator=(argument); // Copy assignment of abstract types should not be possible. + BinaryTree& operator=(const BinaryTree&) = delete; // Copy assignment of abstract types should not be possible. // Move assignment - // type operator=(argument); // Move assignment of abstract types should not be possible. + BinaryTree& operator=(BinaryTree&&) noexcept = delete; // Move assignment of abstract types should not be possible. /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; // Comparison of abstract binary tree is possible. - // type operator!=(argument) specifiers; // Comparison of abstract binary tree is possible. + bool operator==(const BinaryTree&) const noexcept; // Comparison of abstract binary tree is possible. + bool operator!=(const BinaryTree&) const noexcept; // Comparison of abstract binary tree is possible. /* ************************************************************************ */ // Specific member functions - // type Root() specifiers; // (concrete function must throw std::length_error when empty) + virtual Node& Root() const = 0; // (concrete function must throw std::length_error when empty) /* ************************************************************************ */ // 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 /* ************************************************************************ */ // Specific member functions (inherited from InOrderMappableContainer) - // type MapInOrder(arguments) specifiers; // Override InOrderMappableContainer member + void MapInOrder(const MapFunctor, void*) override; // Override InOrderMappableContainer member /* ************************************************************************ */ // Specific member functions (inherited from InOrderFoldableContainer) - // type FoldInOrder(arguments) specifiers; // Override InOrderFoldableContainer member + void FoldInOrder(const FoldFunctor, const void*, void*) const override; // Override InOrderFoldableContainer member /* ************************************************************************ */ // Specific member functions (inherited from BreadthMappableContainer) - // type MapBreadth(arguments) specifiers; // Override BreadthMappableContainer member + MapBreadth(const MapFunctor, void*) override; // Override BreadthMappableContainer member /* ************************************************************************ */ // Specific member functions (inherited from BreadthFoldableContainer) - // type FoldBreadth(arguments) specifiers; // Override BreadthFoldableContainer member + void FoldBreadth(const FoldFunctor, const void*, void*) const override; // Override BreadthFoldableContainer member protected: // Auxiliary member functions (for MappableContainer) - // type MapPreOrder(arguments) specifiers; // Accessory function executing from one node of the tree - // type MapPostOrder(arguments) specifiers; // Accessory function executing from one node of the tree + void MapPreOrder(const MapFunctor, void*, Node*) override; // Accessory function executing from one node of the tree + void MapPostOrder(const MapFunctor, void*, Node*) override; // Accessory function executing from one node of the tree /* ************************************************************************ */ // Auxiliary member functions (for FoldableContainer) - // type FoldPreOrder(arguments) specifiers; // Accessory function executing from one node of the tree - // type FoldPostOrder(arguments) specifiers; // Accessory function executing from one node of the tree + void FoldPreOrder(const FoldFunctor, const void*, void*, const Node*) const override; // Accessory function executing from one node of the tree + void FoldPostOrder(const FoldFunctor, const void*, void*, const Node*) const override; // Accessory function executing from one node of the tree /* ************************************************************************ */ // Auxiliary member functions (for InOrderMappableContainer) - // type MapInOrder(arguments) specifiers; // Accessory function executing from one node of the tree + void MapInOrder(const MapFunctor, void*, Node*) override; // Accessory function executing from one node of the tree /* ************************************************************************ */ // Auxiliary member functions (for InOrderFoldableContainer) - // type FoldInOrder(arguments) specifiers; // Accessory function executing from one node of the tree + void FoldInOrder(const FoldFunctor, const void*, void*, const Node*) const override; // Accessory function executing from one node of the tree /* ************************************************************************ */ // Auxiliary member functions (for BreadthMappableContainer) - // type MapBreadth(arguments) specifiers; // Accessory function executing from one node of the tree + void MapBreadth(const MapFunctor, void*, Node*) override; // Accessory function executing from one node of the tree /* ************************************************************************ */ // Auxiliary member functions (for BreadthFoldableContainer) - // type FoldBreadth(arguments) specifiers; // Accessory function executing from one node of the tree + void FoldBreadth(const FoldFunctor, const void*, void*, const Node*) const override; // Accessory function executing from one node of the tree }; /* ************************************************************************** */ template -class BTPreOrderIterator { // Must extend ForwardIterator +class BTPreOrderIterator : virtual public ForwardIterator { // Must extend ForwardIterator private: - // ... - protected: - - // ... + struct BinaryTree::Node* curr; + StackLst stack; public: // Specific constructors - // BTPreOrderIterator(argument) specifiers; // An iterator over a given binary tree + BTPreOrderIterator(const BinaryTree&); // An iterator over a given binary tree /* ************************************************************************ */ // Copy constructor - // BTPreOrderIterator(argument) specifiers; + BTPreOrderIterator(const BTPreOrderIterator&); // Move constructor - // BTPreOrderIterator(argument) specifiers; + BTPreOrderIterator(BTPreOrderIterator&&) noexcept; /* ************************************************************************ */ // Destructor - // ~BTPreOrderIterator() specifiers; + virtual ~BTPreOrderIterator(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + BTPreOrderIterator& operator=(const BTPreOrderIterator&); // Move assignment - // type operator=(argument) specifiers; + BTPreOrderIterator& operator=(BTPreOrderIterator&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const BTPreOrderIterator&) const noexcept; + bool operator!=(const BTPreOrderIterator&) const noexcept; /* ************************************************************************ */ // Specific member functions (inherited from Iterator) - // type operator*() specifiers; // (throw std::out_of_range when terminated) + struct BinaryTree::Node operator*() const; // (throw std::out_of_range when terminated) - // type Terminated() specifiers; // (should not throw exceptions) + bool Terminated() noexcept; // (should not throw exceptions) /* ************************************************************************ */ // Specific member functions (inherited from ForwardIterator) - // type operator++() specifiers; // (throw std::out_of_range when terminated) + void operator++(); // (throw std::out_of_range when terminated) }; /* ************************************************************************** */ template -class BTPostOrderIterator { // Must extend ForwardIterator +class BTPostOrderIterator : virtual public ForwardIterator { // Must extend ForwardIterator private: - // ... - protected: - - // ... + struct BinaryTree::Node* curr; + StackLst stack; public: // Specific constructors - // BTPostOrderIterator(argument) specifiers; // An iterator over a given binary tree + BTPostOrderIterator(const BinaryTree&); // An iterator over a given binary tree /* ************************************************************************ */ // Copy constructor - // BTPostOrderIterator(argument) specifiers; + BTPostOrderIterator(const BTPostOrderIterator&); // Move constructor - // BTPostOrderIterator(argument) specifiers; + BTPostOrderIterator(BTPostOrderIterator&&) noexcept; /* ************************************************************************ */ // Destructor - // ~BTPostOrderIterator() specifiers; + virtual ~BTPostOrderIterator(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + BTPostOrderIterator& operator=(const BTPostOrderIterator&); // Move assignment - // type operator=(argument) specifiers; + BTPostOrderIterator& operator=(BTPostOrderIterator&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const BTPostOrderIterator&) const noexcept; + bool operator!=(const BTPostOrderIterator&) const noexcept; /* ************************************************************************ */ // Specific member functions (inherited from Iterator) - // type operator*() specifiers; // (throw std::out_of_range when terminated) + struct BinaryTree::Node operator*() const; // (throw std::out_of_range when terminated) - // type Terminated() specifiers; // (should not throw exceptions) + bool Terminated() noexcept; // (should not throw exceptions) /* ************************************************************************ */ // Specific member functions (inherited from ForwardIterator) - // type operator++() specifiers; // (throw std::out_of_range when terminated) + void operator++(); // (throw std::out_of_range when terminated) }; /* ************************************************************************** */ template -class BTInOrderIterator { // Must extend ForwardIterator +class BTInOrderIterator : virtual public ForwardIterator { // Must extend ForwardIterator private: - // ... - protected: - - // ... + struct BinaryTree::Node* curr; + StackLst stack; public: // Specific constructors - // BTInOrderIterator(argument) specifiers; // An iterator over a given binary tree + BTInOrderIterator(const BinaryTree&); // An iterator over a given binary tree /* ************************************************************************ */ // Copy constructor - // BTInOrderIterator(argument) specifiers; + BTInOrderIterator(const BTInOrderIterator&); // Move constructor - // BTInOrderIterator(argument) specifiers; + BTInOrderIterator(BTInOrderIterator&&) noexcept; /* ************************************************************************ */ // Destructor - // ~BTInOrderIterator() specifiers; + virtual ~BTInOrderIterator(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + BTInOrderIterator& operator=(const BTInOrderIterator&); // Move assignment - // type operator=(argument) specifiers; + BTInOrderIterator& operator=(BTInOrderIterator&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const BTInOrderIterator&) const noexcept; + bool operator!=(const BTInOrderIterator&) const noexcept; /* ************************************************************************ */ // Specific member functions (inherited from Iterator) - // type operator*() specifiers; // (throw std::out_of_range when terminated) + struct BinaryTree::Node operator*() const; // (throw std::out_of_range when terminated) - // type Terminated() specifiers; // (should not throw exceptions) + bool Terminated() noexcept; // (should not throw exceptions) /* ************************************************************************ */ // Specific member functions (inherited from ForwardIterator) - // type operator++() specifiers; // (throw std::out_of_range when terminated) + void operator++(); // (throw std::out_of_range when terminated) }; /* ************************************************************************** */ template -class BTBreadthIterator { // Must extend ForwardIterator +class BTBreadthIterator : virtual public ForwardIterator{ // Must extend ForwardIterator private: - // ... - protected: - // ... + struct BinaryTree::Node* curr; + QueueVec queue; public: // Specific constructors - // BTBreadthIterator(argument) specifiers; // An iterator over a given binary tree + BTBreadthIterator(const BinaryTree&); // An iterator over a given binary tree /* ************************************************************************ */ // Copy constructor - // BTBreadthIterator(argument) specifiers; + BTBreadthIterator(const BTBreadthIterator&); // Move constructor - // BTBreadthIterator(argument) specifiers; + BTBreadthIterator(BTBreadthIterator&&) noexcept; /* ************************************************************************ */ // Destructor - // ~BTBreadthIterator() specifiers; + virtual ~BTBreadthIterator(); /* ************************************************************************ */ // Copy assignment - // type operator=(argument) specifiers; + BTBreadthIterator& operator=(const BTBreadthIterator&); // Move assignment - // type operator=(argument) specifiers; + BTBreadthIterator& operator=(BTBreadthIterator&&) noexcept; /* ************************************************************************ */ // Comparison operators - // type operator==(argument) specifiers; - // type operator!=(argument) specifiers; + bool operator==(const BTBreadthIterator&) const noexcept; + bool operator!=(const BTBreadthIterator&) const noexcept; /* ************************************************************************ */ // Specific member functions (inherited from Iterator) - // type operator*() specifiers; // (throw std::out_of_range when terminated) + struct BinaryTree::Node operator*() const; // (throw std::out_of_range when terminated) - // type Terminated() specifiers; // (should not throw exceptions) + bool Terminated() noexcept; // (should not throw exceptions) /* ************************************************************************ */ // Specific member functions (inherited from ForwardIterator) - // type operator++() specifiers; // (throw std::out_of_range when terminated) + void operator++(); // (throw std::out_of_range when terminated) }; diff --git a/librerie/exercise3/container/container.cpp b/librerie/exercise3/container/container.cpp index d374ceb..6bbe4bf 100644 --- a/librerie/exercise3/container/container.cpp +++ b/librerie/exercise3/container/container.cpp @@ -1,10 +1,18 @@ namespace lasd { -/* ************************************************************************** */ +template +void AuxFoldExists(const Data& dat, const void* val, void* exists){ + if(dat == *((Data*)val)){ + *((bool*)exists) = true; + } +} -// ... - -/* ************************************************************************** */ +template +bool FoldableContainer::Exists(const Data& dat) const noexcept{ + bool exists = false; + FoldPreOrder(&AuxFoldExists, &dat, &exists); + return exists; +} }