From a5e1c60073b871845f0d499258571eef8d3ef3f4 Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Tue, 3 Oct 2023 11:47:07 +0200 Subject: [PATCH] TD2 : Fixed some issues when compiling with Warning 4 level. TD3 : Boiler plate for Smart Vector --- td/td2/include/vector.h | 16 ++- td/td3/include/smart_vector.h | 13 +++ td/td3/include/vector.h | 179 ++++++++++++++++++++++++++++++++++ td/td3/src/main.cpp | 8 ++ 4 files changed, 207 insertions(+), 9 deletions(-) create mode 100644 td/td3/include/smart_vector.h create mode 100644 td/td3/include/vector.h create mode 100644 td/td3/src/main.cpp diff --git a/td/td2/include/vector.h b/td/td2/include/vector.h index e111814..5024d4e 100644 --- a/td/td2/include/vector.h +++ b/td/td2/include/vector.h @@ -144,7 +144,7 @@ std::istream& operator>>(std::istream& stream, Vector& vec) template T& Vector::operator[](const int indice) { - if(indice > _size) + if (static_cast(indice) > _size) throw "Indice from the vector is not reachable"; else return _values[indice]; @@ -153,13 +153,12 @@ T& Vector::operator[](const int indice) template Vector Vector::operator+(const Vector& other) { - if(_size != other._size) + if (_size != other._size) throw "Cannot add two vectors with different sizes together"; - else - { + else { Vector returnVector(_size); returnVector._size = _size; - for(auto i =0; i < _size; i++) + for (size_t i = 0; i < _size; i++) returnVector._values[i] = _values[i] + other._values[i]; return returnVector; } @@ -168,11 +167,10 @@ Vector Vector::operator+(const Vector& other) template Vector& Vector::operator+=(const Vector& other) { - if(_size != other._size) + if (_size != other._size) throw "Cannot add two vectors with different sizes together"; - else - { - for(auto i =0; i < _size; i++) + else { + for (size_t i = 0; i < _size; i++) _values[i] += other._values[i]; return *this; } diff --git a/td/td3/include/smart_vector.h b/td/td3/include/smart_vector.h new file mode 100644 index 0000000..3042951 --- /dev/null +++ b/td/td3/include/smart_vector.h @@ -0,0 +1,13 @@ +#ifndef HEADER_SMART_VECTOR +#define HEADER_SMART_VECTOR + +#include "vector.h" + +template +class Smart_Vector : public Vector { + public: + Smart_Vector operator+(const Smart_Vector& other); + Smart_Vector& operator+=(const Smart_Vector& other); +}; + +#endif // HEADER_SMART_VECTOR \ No newline at end of file diff --git a/td/td3/include/vector.h b/td/td3/include/vector.h new file mode 100644 index 0000000..8a68376 --- /dev/null +++ b/td/td3/include/vector.h @@ -0,0 +1,179 @@ +#ifndef HEADER_VECTOR +#define HEADER_VECTOR + +#include +#include + +template +class Vector { +public: + Vector(); + Vector(size_t capacity); + Vector(size_t capacity, T value); + Vector(const Vector& other); + ~Vector(); + size_t Size(); + size_t Capacity(); + void PushBack(T value); + template + friend std::ostream& operator<<(std::ostream& stream, const Vector& vec); + template + friend std::istream& operator>>(std::istream& stream, Vector& vec); + Vector& operator=(const Vector& other); + Vector& operator()(const Vector& other); + T& operator[](const int indice); + Vector operator+(const Vector& other); + Vector& operator+=(const Vector& other); + +protected: + size_t _capacity; + size_t _size; + T* _values; +}; + +template +Vector::Vector() + : _capacity(1) + , _size(0) + , _values(new T[1]) +{ +} + +template +Vector::Vector(size_t capacity) + : _capacity(capacity) + , _size(0) +{ + // Allocating the heap with the given capacity + _values = new T[capacity]; +} + +template +Vector::Vector(size_t capacity, T value) + : _capacity(capacity) + , _size(capacity) +{ + // Allocating the heap and setting the value to each element. + _values = new T[capacity]; + for (size_t i = 0; i < capacity; i++) + _values[i] = value; +} + +template +Vector::Vector(const Vector& other) + : _capacity(other._capacity) + , _size(other._size) + , _values(new T[other._capacity]) +{ + for (size_t i = 0; i < other._size; i++) + _values[i] = other._values[i]; +} + +template +Vector::~Vector() +{ + delete[] _values; +} + +template +Vector& Vector::operator=(const Vector& other) +{ + if (this != &other) { + this->_capacity = other._capacity; + this->_size = other._size; + delete[] this->_values; + this->_values = new T[other._capacity]; + for (size_t i = 0; i < other._size; i++) + this->_values[i] = other._values[i]; + } + return *this; +} + +template +Vector& Vector::operator()(const Vector& other) +{ + *this = other; + return *this; +} + +template +size_t Vector::Capacity() { return _capacity; } +template +size_t Vector::Size() { return _size; } + +template +void Vector::PushBack(T value) +{ + // if the next size will overload the heap + if (_capacity < _size + 1) { + // Keep a track of the old pointer + T* oldPtr = _values; + // Creating a new pointer by resizing its capacity by factor 2. + _values = new T[_size * 2]; + _capacity *= 2; + // Copying the old array onto the new + for (size_t i = 0; i < _size; i++) + _values[i] = oldPtr[i]; + // Deallocating the old array + delete[] oldPtr; + } + // Setting the given value and incrementing the size + _values[_size] = value; + _size++; +} + +// methode get +template +std::ostream& operator<<(std::ostream& stream, const Vector& vec) +{ + for (size_t i = 0; i < vec._size; i++) + stream << vec._values[i] << ", "; + return stream; +} + +// methode put +template +std::istream& operator>>(std::istream& stream, Vector& vec) +{ + for (size_t i = 0; i < vec._capacity; i++) + stream >> vec._values[i]; + vec._size = vec._capacity; + return stream; +} + +template +T& Vector::operator[](const int indice) +{ + if (static_cast(indice) > _size) + throw "Indice from the vector is not reachable"; + else + return _values[indice]; +} + +template +Vector Vector::operator+(const Vector& other) +{ + if (_size != other._size) + throw "Cannot add two vectors with different sizes together"; + else { + Vector returnVector(_size); + returnVector._size = _size; + for (size_t i = 0; i < _size; i++) + returnVector._values[i] = _values[i] + other._values[i]; + return returnVector; + } +} + +template +Vector& Vector::operator+=(const Vector& other) +{ + if (_size != other._size) + throw "Cannot add two vectors with different sizes together"; + else { + for (size_t i = 0; i < _size; i++) + _values[i] += other._values[i]; + return *this; + } +} + +#endif // HEADER_VECTOR \ No newline at end of file diff --git a/td/td3/src/main.cpp b/td/td3/src/main.cpp new file mode 100644 index 0000000..a8a6189 --- /dev/null +++ b/td/td3/src/main.cpp @@ -0,0 +1,8 @@ +#include "../include/vector.h" +#include + +int main(void) +{ + std::cout << "Hello TD3 !" << std::endl; + return 0; +} \ No newline at end of file