You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

103 lines
3.2 KiB

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* Bureaucrat.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: narnaud <narnaud@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/06/24 13:06:55 by narnaud #+# #+# */
/* Updated: 2022/06/27 15:03:06 by narnaud ### ########.fr */
/* */
/* ************************************************************************** */
#include "Bureaucrat.hpp"
/* Constructors */
Bureaucrat::Bureaucrat(void) {}
Bureaucrat::Bureaucrat(const string name,
int grade) throw(Bureaucrat::GradeTooHighException,
Bureaucrat::GradeTooLowException)
: _name(name) {
if (grade < 1)
throw Bureaucrat::GradeTooHighException();
if (grade > 150)
throw Bureaucrat::GradeTooLowException();
_grade = grade;
}
/* copy const. */
Bureaucrat::Bureaucrat(Bureaucrat const &src) {
(void)src;
}
/* assign const. */
Bureaucrat &Bureaucrat::operator=(Bureaucrat const &src) {
(void)src;
return (*this);
}
/* destructor */
Bureaucrat::~Bureaucrat(void) {
}
/* Getters */
const string Bureaucrat::getName(void) const { return (_name); }
int Bureaucrat::getGrade(void) const { return (_grade); }
/* Exception */
const char *Bureaucrat::GradeTooHighException::what(void) const throw() {
return ("grade is too high for a bureaucrat");
}
const char *Bureaucrat::GradeTooLowException::what(void) const throw() {
return ("grade is too low for a bureaucrat");
}
/* Methods */
void Bureaucrat::incrGrade(int diff) throw(Bureaucrat::GradeTooHighException) {
int new_grade = _grade - diff;
if (new_grade < 1)
throw Bureaucrat::GradeTooHighException();
_grade = new_grade;
}
void Bureaucrat::decrGrade(int diff) throw(Bureaucrat::GradeTooLowException) {
int new_grade = _grade + diff;
if (new_grade > 150)
throw Bureaucrat::GradeTooLowException();
_grade = new_grade;
}
void Bureaucrat::signForm(Form &form) const {
cout << *this << " sign " << form << ":";
try {
if (!form.beSigned(*this))
cout << " success." << endl;
else
cout << "error.\n\tform is already signed." << endl;
} catch (std::exception &e) {
cout << "error.\n\t" << e.what() << endl;
}
}
void Bureaucrat::executeForm(const Form &form) const {
cout << *this << " execute " << form << ":";
try {
if (!form.execute(*this))
cout << " success." << endl;
else
cout << *this << " execute " << form.getName()
<< "error.\n\tform is not signed" << endl;
} catch (std::exception &e) {
cout << "error.\n\t" << e.what() << endl;
}
}
/* Stream */
std::ostream &operator<<(std::ostream &out, Bureaucrat const &b) {
out << b.getName() << "(" << b.getGrade() << ")";
return (out);
}