From c712e483573f662d484d9fe110769d03d1b96ab2 Mon Sep 17 00:00:00 2001 From: nemeth_mihaly Date: Fri, 16 Dec 2022 11:16:56 +0100 Subject: [PATCH] added copy ctor & copy assign to Vector --- Build.bat | 2 +- src/Core/Containers/Vector.hpp | 112 ++++++++++++++++++++++++++------- src/Core/ScalarDataTypes.hpp | 4 +- src/Main.cpp | 22 ++++++- target/Kraken-Core.exe | Bin 127668 -> 131194 bytes 5 files changed, 112 insertions(+), 28 deletions(-) diff --git a/Build.bat b/Build.bat index 0359a35..beb97e4 100644 --- a/Build.bat +++ b/Build.bat @@ -6,7 +6,7 @@ SET target_name=Kraken-Core.exe SET target_dir=target\ SET compiler=g++ -SET compiler_flags=-ggdb -Wall -Wextra +SET compiler_flags=-ggdb -Wall -Wextra -O3 SET linker_flags=-L. diff --git a/src/Core/Containers/Vector.hpp b/src/Core/Containers/Vector.hpp index 664d6ff..dbbd095 100644 --- a/src/Core/Containers/Vector.hpp +++ b/src/Core/Containers/Vector.hpp @@ -4,44 +4,45 @@ class OutOfRange {}; -// @todo: implementing copy ctor & copy assignment template class Vector { public: Vector(); + Vector(const Vector& other); + ~Vector(); + Vector& operator= (const Vector& other); + /** * Element access - */ + */ Type& operator[] (i32 index); const Type& operator[] (i32 index) const; - Type* data() { return M_data; } - const Type* data() const { return M_data; } + Type* data(); + const Type* data() const; /** * Capacity */ - bool is_empty() const { return (M_length == 0); } - i32 length() const { return M_length; } - - void reserve(i32 new_capacity); - - i32 capacity() const { return M_capacity; } + bool is_empty() const; + i32 length() const; + void reserve(i32 new_capacity); + i32 capacity() const; /** * Modifiers */ - void clear(); + void clear(); - void insert(const Type& value, i32 index); - void erase(i32 index); + void insert(const Type& value, i32 index); + void erase(i32 index); - void push(const Type& value); - void pop(); + void push(const Type& value); + void pop(); - void resize(i32 new_capacity); + void resize(i32 new_capacity); private: Type* M_data; @@ -52,7 +53,7 @@ class Vector { template inline Vector::Vector() { - i32 initial_capacity = 8; + const i32 initial_capacity = 8; M_data = new Type[initial_capacity]; M_capacity = initial_capacity; @@ -60,9 +61,18 @@ inline Vector::Vector() { } +template +inline Vector::Vector(const Vector& other) { + M_data = nullptr; + *this = other; +} + + template inline Vector::~Vector() { - delete[] M_data; + if(M_data) { + delete[] M_data; + } M_data = nullptr; M_capacity = 0; @@ -70,6 +80,24 @@ inline Vector::~Vector() { } +template +inline Vector& Vector::operator= (const Vector& other) { + clear(); + + const i32 new_capacity = other.M_capacity; + + M_data = new Type[new_capacity]; + M_capacity = new_capacity; + M_length = other.M_length; + + for(i32 i = 0; i < other.M_length; i += 1) { + M_data[i] = other.M_data[i]; + } + + return *this; +} + + template inline Type& Vector::operator[] (i32 index) { if(index < 0 || index > M_length) { @@ -87,7 +115,35 @@ inline const Type& Vector::operator[] (i32 index) const { } return M_data[index]; -} +} + + +template +inline Type* Vector::data() { + return M_data; +} + + +template +inline const Type* Vector::data() const { + return M_data; +} + + +template +inline bool Vector::is_empty() const { + if(M_length > 0) { + return false; + } + + return true; +} + + +template +inline i32 Vector::length() const { + return M_length; +} template @@ -104,15 +160,25 @@ inline void Vector::reserve(i32 new_capacity) { new_data[i] = M_data[i]; } - delete[] M_data; + if(M_data) { + delete[] M_data; + } M_data = new_data; } +template +inline i32 Vector::capacity() const { + return M_capacity; +} + + template inline void Vector::clear() { - delete[] M_data; + if(M_data) { + delete[] M_data; + } i32 initial_capacity = 8; @@ -185,7 +251,9 @@ inline void Vector::resize(i32 new_capacity) { new_data[i] = M_data[i]; } - delete[] M_data; + if(M_data) { + delete[] M_data; + } M_data = new_data; } diff --git a/src/Core/ScalarDataTypes.hpp b/src/Core/ScalarDataTypes.hpp index 5bc9edc..646ccd5 100644 --- a/src/Core/ScalarDataTypes.hpp +++ b/src/Core/ScalarDataTypes.hpp @@ -2,7 +2,7 @@ /** * Integer Types - * **/ + */ typedef signed char i8; typedef signed short i16; typedef signed int i32; @@ -19,6 +19,6 @@ typedef u64 usize; /** * Floating-Point Types - * **/ + */ typedef float f32; typedef double f64; \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 44cff64..78732b3 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -18,9 +18,8 @@ class Timer { M_stop_time = high_resolution_clock::now(); } - std::chrono::nanoseconds duration() { - auto d = duration_cast(M_stop_time - M_start_time); - return d; + std::chrono::microseconds duration() const { + return duration_cast(M_stop_time - M_start_time);; } private: @@ -31,11 +30,28 @@ void print_vector(const Vector& v) { for(i32 i = 0; i < v.length(); i += 1) { std::cout << v[i] << ' '; } + std::cout << std::endl; } i32 main() { { Vector v; + + v.push(1); + v.push(2); + v.push(3); + + Vector w; + + w.push(100); + w.push(99); + + print_vector(w); + + w = v; + + print_vector(v); + print_vector(w); } } \ No newline at end of file diff --git a/target/Kraken-Core.exe b/target/Kraken-Core.exe index 0441bfc1be496e84e8d905c5c3e098bf140d640f..f06d6f87a723d2ecf16e4a865fb6bfc0a85e1830 100644 GIT binary patch delta 19456 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 E4|ESlUH||9 delta 16978 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