d07 ajouts tests avec fixed et char dans ex01 et ex02
This commit is contained in:
@@ -28,12 +28,14 @@ LIBS =
|
|||||||
|
|
||||||
INCLUDES = -I$(D_HEADERS)
|
INCLUDES = -I$(D_HEADERS)
|
||||||
|
|
||||||
D_SRCS = .
|
D_SRCS = srcs
|
||||||
SRCS = main.cpp
|
SRCS = main.cpp \
|
||||||
|
Fixed.cpp
|
||||||
|
|
||||||
D_HEADERS = .
|
D_HEADERS = headers
|
||||||
HEADERS = colors.h \
|
HEADERS = colors.h \
|
||||||
Templates.hpp
|
Templates.hpp \
|
||||||
|
Fixed.hpp
|
||||||
|
|
||||||
D_OBJS = builds
|
D_OBJS = builds
|
||||||
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
||||||
|
|||||||
55
d07/ex00/headers/Fixed.hpp
Normal file
55
d07/ex00/headers/Fixed.hpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef FIXED_HPP
|
||||||
|
# define FIXED_HPP
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class Fixed {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Fixed(void); // default/parametric constructor
|
||||||
|
Fixed(Fixed const & src); // copy constructor
|
||||||
|
~Fixed(void); // destructor
|
||||||
|
Fixed(int integer);
|
||||||
|
Fixed(float const floater);
|
||||||
|
|
||||||
|
Fixed & operator= (Fixed const & rhs); // assignement operator
|
||||||
|
bool operator< (Fixed const & rhs) const;
|
||||||
|
bool operator> (Fixed const & rhs) const;
|
||||||
|
bool operator<=(Fixed const & rhs) const;
|
||||||
|
bool operator>=(Fixed const & rhs) const;
|
||||||
|
bool operator==(Fixed const & rhs) const;
|
||||||
|
bool operator!=(Fixed const & rhs) const;
|
||||||
|
Fixed operator+ (Fixed const & rhs) const;
|
||||||
|
Fixed operator- (Fixed const & rhs) const;
|
||||||
|
Fixed operator* (Fixed const & rhs) const;
|
||||||
|
Fixed operator/ (Fixed const & rhs) const;
|
||||||
|
Fixed & operator++(void); // prefix ++o
|
||||||
|
Fixed & operator--(void); // prefix --o
|
||||||
|
Fixed operator++(int); // postfix o++
|
||||||
|
Fixed operator--(int); // postfix o--
|
||||||
|
|
||||||
|
static const Fixed & min(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static const Fixed & max(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static Fixed & min(Fixed & lhs, Fixed & rhs);
|
||||||
|
static Fixed & max(Fixed & lhs, Fixed & rhs);
|
||||||
|
|
||||||
|
int getRawBits(void) const;
|
||||||
|
void setRawBits(int const raw);
|
||||||
|
float toFloat(void) const;
|
||||||
|
int toInt(void) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int _value;
|
||||||
|
static int const _frac;
|
||||||
|
static int const _max;
|
||||||
|
static int const _min;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,8 +2,27 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include "colors.h"
|
#include "colors.h"
|
||||||
#include "Templates.hpp"
|
#include "Templates.hpp"
|
||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
#define N_TEST "3"
|
#define N_TEST "5"
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
public:
|
||||||
|
Test(int n = 0) : _n(n) {}
|
||||||
|
int getN() const {return _n;}
|
||||||
|
bool operator==(Test const & rhs) const {return (this->_n == rhs._n);}
|
||||||
|
bool operator!=(Test const & rhs) const {return (this->_n != rhs._n);}
|
||||||
|
bool operator> (Test const & rhs) const {return (this->_n > rhs._n);}
|
||||||
|
bool operator< (Test const & rhs) const {return (rhs._n > this->_n);}
|
||||||
|
bool operator>=(Test const & rhs) const {return ( !(this->_n < rhs._n) );}
|
||||||
|
bool operator<=(Test const & rhs) const {return ( !(this->_n > rhs._n) );}
|
||||||
|
private:
|
||||||
|
int _n;
|
||||||
|
};
|
||||||
|
std::ostream & operator<<(std::ostream & o, Test const & rhs){
|
||||||
|
o << rhs.getN();
|
||||||
|
return (o);
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -13,12 +32,13 @@ int main() {
|
|||||||
{
|
{
|
||||||
int a = 2;
|
int a = 2;
|
||||||
int b = 3;
|
int b = 3;
|
||||||
|
|
||||||
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
|
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
|
||||||
::swap( a, b );
|
::swap( a, b );
|
||||||
std::cout << "a = " << a << ", b = " << b << "\n";
|
std::cout << "a = " << a << ", b = " << b << "\n";
|
||||||
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
|
|
||||||
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
|
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
|
||||||
|
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
@@ -26,12 +46,13 @@ int main() {
|
|||||||
{
|
{
|
||||||
std::string a = "chaine1";
|
std::string a = "chaine1";
|
||||||
std::string b = "chaine2";
|
std::string b = "chaine2";
|
||||||
|
|
||||||
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
|
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
|
||||||
::swap(a, b);
|
::swap(a, b);
|
||||||
std::cout << "a = " << a << ", b = " << b << "\n";
|
std::cout << "a = " << a << ", b = " << b << "\n";
|
||||||
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
|
|
||||||
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
|
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
|
||||||
|
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
@@ -39,12 +60,42 @@ int main() {
|
|||||||
{
|
{
|
||||||
float a = 2.42f;
|
float a = 2.42f;
|
||||||
float b = 32.7f;
|
float b = 32.7f;
|
||||||
|
|
||||||
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
|
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
|
||||||
::swap( a, b );
|
::swap( a, b );
|
||||||
std::cout << "a = " << a << ", b = " << b << "\n";
|
std::cout << "a = " << a << ", b = " << b << "\n";
|
||||||
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
|
|
||||||
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
|
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
|
||||||
|
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests fixed :" RESET "\n";
|
||||||
|
{
|
||||||
|
Fixed a(2.42f);
|
||||||
|
Fixed b(32.7f);
|
||||||
|
|
||||||
|
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
|
||||||
|
::swap( a, b );
|
||||||
|
std::cout << "a = " << a << ", b = " << b << "\n";
|
||||||
|
|
||||||
|
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
|
||||||
|
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests class :" RESET "\n";
|
||||||
|
{
|
||||||
|
|
||||||
|
Test a(8);
|
||||||
|
Test b(16);
|
||||||
|
|
||||||
|
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
|
||||||
|
::swap( a, b );
|
||||||
|
std::cout << "a = " << a << ", b = " << b << "\n";
|
||||||
|
|
||||||
|
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
|
||||||
|
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
225
d07/ex00/srcs/Fixed.cpp
Normal file
225
d07/ex00/srcs/Fixed.cpp
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions to print numbers in binary
|
||||||
|
* for the float, found help from stackoverflow :
|
||||||
|
* https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::string printBitsInt(int num)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((num & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string printBitsFloat(float num)
|
||||||
|
{
|
||||||
|
int *p = (int *)#
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((*p & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* statics variables initialisation
|
||||||
|
*
|
||||||
|
* for MAX integer :
|
||||||
|
* 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1))
|
||||||
|
* <= ... >=
|
||||||
|
* 11111111 10000000 00000000 00000000 (-8388608)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int const Fixed::_frac = 8;
|
||||||
|
int const Fixed::_max = -1U >> (_frac +1);
|
||||||
|
int const Fixed::_min = ~_max;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default constructor / copy constructor / destructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed() : _value(0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(Fixed const & src) {
|
||||||
|
*this = src;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::~Fixed( void ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int and float constructors
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed(int integer) {
|
||||||
|
if (integer < Fixed::_min || integer > Fixed::_max)
|
||||||
|
std::cout << "error: integer out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = integer << Fixed::_frac;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(float const floater) {
|
||||||
|
if (floater < Fixed::_min || floater > Fixed::_max)
|
||||||
|
std::cout << "error: float out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = roundf(floater * (1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assignement operator
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed & Fixed::operator=( Fixed const & rhs ) {
|
||||||
|
if ( this != &rhs )
|
||||||
|
this->_value = rhs.getRawBits();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* operators < ; > ; <= ; == ; != ; + ; - ; * ; / ; ++ ; --
|
||||||
|
* ref : https://en.cppreference.com/w/cpp/language/operators
|
||||||
|
* for division, if you want to avoid floats (legitimate) :
|
||||||
|
* https://stackoverflow.com/questions/8506317/fixed-point-unsigned-division-in-c
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Fixed::operator< (Fixed const & rhs) const {
|
||||||
|
return this->_value < rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator> (Fixed const & rhs) const {
|
||||||
|
return rhs < *this;
|
||||||
|
}
|
||||||
|
bool Fixed::operator<=(Fixed const & rhs) const {
|
||||||
|
return !(*this > rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator>=(Fixed const & rhs) const {
|
||||||
|
return !(*this < rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator==(Fixed const & rhs) const {
|
||||||
|
return this->_value == rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator!=(Fixed const & rhs) const {
|
||||||
|
return !(*this == rhs);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator+ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value += rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator- ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value -= rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator* ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value = ((long)result._value * (long)rhs._value) >> Fixed::_frac;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator/ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
if (rhs._value == 0)
|
||||||
|
std::cout << "!impossible division by 0¡";
|
||||||
|
else
|
||||||
|
result._value = (long)(result._value << Fixed::_frac) / rhs._value;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator++() {
|
||||||
|
this->_value++;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator--() {
|
||||||
|
this->_value--;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator++( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator++();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator--( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator--();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns min and max
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed const & Fixed::min(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed const & Fixed::max(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::min(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::max(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions that returns _value
|
||||||
|
*/
|
||||||
|
|
||||||
|
int Fixed::getRawBits( void ) const {
|
||||||
|
return this->_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fixed::setRawBits( int const raw ) {
|
||||||
|
this->_value = raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Fixed::toInt( void ) const {
|
||||||
|
return (this->_value >> Fixed::_frac);
|
||||||
|
}
|
||||||
|
float Fixed::toFloat( void ) const {
|
||||||
|
return ((float)this->_value / (float)(1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* overload "<<" -> output fixed point in float representation
|
||||||
|
* found here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs)
|
||||||
|
{
|
||||||
|
o << rhs.toFloat();
|
||||||
|
return (o);
|
||||||
|
}
|
||||||
225
d07/ex01/Fixed.cpp
Normal file
225
d07/ex01/Fixed.cpp
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions to print numbers in binary
|
||||||
|
* for the float, found help from stackoverflow :
|
||||||
|
* https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::string printBitsInt(int num)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((num & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string printBitsFloat(float num)
|
||||||
|
{
|
||||||
|
int *p = (int *)#
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((*p & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* statics variables initialisation
|
||||||
|
*
|
||||||
|
* for MAX integer :
|
||||||
|
* 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1))
|
||||||
|
* <= ... >=
|
||||||
|
* 11111111 10000000 00000000 00000000 (-8388608)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int const Fixed::_frac = 8;
|
||||||
|
int const Fixed::_max = -1U >> (_frac +1);
|
||||||
|
int const Fixed::_min = ~_max;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default constructor / copy constructor / destructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed() : _value(0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(Fixed const & src) {
|
||||||
|
*this = src;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::~Fixed( void ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int and float constructors
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed(int integer) {
|
||||||
|
if (integer < Fixed::_min || integer > Fixed::_max)
|
||||||
|
std::cout << "error: integer out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = integer << Fixed::_frac;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(float const floater) {
|
||||||
|
if (floater < Fixed::_min || floater > Fixed::_max)
|
||||||
|
std::cout << "error: float out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = roundf(floater * (1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assignement operator
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed & Fixed::operator=( Fixed const & rhs ) {
|
||||||
|
if ( this != &rhs )
|
||||||
|
this->_value = rhs.getRawBits();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* operators < ; > ; <= ; == ; != ; + ; - ; * ; / ; ++ ; --
|
||||||
|
* ref : https://en.cppreference.com/w/cpp/language/operators
|
||||||
|
* for division, if you want to avoid floats (legitimate) :
|
||||||
|
* https://stackoverflow.com/questions/8506317/fixed-point-unsigned-division-in-c
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Fixed::operator< (Fixed const & rhs) const {
|
||||||
|
return this->_value < rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator> (Fixed const & rhs) const {
|
||||||
|
return rhs < *this;
|
||||||
|
}
|
||||||
|
bool Fixed::operator<=(Fixed const & rhs) const {
|
||||||
|
return !(*this > rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator>=(Fixed const & rhs) const {
|
||||||
|
return !(*this < rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator==(Fixed const & rhs) const {
|
||||||
|
return this->_value == rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator!=(Fixed const & rhs) const {
|
||||||
|
return !(*this == rhs);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator+ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value += rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator- ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value -= rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator* ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value = ((long)result._value * (long)rhs._value) >> Fixed::_frac;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator/ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
if (rhs._value == 0)
|
||||||
|
std::cout << "!impossible division by 0¡";
|
||||||
|
else
|
||||||
|
result._value = (long)(result._value << Fixed::_frac) / rhs._value;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator++() {
|
||||||
|
this->_value++;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator--() {
|
||||||
|
this->_value--;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator++( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator++();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator--( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator--();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns min and max
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed const & Fixed::min(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed const & Fixed::max(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::min(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::max(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions that returns _value
|
||||||
|
*/
|
||||||
|
|
||||||
|
int Fixed::getRawBits( void ) const {
|
||||||
|
return this->_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fixed::setRawBits( int const raw ) {
|
||||||
|
this->_value = raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Fixed::toInt( void ) const {
|
||||||
|
return (this->_value >> Fixed::_frac);
|
||||||
|
}
|
||||||
|
float Fixed::toFloat( void ) const {
|
||||||
|
return ((float)this->_value / (float)(1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* overload "<<" -> output fixed point in float representation
|
||||||
|
* found here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs)
|
||||||
|
{
|
||||||
|
o << rhs.toFloat();
|
||||||
|
return (o);
|
||||||
|
}
|
||||||
@@ -29,14 +29,17 @@ LIBS =
|
|||||||
INCLUDES = -I$(D_HEADERS)
|
INCLUDES = -I$(D_HEADERS)
|
||||||
|
|
||||||
D_SRCS = .
|
D_SRCS = .
|
||||||
SRCS = main.cpp
|
SRCS = main.cpp \
|
||||||
|
Fixed.cpp
|
||||||
|
|
||||||
D_HEADERS = headers
|
D_HEADERS = headers
|
||||||
HEADERS = colors.h \
|
HEADERS = colors.h \
|
||||||
Iter.hpp \
|
Iter.hpp \
|
||||||
Print.hpp \
|
Print.hpp \
|
||||||
ToUpper.hpp \
|
ToUpper.hpp \
|
||||||
Decrement.hpp
|
Decrement.hpp \
|
||||||
|
ClassTest.hpp \
|
||||||
|
Fixed.hpp
|
||||||
|
|
||||||
D_OBJS = builds
|
D_OBJS = builds
|
||||||
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
||||||
|
|||||||
20
d07/ex01/headers/ClassTest.hpp
Normal file
20
d07/ex01/headers/ClassTest.hpp
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef CLASSTEST_HPP
|
||||||
|
# define CLASSTEST_HPP
|
||||||
|
|
||||||
|
# include <iostream>
|
||||||
|
|
||||||
|
class ClassTest {
|
||||||
|
public:
|
||||||
|
ClassTest() : _value("hello") {}
|
||||||
|
std::string getValue() const {return _value;}
|
||||||
|
private:
|
||||||
|
std::string _value;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, ClassTest const & rhs) {
|
||||||
|
o << rhs.getValue();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
55
d07/ex01/headers/Fixed.hpp
Normal file
55
d07/ex01/headers/Fixed.hpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef FIXED_HPP
|
||||||
|
# define FIXED_HPP
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class Fixed {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Fixed(void); // default/parametric constructor
|
||||||
|
Fixed(Fixed const & src); // copy constructor
|
||||||
|
~Fixed(void); // destructor
|
||||||
|
Fixed(int integer);
|
||||||
|
Fixed(float const floater);
|
||||||
|
|
||||||
|
Fixed & operator= (Fixed const & rhs); // assignement operator
|
||||||
|
bool operator< (Fixed const & rhs) const;
|
||||||
|
bool operator> (Fixed const & rhs) const;
|
||||||
|
bool operator<=(Fixed const & rhs) const;
|
||||||
|
bool operator>=(Fixed const & rhs) const;
|
||||||
|
bool operator==(Fixed const & rhs) const;
|
||||||
|
bool operator!=(Fixed const & rhs) const;
|
||||||
|
Fixed operator+ (Fixed const & rhs) const;
|
||||||
|
Fixed operator- (Fixed const & rhs) const;
|
||||||
|
Fixed operator* (Fixed const & rhs) const;
|
||||||
|
Fixed operator/ (Fixed const & rhs) const;
|
||||||
|
Fixed & operator++(void); // prefix ++o
|
||||||
|
Fixed & operator--(void); // prefix --o
|
||||||
|
Fixed operator++(int); // postfix o++
|
||||||
|
Fixed operator--(int); // postfix o--
|
||||||
|
|
||||||
|
static const Fixed & min(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static const Fixed & max(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static Fixed & min(Fixed & lhs, Fixed & rhs);
|
||||||
|
static Fixed & max(Fixed & lhs, Fixed & rhs);
|
||||||
|
|
||||||
|
int getRawBits(void) const;
|
||||||
|
void setRawBits(int const raw);
|
||||||
|
float toFloat(void) const;
|
||||||
|
int toInt(void) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int _value;
|
||||||
|
static int const _frac;
|
||||||
|
static int const _max;
|
||||||
|
static int const _min;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs);
|
||||||
|
|
||||||
|
#endif
|
||||||
BIN
d07/ex01/iter
Executable file
BIN
d07/ex01/iter
Executable file
Binary file not shown.
@@ -5,8 +5,10 @@
|
|||||||
#include "Print.hpp"
|
#include "Print.hpp"
|
||||||
#include "ToUpper.hpp"
|
#include "ToUpper.hpp"
|
||||||
#include "Decrement.hpp"
|
#include "Decrement.hpp"
|
||||||
|
#include "ClassTest.hpp"
|
||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
#define N_TEST "2"
|
#define N_TEST "4"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -38,6 +40,22 @@ int main() {
|
|||||||
::Iter(arr, len, Print<int>);
|
::Iter(arr, len, Print<int>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests class :" RESET "\n";
|
||||||
|
{
|
||||||
|
ClassTest tab[5];
|
||||||
|
|
||||||
|
::Iter(tab, 5, Print<ClassTest>);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests fixed :" RESET "\n";
|
||||||
|
{
|
||||||
|
Fixed f[5];
|
||||||
|
|
||||||
|
::Iter(f, 5, Print<Fixed>);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
225
d07/ex02/Fixed.cpp
Normal file
225
d07/ex02/Fixed.cpp
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions to print numbers in binary
|
||||||
|
* for the float, found help from stackoverflow :
|
||||||
|
* https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::string printBitsInt(int num)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((num & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string printBitsFloat(float num)
|
||||||
|
{
|
||||||
|
int *p = (int *)#
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1)
|
||||||
|
{
|
||||||
|
std::cout << ((*p & mask) != 0);
|
||||||
|
i++;
|
||||||
|
if (i == 1 || i == 9 || i == 24)
|
||||||
|
std::cout << ' ';
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* statics variables initialisation
|
||||||
|
*
|
||||||
|
* for MAX integer :
|
||||||
|
* 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1))
|
||||||
|
* <= ... >=
|
||||||
|
* 11111111 10000000 00000000 00000000 (-8388608)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int const Fixed::_frac = 8;
|
||||||
|
int const Fixed::_max = -1U >> (_frac +1);
|
||||||
|
int const Fixed::_min = ~_max;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default constructor / copy constructor / destructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed() : _value(0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(Fixed const & src) {
|
||||||
|
*this = src;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::~Fixed( void ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int and float constructors
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed::Fixed(int integer) {
|
||||||
|
if (integer < Fixed::_min || integer > Fixed::_max)
|
||||||
|
std::cout << "error: integer out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = integer << Fixed::_frac;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fixed::Fixed(float const floater) {
|
||||||
|
if (floater < Fixed::_min || floater > Fixed::_max)
|
||||||
|
std::cout << "error: float out of range" << '\n';
|
||||||
|
else
|
||||||
|
this->_value = roundf(floater * (1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assignement operator
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed & Fixed::operator=( Fixed const & rhs ) {
|
||||||
|
if ( this != &rhs )
|
||||||
|
this->_value = rhs.getRawBits();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* operators < ; > ; <= ; == ; != ; + ; - ; * ; / ; ++ ; --
|
||||||
|
* ref : https://en.cppreference.com/w/cpp/language/operators
|
||||||
|
* for division, if you want to avoid floats (legitimate) :
|
||||||
|
* https://stackoverflow.com/questions/8506317/fixed-point-unsigned-division-in-c
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Fixed::operator< (Fixed const & rhs) const {
|
||||||
|
return this->_value < rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator> (Fixed const & rhs) const {
|
||||||
|
return rhs < *this;
|
||||||
|
}
|
||||||
|
bool Fixed::operator<=(Fixed const & rhs) const {
|
||||||
|
return !(*this > rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator>=(Fixed const & rhs) const {
|
||||||
|
return !(*this < rhs);
|
||||||
|
}
|
||||||
|
bool Fixed::operator==(Fixed const & rhs) const {
|
||||||
|
return this->_value == rhs._value;
|
||||||
|
}
|
||||||
|
bool Fixed::operator!=(Fixed const & rhs) const {
|
||||||
|
return !(*this == rhs);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator+ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value += rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator- ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value -= rhs._value;
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator* ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
result._value = ((long)result._value * (long)rhs._value) >> Fixed::_frac;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator/ ( Fixed const & rhs ) const {
|
||||||
|
Fixed result(*this);
|
||||||
|
if (rhs._value == 0)
|
||||||
|
std::cout << "!impossible division by 0¡";
|
||||||
|
else
|
||||||
|
result._value = (long)(result._value << Fixed::_frac) / rhs._value;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator++() {
|
||||||
|
this->_value++;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::operator--() {
|
||||||
|
this->_value--;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator++( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator++();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
Fixed Fixed::operator--( int ) {
|
||||||
|
Fixed old = *this;
|
||||||
|
Fixed::operator--();
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns min and max
|
||||||
|
*/
|
||||||
|
|
||||||
|
Fixed const & Fixed::min(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed const & Fixed::max(Fixed const & lhs, Fixed const & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::min(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs < rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
Fixed & Fixed::max(Fixed & lhs, Fixed & rhs) {
|
||||||
|
if (lhs > rhs)
|
||||||
|
return lhs;
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* functions that returns _value
|
||||||
|
*/
|
||||||
|
|
||||||
|
int Fixed::getRawBits( void ) const {
|
||||||
|
return this->_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fixed::setRawBits( int const raw ) {
|
||||||
|
this->_value = raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Fixed::toInt( void ) const {
|
||||||
|
return (this->_value >> Fixed::_frac);
|
||||||
|
}
|
||||||
|
float Fixed::toFloat( void ) const {
|
||||||
|
return ((float)this->_value / (float)(1 << Fixed::_frac));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* overload "<<" -> output fixed point in float representation
|
||||||
|
* found here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs)
|
||||||
|
{
|
||||||
|
o << rhs.toFloat();
|
||||||
|
return (o);
|
||||||
|
}
|
||||||
@@ -29,14 +29,16 @@ LIBS =
|
|||||||
INCLUDES = -I$(D_HEADERS)
|
INCLUDES = -I$(D_HEADERS)
|
||||||
|
|
||||||
D_SRCS = .
|
D_SRCS = .
|
||||||
SRCS = main.cpp
|
SRCS = main.cpp \
|
||||||
|
Fixed.cpp
|
||||||
|
|
||||||
D_HEADERS = headers
|
D_HEADERS = headers
|
||||||
HEADERS = colors.h \
|
HEADERS = colors.h \
|
||||||
Array.hpp \
|
Array.hpp \
|
||||||
Iter.hpp \
|
Iter.hpp \
|
||||||
Print.hpp \
|
Print.hpp \
|
||||||
Fill.hpp
|
Fill.hpp \
|
||||||
|
Fixed.hpp
|
||||||
|
|
||||||
D_OBJS = builds
|
D_OBJS = builds
|
||||||
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)
|
||||||
|
|||||||
BIN
d07/ex02/array
Executable file
BIN
d07/ex02/array
Executable file
Binary file not shown.
@@ -6,11 +6,22 @@
|
|||||||
template < typename T >
|
template < typename T >
|
||||||
class Array {
|
class Array {
|
||||||
public:
|
public:
|
||||||
Array(unsigned int n = 0u)
|
Array(unsigned int n = 0U)
|
||||||
: _size(n)
|
: _size(n)
|
||||||
, _arr(new T[n]) {};
|
, _arr(new T[n]){
|
||||||
~Array() { delete [] _arr; };
|
for (unsigned int i = 0; i < n; i++)
|
||||||
Array(Array const & src) : _arr(new T[0]) { *this = src; };
|
_arr[i] = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
~Array() {
|
||||||
|
delete [] _arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
Array(Array const & src)
|
||||||
|
: _arr(new T[0]) {
|
||||||
|
*this = src;
|
||||||
|
};
|
||||||
|
|
||||||
Array &operator=(Array const & rhs) {
|
Array &operator=(Array const & rhs) {
|
||||||
if (this == &rhs)
|
if (this == &rhs)
|
||||||
return (*this);
|
return (*this);
|
||||||
|
|||||||
55
d07/ex02/headers/Fixed.hpp
Normal file
55
d07/ex02/headers/Fixed.hpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef FIXED_HPP
|
||||||
|
# define FIXED_HPP
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class Fixed {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Fixed(void); // default/parametric constructor
|
||||||
|
Fixed(Fixed const & src); // copy constructor
|
||||||
|
~Fixed(void); // destructor
|
||||||
|
Fixed(int integer);
|
||||||
|
Fixed(float const floater);
|
||||||
|
|
||||||
|
Fixed & operator= (Fixed const & rhs); // assignement operator
|
||||||
|
bool operator< (Fixed const & rhs) const;
|
||||||
|
bool operator> (Fixed const & rhs) const;
|
||||||
|
bool operator<=(Fixed const & rhs) const;
|
||||||
|
bool operator>=(Fixed const & rhs) const;
|
||||||
|
bool operator==(Fixed const & rhs) const;
|
||||||
|
bool operator!=(Fixed const & rhs) const;
|
||||||
|
Fixed operator+ (Fixed const & rhs) const;
|
||||||
|
Fixed operator- (Fixed const & rhs) const;
|
||||||
|
Fixed operator* (Fixed const & rhs) const;
|
||||||
|
Fixed operator/ (Fixed const & rhs) const;
|
||||||
|
Fixed & operator++(void); // prefix ++o
|
||||||
|
Fixed & operator--(void); // prefix --o
|
||||||
|
Fixed operator++(int); // postfix o++
|
||||||
|
Fixed operator--(int); // postfix o--
|
||||||
|
|
||||||
|
static const Fixed & min(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static const Fixed & max(Fixed const & lhs, Fixed const & rhs);
|
||||||
|
static Fixed & min(Fixed & lhs, Fixed & rhs);
|
||||||
|
static Fixed & max(Fixed & lhs, Fixed & rhs);
|
||||||
|
|
||||||
|
int getRawBits(void) const;
|
||||||
|
void setRawBits(int const raw);
|
||||||
|
float toFloat(void) const;
|
||||||
|
int toInt(void) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int _value;
|
||||||
|
static int const _frac;
|
||||||
|
static int const _max;
|
||||||
|
static int const _min;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & o, Fixed const & rhs);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -7,8 +7,9 @@
|
|||||||
#include "Print.hpp"
|
#include "Print.hpp"
|
||||||
#include "Array.hpp"
|
#include "Array.hpp"
|
||||||
#include "Fill.hpp"
|
#include "Fill.hpp"
|
||||||
|
#include "Fixed.hpp"
|
||||||
|
|
||||||
#define N_TEST "7"
|
#define N_TEST "13"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
@@ -91,15 +92,134 @@ int main() {
|
|||||||
std::cout << "\n";
|
std::cout << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// tests luke
|
|
||||||
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
<< "tests :" RESET "\n";
|
<< "tests simple array :" RESET "\n";
|
||||||
{
|
{
|
||||||
Array<int> a(10);
|
Array<int> a(10);
|
||||||
|
|
||||||
std::cout << "a.size :" << a.size() << "\n";
|
std::cout << "a.size :" << a.size() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests empty array :" RESET "\n";
|
||||||
|
{
|
||||||
|
Array<int> arr(0);
|
||||||
|
|
||||||
|
std::cout << "arr.size :" << arr.size() << "\n";
|
||||||
|
try {
|
||||||
|
arr[arr.size()] = 42; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests write and read :" RESET "\n";
|
||||||
|
{
|
||||||
|
std::cout << B_BLUE "create Array<int> arr(5);" RESET "\n";
|
||||||
|
Array<int> arr(5);
|
||||||
|
std::cout << B_BLUE "create Array<int> const constarr(5);" RESET "\n";
|
||||||
|
Array<int> const constarr(5);
|
||||||
|
|
||||||
|
std::cout << "arr.size :" << arr.size() << "\n";
|
||||||
|
std::cout << "constarr.size :" << constarr.size() << "\n";
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "arr[3] = 12" RESET "\n";
|
||||||
|
arr[3] = 12;
|
||||||
|
std::cout << B_BLUE "print arr;" RESET "\n";
|
||||||
|
::Iter(arr, arr.size(), Print<int>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "print constarr;" RESET "\n";
|
||||||
|
::Iter(constarr, constarr.size(), Print<int>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests empty Fixed array :" RESET "\n";
|
||||||
|
{
|
||||||
|
Array<Fixed> arr(0);
|
||||||
|
|
||||||
|
std::cout << "fixed arr.size :" << arr.size() << "\n";
|
||||||
|
try {
|
||||||
|
arr[arr.size()] = 42; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests fixed write and read :" RESET "\n";
|
||||||
|
{
|
||||||
|
std::cout << B_BLUE "create Array<Fixed> arr(5);" RESET "\n";
|
||||||
|
Array<Fixed> arr(5);
|
||||||
|
std::cout << B_BLUE "create Array<Fixed> const constarr(5);" RESET "\n";
|
||||||
|
Array<Fixed> const constarr(5);
|
||||||
|
|
||||||
|
std::cout << "arr.size :" << arr.size() << "\n";
|
||||||
|
std::cout << "constarr.size :" << constarr.size() << "\n";
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "arr[3] = 12" RESET "\n";
|
||||||
|
arr[3] = 12;
|
||||||
|
std::cout << B_BLUE "print arr;" RESET "\n";
|
||||||
|
::Iter(arr, arr.size(), Print<Fixed>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "print constarr;" RESET "\n";
|
||||||
|
::Iter(constarr, constarr.size(), Print<Fixed>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests empty Fixed array :" RESET "\n";
|
||||||
|
{
|
||||||
|
Array<char> arr(0);
|
||||||
|
|
||||||
|
std::cout << "char arr.size :" << arr.size() << "\n";
|
||||||
|
try {
|
||||||
|
arr[arr.size()] = 'c'; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
|
<< "tests char write and read :" RESET "\n";
|
||||||
|
{
|
||||||
|
std::cout << B_BLUE "create Array<char> arr(5);" RESET "\n";
|
||||||
|
Array<char> arr(5);
|
||||||
|
std::cout << B_BLUE "create Array<char> const constarr(5);" RESET "\n";
|
||||||
|
Array<char> const constarr(5);
|
||||||
|
|
||||||
|
std::cout << "arr.size :" << arr.size() << "\n";
|
||||||
|
std::cout << "constarr.size :" << constarr.size() << "\n";
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "arr[3] = 12" RESET "\n";
|
||||||
|
arr[3] = 12;
|
||||||
|
std::cout << B_BLUE "print arr;" RESET "\n";
|
||||||
|
::Iter(arr, arr.size(), Print<char>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << B_BLUE "print constarr;" RESET "\n";
|
||||||
|
::Iter(constarr, constarr.size(), Print<char>);
|
||||||
|
std::cout << "\n"; }
|
||||||
|
catch(std::exception& e) {
|
||||||
|
std::cerr << e.what() << '\n'; }
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
<< "tests index correct :" RESET "\n";
|
<< "tests index correct :" RESET "\n";
|
||||||
{
|
{
|
||||||
@@ -141,7 +261,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
|
||||||
<< "tests :" RESET "\n";
|
<< "tests subject :" RESET "\n";
|
||||||
{
|
{
|
||||||
#define MAX_VAL 750
|
#define MAX_VAL 750
|
||||||
Array<int> numbers(MAX_VAL);
|
Array<int> numbers(MAX_VAL);
|
||||||
|
|||||||
Reference in New Issue
Block a user