piscine_cpp/cpp05/ex01/Bureaucrat.cpp
2025-03-17 20:18:31 +01:00

126 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* Bureaucrat.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/03/16 14:49:52 by rparodi #+# #+# */
/* Updated: 2025/03/17 16:59:03 by rparodi ### ########.fr */
/* */
/* ************************************************************************** */
#include "Bureaucrat.hpp"
#include <iostream>
#include <ostream>
/**
* @brief Constructor by default of Bureaucrat
*/
Bureaucrat::Bureaucrat(void) : _name("Roger"), _grade(150) {
std::cout << "[Bureaucrat] Default constructor called" << std::endl;
}
/**
* @brief Better constructor easier to test
*
* @param name the name of the Bureaucrat
* @param grade grade to start the carreer
*/
Bureaucrat::Bureaucrat(std::string name, int grade) : _name(name) {
std::cout << "[Bureaucrat] Smart constructor called" << std::endl;
if (grade < 1) {
throw GradeTooHighException();
} else if (grade > 150) {
throw GradeTooLowException();
} else {
this->_grade = grade;
}
}
Bureaucrat::Bureaucrat(Bureaucrat const & copy) : _name(copy._name), _grade(copy._grade) {
std::cout << "[Bureaucrat] Copy constructor called" << std::endl;
}
/**
* @brief Constructor with the operator '=' (Overload)
*
* @param assign Bureaucrat to copie
* @return It's a constructor
*/
Bureaucrat& Bureaucrat::operator=(Bureaucrat const & assign) {
std::cout << "[Bureaucrat] Assign constructor called" << std::endl;
this->_grade = assign._grade;
this->_name = assign._name;
return *this;
}
/**
* @brief Destructor for the Bureaucrat
*/
Bureaucrat::~Bureaucrat() {
std::cout << "[Bureaucrat] Desctuctor called" << std::endl;
}
/**
* @brief Getter for the grade
*
* @return grade (unsigned int 8bits)
*/
int Bureaucrat::getGrade() const {
return (this->_grade);
}
/**
* @brief Getter for the name
*
* @return name (string from standard)
*/
std::string Bureaucrat::getName() const {
return (this->_name);
}
/**
* @brief Get a promotion for the Bureaucrat
*/
void Bureaucrat::promote() {
if (this->_grade == 1) {
throw GradeTooHighException();
} else {
--this->_grade;
}
}
/**
* @brief Get a demotion for the Bureaucrat
*/
void Bureaucrat::demote() {
if (this->_grade == 150) {
throw GradeTooLowException();
} else {
++this->_grade;
}
}
/**
* @brief Overload of the '<<' operator to print
*
* @param output previous output
* @param toPrint Bureaucrat to print
* @return the output with the Bureaucrat
*/
std::ostream& operator<<(std::ostream& output, Bureaucrat const &toPrint) {
output << toPrint.getName() << ", bureaucrat grade " << toPrint.getGrade() << ".";
return (output);
}
void Bureaucrat::signForm(Form const &form) {
if (form.isSigned()) {
std::cerr << this->getName() << " couldnt sign " << form.getName() << " because form is already signed !" << std::endl;
} else {
if (form.getSign() < this->_grade) {
throw GradeTooLowException();
return;
}
}
}