added Vector container

This commit is contained in:
nemeth_mihaly 2022-12-16 02:16:20 +01:00
parent 5df2481fee
commit 6b4a4441ba
8 changed files with 243 additions and 9 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
target\

View File

@ -1,9 +1,9 @@
@ECHO OFF @ECHO OFF
SETLOCAL EnableDelayedExpansion SETLOCAL EnableDelayedExpansion
SET target_name=Test.exe SET target_name=Kraken-Core.exe
SET target_dir=Target\ SET target_dir=target\
SET compiler=g++ SET compiler=g++
SET compiler_flags=-ggdb -Wall -Wextra SET compiler_flags=-ggdb -Wall -Wextra

View File

@ -1,9 +1,9 @@
@ECHO OFF @ECHO OFF
SETLOCAL EnableDelayedExpansion SETLOCAL EnableDelayedExpansion
SET target_name=Test.exe SET target_name=Kraken-Core.exe
SET target_dir=Target\ SET target_dir=target\
CALL Build.bat CALL Build.bat

View File

@ -1,5 +0,0 @@
#include <Source/Core/ScalarDataTypes.hpp>
i32 main() {
}

View File

@ -0,0 +1,197 @@
#pragma once
#include <src/Core/ScalarDataTypes.hpp>
class OutOfRange {};
// @todo: implementing copy ctor & copy assignment
template<class Type>
class Vector {
public:
Vector();
~Vector();
/**
* Element access
*/
Type& operator[] (i32 index);
const Type& operator[] (i32 index) const;
Type* data() { return M_data; }
const Type* data() const { return M_data; }
/**
* 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; }
/**
* Modifiers
*/
void clear();
void insert(const Type& value, i32 index);
void erase(i32 index);
void push(const Type& value);
void pop();
void resize(i32 new_capacity);
private:
Type* M_data;
i32 M_capacity;
i32 M_length;
};
template<class Type>
inline Vector<Type>::Vector() {
i32 initial_capacity = 8;
M_data = new Type[initial_capacity];
M_capacity = initial_capacity;
M_length = 0;
}
template<class Type>
inline Vector<Type>::~Vector() {
delete[] M_data;
M_data = nullptr;
M_capacity = 0;
M_length = 0;
}
template<class Type>
inline Type& Vector<Type>::operator[] (i32 index) {
if(index < 0 || index > M_length) {
throw OutOfRange();
}
return M_data[index];
}
template<class Type>
inline const Type& Vector<Type>::operator[] (i32 index) const {
if(index < 0 || index > M_length) {
throw OutOfRange();
}
return M_data[index];
}
template<class Type>
inline void Vector<Type>::reserve(i32 new_capacity) {
if(new_capacity < M_capacity) {
return;
}
M_capacity = new_capacity;
Type* new_data = new Type[new_capacity];
for(i32 i = 0; i < M_length; i += 1) {
new_data[i] = M_data[i];
}
delete[] M_data;
M_data = new_data;
}
template<class Type>
inline void Vector<Type>::clear() {
delete[] M_data;
i32 initial_capacity = 8;
M_data = new Type[initial_capacity];
M_capacity = initial_capacity;
M_length = 0;
}
template<class Type>
inline void Vector<Type>::insert(const Type& value, i32 index) {
if(index < 0 || index > M_length) {
return;
}
if(M_length + 1 > M_capacity) {
resize(M_capacity *= 2);
}
for(i32 i = M_length; i > index; i -= 1) {
M_data[i] = M_data[i - 1];
}
M_length += 1;
M_data[index] = value;
}
template<class Type>
inline void Vector<Type>::erase(i32 index) {
if(index < 0 || index > M_length) {
return;
}
M_length -= 1;
for(i32 i = index; i < M_length; i += 1) {
M_data[i] = M_data[i + 1];
}
}
template<class Type>
inline void Vector<Type>::push(const Type& value) {
if(M_length + 1 > M_capacity) {
resize(M_capacity *= 2);
}
M_data[M_length] = value;
M_length += 1;
}
template<class Type>
inline void Vector<Type>::resize(i32 new_capacity) {
if(new_capacity < 0) {
return;
}
M_capacity = new_capacity;
Type* new_data = new Type[new_capacity];
if(new_capacity < M_length) {
M_length = new_capacity;
}
for(i32 i = 0; i < M_length; i += 1) {
new_data[i] = M_data[i];
}
delete[] M_data;
M_data = new_data;
}
template<class Type>
inline void Vector<Type>::pop() {
--M_length;
}

41
src/Main.cpp Normal file
View File

@ -0,0 +1,41 @@
#include <iostream>
#include <chrono>
using namespace std::chrono;
#define KRAKEN_DEBUG 1
#include <src/Core/ScalarDataTypes.hpp>
#include <src/Core/Containers/Vector.hpp>
class Timer {
public:
void start() {
M_start_time = high_resolution_clock::now();;
}
void stop() {
M_stop_time = high_resolution_clock::now();
}
std::chrono::nanoseconds duration() {
auto d = duration_cast<microseconds>(M_stop_time - M_start_time);
return d;
}
private:
std::chrono::_V2::system_clock::time_point M_start_time, M_stop_time;
};
void print_vector(const Vector<i32>& v) {
for(i32 i = 0; i < v.length(); i += 1) {
std::cout << v[i] << ' ';
}
std::cout << std::endl;
}
i32 main() {
{
Vector<i32> v;
}
}

BIN
target/Kraken-Core.exe Normal file

Binary file not shown.