From 39ec74751485ced5db4fd03d29e3d0a80eb5c181 Mon Sep 17 00:00:00 2001 From: aortigos Date: Wed, 18 Feb 2026 10:31:00 +0100 Subject: [PATCH] Starting ex03 --- ex03/AForm/AForm.cpp | 125 ++++++++++++++ ex03/AForm/AForm.hpp | 60 +++++++ ex03/Bureaucrat/Bureaucrat.cpp | 154 ++++++++++++++++++ ex03/Bureaucrat/Bureaucrat.hpp | 57 +++++++ ex03/Intern/Intern.cpp | 13 ++ ex03/Intern/Intern.hpp | 27 +++ ex03/Makefile | 46 ++++++ .../PresidentialPardonForm.cpp | 91 +++++++++++ .../PresidentialPardonForm.hpp | 45 +++++ .../RobotomyRequestForm.cpp | 97 +++++++++++ .../RobotomyRequestForm.hpp | 48 ++++++ .../ShrubberyCreationForm.cpp | 109 +++++++++++++ .../ShrubberyCreationForm.hpp | 47 ++++++ ex03/main.cpp | 41 +++++ 14 files changed, 960 insertions(+) create mode 100644 ex03/AForm/AForm.cpp create mode 100644 ex03/AForm/AForm.hpp create mode 100644 ex03/Bureaucrat/Bureaucrat.cpp create mode 100644 ex03/Bureaucrat/Bureaucrat.hpp create mode 100644 ex03/Intern/Intern.cpp create mode 100644 ex03/Intern/Intern.hpp create mode 100644 ex03/Makefile create mode 100644 ex03/PresidentialPardonForm/PresidentialPardonForm.cpp create mode 100644 ex03/PresidentialPardonForm/PresidentialPardonForm.hpp create mode 100644 ex03/RobotomyRequestForm/RobotomyRequestForm.cpp create mode 100644 ex03/RobotomyRequestForm/RobotomyRequestForm.hpp create mode 100644 ex03/ShrubberyCreationForm/ShrubberyCreationForm.cpp create mode 100644 ex03/ShrubberyCreationForm/ShrubberyCreationForm.hpp create mode 100644 ex03/main.cpp diff --git a/ex03/AForm/AForm.cpp b/ex03/AForm/AForm.cpp new file mode 100644 index 0000000..ecf5d12 --- /dev/null +++ b/ex03/AForm/AForm.cpp @@ -0,0 +1,125 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* AForm.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos 150 || gradeToExecute > 150) + throw GradeTooLowException(); + else if (gradeToSign < 1 || gradeToExecute < 1) + throw GradeTooHighException(); + //std::cout << "AForm constructor with params called" << std::endl; +} + +AForm::AForm(const AForm &other) : + name (other.getName()), isSigned(other.getIsSigned()), + gradeToSign(other.getGradeToSign()), + gradeToExecute(other.getGradeToExecute()) +{ + //std::cout << "AForm copy constructor called" << std::endl; +} + +AForm& AForm::operator=(const AForm &other) +{ + if (this != &other) + this->isSigned = other.getIsSigned(); + //std::cout << "AForm copy assigment operator called" << std::endl; + return (*this); +} + +AForm::~AForm() +{ + //std::cout << "Destructor called" +} + +////////////////// +// Getters // +////////////////// + +std::string AForm::getName() const +{ + return (this->name); +} + +bool AForm::getIsSigned() const +{ + return (this->isSigned); +} + +int AForm::getGradeToSign() const +{ + return (this->gradeToSign); +} + +int AForm::getGradeToExecute() const +{ + return (this->gradeToExecute); +} + + +////////////////// +// SignAForm // +////////////////// + +void AForm::beSigned(const Bureaucrat &br) +{ + if (this->gradeToSign < br.getGrade()) + throw GradeTooLowException(); + this->isSigned = true; +} + + +////////////////// +// << // +////////////////// + +std::ostream& operator<<(std::ostream &os, const AForm &form) +{ + std::string isItSigned; + + if (form.getIsSigned()) + { + isItSigned = " is signed."; + } else { + isItSigned = " is not signed."; + } + + os << form.getName() << isItSigned; + return (os); +} + + +////////////////// +// Excepciones // +////////////////// +const char* AForm::GradeTooLowException::what() const throw() +{ + return ("grade too low"); +} + +const char* AForm::GradeTooHighException::what() const throw() +{ + return ("grade too high"); +} \ No newline at end of file diff --git a/ex03/AForm/AForm.hpp b/ex03/AForm/AForm.hpp new file mode 100644 index 0000000..8b11d79 --- /dev/null +++ b/ex03/AForm/AForm.hpp @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* AForm.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +# include + +class Bureaucrat; + +class AForm +{ + private: + const std::string name; + bool isSigned; + const int gradeToSign; + const int gradeToExecute; + + public: + AForm(); + AForm(const AForm &other); + AForm& operator=(const AForm &other); + virtual ~AForm(); + + AForm(std::string name, int gradeToSign, int gradeToExecute); + + std::string getName() const; + bool getIsSigned() const; + int getGradeToSign() const; + int getGradeToExecute() const; + + void beSigned(const Bureaucrat &br); + + virtual void execute(Bureaucrat const &executor) const = 0; + + class GradeTooLowException : public std::exception { + public: + virtual const char *what() const throw(); + }; + + class GradeTooHighException : public std::exception { + public: + virtual const char *what() const throw(); + }; +}; + +std::ostream& operator<<(std::ostream &os, const AForm &AForm); + +#endif diff --git a/ex03/Bureaucrat/Bureaucrat.cpp b/ex03/Bureaucrat/Bureaucrat.cpp new file mode 100644 index 0000000..558f7c3 --- /dev/null +++ b/ex03/Bureaucrat/Bureaucrat.cpp @@ -0,0 +1,154 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Bureaucrat.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos grade = other.getGrade(); + //std::cout << "Copy operator called" << std::endl; + return (*this); +} + +Bureaucrat::~Bureaucrat() +{ + //std::cout << "Bureaucrat destroyed" << std::endl; +} + +Bureaucrat::Bureaucrat(std::string name, int grade) : name(name) +{ + if (grade > 150) + throw GradeTooLowException(); + else if (grade < 1) + throw GradeTooHighException(); + this->grade = grade; + //std::cout << "Bureaucrat with params has been created" << std::endl; +} + + +////////////////// +// Getters // +////////////////// + +std::string Bureaucrat::getName() const +{ + return (this->name); +} + +int Bureaucrat::getGrade() const +{ + return (this->grade); +} + + +////////////////// +// Grade // +////////////////// + +void Bureaucrat::incrementGrade() +{ + if (this->grade <= 1) + throw GradeTooHighException(); + this->grade--; +} + +void Bureaucrat::decrementGrade() +{ + if (this->grade >= 150) + throw GradeTooLowException(); + this->grade++; +} + +////////////////// +// Sign // +////////////////// + +void Bureaucrat::signForm(AForm &form) +{ + try { + form.beSigned(*this); + std::cout << this->name + << " signed " + << form.getName() + << std::endl; + } catch (std::exception &e) { + std::cout << this->name + << " couldn't sign " + << form.getName() + << " because " + << e.what() + << std::endl; + } +} + +void Bureaucrat::executeForm(AForm &form) +{ + try { + form.execute(*this); + std::cout << this->name + << " executed " + << form.getName() + << std::endl; + } catch (std::exception &e) { + std::cout << this->name + << " couldn't execute " + << form.getName() + << " because " + << e.what() + << std::endl; + } +} + + +////////////////// +// << // +////////////////// + +std::ostream &operator<<(std::ostream &os, const Bureaucrat &bureaucrat) +{ + os << bureaucrat.getName() + << ", bureaucrat grade " + << bureaucrat.getGrade() + << std::endl; + return (os); +} + + +////////////////// +// Excepciones // +////////////////// + +const char* Bureaucrat::GradeTooHighException::what() const throw() +{ + return ("Grade is too high!"); +} + +const char* Bureaucrat::GradeTooLowException::what() const throw() +{ + return ("Grade is too low!"); +} diff --git a/ex03/Bureaucrat/Bureaucrat.hpp b/ex03/Bureaucrat/Bureaucrat.hpp new file mode 100644 index 0000000..b7e057e --- /dev/null +++ b/ex03/Bureaucrat/Bureaucrat.hpp @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Bureaucrat.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos + +class AForm; + +class Bureaucrat +{ + private: + const std::string name; + int grade; + + public: + Bureaucrat(); + Bureaucrat(const Bureaucrat &other); + Bureaucrat &operator=(const Bureaucrat &other); + ~Bureaucrat(); + + Bureaucrat(std::string name, int grade); + + std::string getName() const; + int getGrade() const; + + void incrementGrade(); + void decrementGrade(); + + void signForm(AForm &form); + void executeForm(AForm &form); + + class GradeTooHighException : public std::exception { + public: + virtual const char* what() const throw(); + }; + + class GradeTooLowException : public std::exception { + public: + virtual const char* what() const throw(); + }; +}; + +std::ostream& operator<<(std::ostream &os, const Bureaucrat &bureaucrat); + +#endif diff --git a/ex03/Intern/Intern.cpp b/ex03/Intern/Intern.cpp new file mode 100644 index 0000000..2b3cdca --- /dev/null +++ b/ex03/Intern/Intern.cpp @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Intern.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos + +class Intern +{ + private: + + public: + +}; + +#endif diff --git a/ex03/Makefile b/ex03/Makefile new file mode 100644 index 0000000..5c8edfe --- /dev/null +++ b/ex03/Makefile @@ -0,0 +1,46 @@ +NAME = formExecution + +SRC = main.cpp \ + Bureaucrat/Bureaucrat.cpp AForm/AForm.cpp \ + ShrubberyCreationForm/ShrubberyCreationForm.cpp \ + RobotomyRequestForm/RobotomyRequestForm.cpp \ + PresidentialPardonForm/PresidentialPardonForm.cpp + +OBJ = $(SRC:.cpp=.o) + +CC = c++ +CFLAGS = -Wall -Wextra -Werror -std=c++98 + +GREEN = \033[0;32m +RED = \033[0;31m +RESET = \033[0m + +TOTAL := $(words $(SRC)) +COUNT = 0 + +all: $(NAME) + +$(NAME): $(OBJ) + @rm -f .build_start + @$(CC) $(CFLAGS) $(OBJ) -o $(NAME) + @printf "\n$(GREEN)✔ Listo (100%%)\n$(RESET)" + +%.o: %.cpp + @if [ ! -f .build_start ]; then printf "$(GREEN)Compilando archivos...\n$(RESET)"; touch .build_start; fi + @$(eval COUNT = $(shell echo $$(($(COUNT)+1)))) + @PERCENT=$$(($(COUNT)*100/$(TOTAL))); \ + BAR=$$(printf "%0.s#" $$(seq 1 $$((PERCENT/5)))); \ + SPACE=$$(printf "%0.s " $$(seq 1 $$((20-PERCENT/5)))); \ + printf "\r [$$BAR$$SPACE] %3d%% (%d/%d) $< " $$PERCENT $(COUNT) $(TOTAL) + @$(CC) $(CFLAGS) -c $< -o $@ + +clean: + @printf "$(RED)Eliminando...\n$(RESET)" + @rm -f $(OBJ) + +fclean: clean + @rm -f $(NAME) + +re: fclean all + +.PHONY: all clean fclean re diff --git a/ex03/PresidentialPardonForm/PresidentialPardonForm.cpp b/ex03/PresidentialPardonForm/PresidentialPardonForm.cpp new file mode 100644 index 0000000..2a50199 --- /dev/null +++ b/ex03/PresidentialPardonForm/PresidentialPardonForm.cpp @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* PresidentialPardonForm.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos target = other.getTarget(); + } + //std::cout << "AForm copy assigment operator called" << std::endl; + return (*this); +} + +PresidentialPardonForm::~PresidentialPardonForm() +{ + //std::cout << "Destructor called" +} + +PresidentialPardonForm::PresidentialPardonForm(std::string target) + : AForm("PresidentialPardonForm", 25, 5), + target(target) +{ + //std::cout << "AForm constructor with params called" << std::endl; +} + +////////////////// +// Getters // +////////////////// + +std::string PresidentialPardonForm::getTarget() const +{ + return (this->target); +} + + +////////////////// +// Execute // +////////////////// + +void PresidentialPardonForm::execute(Bureaucrat const &executor) const +{ + if (!this->getIsSigned()) + throw FormNotSignedException(); + if (this->getGradeToExecute() < executor.getGrade()) + throw AForm::GradeTooLowException(); + + // PresidentialPardonForm form action... + std::cout << this->target + << " has been pardoned by Zaphod Beeblebrox." + << std::endl; + +} + +////////////////// +// Exceptions // +////////////////// + +const char* PresidentialPardonForm::FormNotSignedException::what() const throw() +{ + return ("form is not signed."); +} \ No newline at end of file diff --git a/ex03/PresidentialPardonForm/PresidentialPardonForm.hpp b/ex03/PresidentialPardonForm/PresidentialPardonForm.hpp new file mode 100644 index 0000000..247c657 --- /dev/null +++ b/ex03/PresidentialPardonForm/PresidentialPardonForm.hpp @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* PresidentialPardonForm.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +# include "../AForm/AForm.hpp" +# include "../Bureaucrat/Bureaucrat.hpp" + +class PresidentialPardonForm : public AForm +{ + private: + std::string target; + + public: + PresidentialPardonForm(); + PresidentialPardonForm(const PresidentialPardonForm &other); + PresidentialPardonForm &operator=(const PresidentialPardonForm &other); + ~PresidentialPardonForm(); + + PresidentialPardonForm(std::string target); + + std::string getTarget() const; + + virtual void execute(Bureaucrat const &executor) const; + + class FormNotSignedException : public std::exception { + public: + virtual const char* what() const throw(); + }; + +}; + +#endif diff --git a/ex03/RobotomyRequestForm/RobotomyRequestForm.cpp b/ex03/RobotomyRequestForm/RobotomyRequestForm.cpp new file mode 100644 index 0000000..42b0902 --- /dev/null +++ b/ex03/RobotomyRequestForm/RobotomyRequestForm.cpp @@ -0,0 +1,97 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* RobotomyRequestForm.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos target = other.getTarget(); + } + //std::cout << "AForm copy assigment operator called" << std::endl; + return (*this); +} + +RobotomyRequestForm::~RobotomyRequestForm() +{ + //std::cout << "Destructor called" +} + +RobotomyRequestForm::RobotomyRequestForm(std::string target) + : AForm("RobotomyRequestForm", 72, 45), + target(target) +{ + //std::cout << "AForm constructor with params called" << std::endl; +} + +////////////////// +// Getters // +////////////////// + +std::string RobotomyRequestForm::getTarget() const +{ + return (this->target); +} + + +////////////////// +// Execute // +////////////////// + +void RobotomyRequestForm::execute(Bureaucrat const &executor) const +{ + if (!this->getIsSigned()) + throw FormNotSignedException(); + if (this->getGradeToExecute() < executor.getGrade()) + throw AForm::GradeTooLowException(); + + // RobotomyRequestForm form action... + std::cout << "**bzzzzzzzzz --- **drilling noises*" << std::endl; + + if (rand() % 2 == 0) + { + std::cout << this->target + << " has been successfully robotomized" << std::endl; + } else { + std::cout << "Robotomization failed :(" << std::endl; + } + +} + +////////////////// +// Exceptions // +////////////////// + +const char* RobotomyRequestForm::FormNotSignedException::what() const throw() +{ + return ("form is not signed."); +} \ No newline at end of file diff --git a/ex03/RobotomyRequestForm/RobotomyRequestForm.hpp b/ex03/RobotomyRequestForm/RobotomyRequestForm.hpp new file mode 100644 index 0000000..5634142 --- /dev/null +++ b/ex03/RobotomyRequestForm/RobotomyRequestForm.hpp @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* RobotomyRequestForm.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +# include +# include +# include "../AForm/AForm.hpp" +# include "../Bureaucrat/Bureaucrat.hpp" + + +class RobotomyRequestForm : public AForm +{ + private: + std::string target; + + public: + RobotomyRequestForm(); + RobotomyRequestForm(const RobotomyRequestForm &other); + RobotomyRequestForm &operator=(const RobotomyRequestForm &other); + ~RobotomyRequestForm(); + + RobotomyRequestForm(std::string target); + + std::string getTarget() const; + + virtual void execute(Bureaucrat const &executor) const; + + class FormNotSignedException : public std::exception { + public: + virtual const char* what() const throw(); + }; + +}; + +#endif diff --git a/ex03/ShrubberyCreationForm/ShrubberyCreationForm.cpp b/ex03/ShrubberyCreationForm/ShrubberyCreationForm.cpp new file mode 100644 index 0000000..b4b97d8 --- /dev/null +++ b/ex03/ShrubberyCreationForm/ShrubberyCreationForm.cpp @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ShrubberyCreationForm.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos target = other.getTarget(); + } + //std::cout << "AForm copy assigment operator called" << std::endl; + return (*this); +} + +ShrubberyCreationForm::~ShrubberyCreationForm() +{ + //std::cout << "Destructor called" +} + +ShrubberyCreationForm::ShrubberyCreationForm(std::string target) + : AForm("ShrubberyCreationForm", 145, 137), + target(target) +{ + //std::cout << "AForm constructor with params called" << std::endl; +} + +////////////////// +// Getters // +////////////////// + +std::string ShrubberyCreationForm::getTarget() const +{ + return (this->target); +} + + +////////////////// +// Execute // +////////////////// + +void ShrubberyCreationForm::execute(Bureaucrat const &executor) const +{ + if (!this->getIsSigned()) + throw FormNotSignedException(); + if (this->getGradeToExecute() < executor.getGrade()) + throw AForm::GradeTooLowException(); + + // ShrubberyCreation form action... + + std::string filename = this->target + "_shrubbery"; + std::ofstream file(filename.c_str()); + + if (!file.is_open()) + { + std::cerr << "Error: could not create file " + << filename << std::endl; + return ; + } + + file << " _-_\n"; + file << " /~~ ~~\\\n"; + file << " /~~ ~~\\\n"; + file << "{ }\n"; + file << " \\ _- -_ /\n"; + file << " ~ \\ // ~\n"; + file << "_- - | | _- _\n"; + file << " _ - | | -_\n"; + file << " // \\"; + + file.close(); +} + +////////////////// +// Exceptions // +////////////////// + +const char* ShrubberyCreationForm::FormNotSignedException::what() const throw() +{ + return ("form is not signed."); +} \ No newline at end of file diff --git a/ex03/ShrubberyCreationForm/ShrubberyCreationForm.hpp b/ex03/ShrubberyCreationForm/ShrubberyCreationForm.hpp new file mode 100644 index 0000000..2dc81d9 --- /dev/null +++ b/ex03/ShrubberyCreationForm/ShrubberyCreationForm.hpp @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ShrubberyCreationForm.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +# include +# include +# include "../AForm/AForm.hpp" +# include "../Bureaucrat/Bureaucrat.hpp" + +class ShrubberyCreationForm : public AForm +{ + private: + std::string target; + + public: + ShrubberyCreationForm(); + ShrubberyCreationForm(const ShrubberyCreationForm &other); + ShrubberyCreationForm &operator=(const ShrubberyCreationForm &other); + ~ShrubberyCreationForm(); + + ShrubberyCreationForm(std::string target); + + std::string getTarget() const; + + virtual void execute(Bureaucrat const &executor) const; + + class FormNotSignedException : public std::exception { + public: + virtual const char* what() const throw(); + }; + +}; + +#endif diff --git a/ex03/main.cpp b/ex03/main.cpp new file mode 100644 index 0000000..48979b2 --- /dev/null +++ b/ex03/main.cpp @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hadi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/02/16 22:32:41 by hadi #+# #+# */ +/* Updated: 2026/02/18 00:15:46 by hadi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Bureaucrat/Bureaucrat.hpp" +#include "AForm/AForm.hpp" +#include "ShrubberyCreationForm/ShrubberyCreationForm.hpp" +#include "RobotomyRequestForm/RobotomyRequestForm.hpp" +#include "PresidentialPardonForm/PresidentialPardonForm.hpp" + +int main() +{ + // Inicilizamos semilla de rand, necesario para + // RobotomyRequestForm + srand(time(NULL)); + + std::cout << "---- ex01 tests ----" << std::endl; + RobotomyRequestForm form("home"); + + try { + Bureaucrat angel("Angel", 1); + + angel.executeForm(form); + angel.signForm(form); + angel.executeForm(form); + } catch (std::exception &e) { + std::cout << e.what() << std::endl; + } + + std::cout << std::endl; + + return (0); +} \ No newline at end of file