From 85293d8c32e5a440ea8a9f7ca6138632ea36f98f Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Tue, 31 May 2022 14:46:59 +0300 Subject: [PATCH] trying to deal with c++ --- .idea/inspectionProfiles/Project_Default.xml | 2 +- src/Autoarr/Autoarr2.cpp | 50 ++++++++++++++------ src/Autoarr/Autoarr2.hpp | 10 ++-- src/base/base.h | 4 ++ src/base/errors.cpp | 9 ++++ src/base/errors.hpp | 8 ++++ 6 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 src/base/errors.cpp create mode 100644 src/base/errors.hpp diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 154ddf7..01f1588 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -12,7 +12,7 @@ - + diff --git a/src/Autoarr/Autoarr2.cpp b/src/Autoarr/Autoarr2.cpp index edc431e..acbf1be 100644 --- a/src/Autoarr/Autoarr2.cpp +++ b/src/Autoarr/Autoarr2.cpp @@ -1,40 +1,62 @@ #include "Autoarr2.hpp" +// +// +// -// -// -// +#define MAX_BLOCK_LENGTH_DEFAULT 64 +#define ALLOC_N_BLOCKS 1 template Autoarr2::Autoarr2() { - + values=NULL; + block_length=0; + blocks_count=0; + max_block_length=MAX_BLOCK_LENGTH_DEFAULT; } -template -T Autoarr2::Get(uint32 index) { - + template +Autoarr2::Autoarr2(uint16 _max_block_length) : Autoarr2() { + max_block_length=_max_block_length; } template T *Autoarr2::GetPtr(uint32 index) { + if(index>=Length) throwcpp(ERR_WRONGINDEX); + return values[index/max_block_length]+index%max_block_length; +} +template +T Autoarr2::Get(uint32 index) { + return *GetPtr(index); } template void Autoarr2::Set(uint32 index, T value) { - + *GetPtr(index)=value; } template void Autoarr2::Add(T value) { + if(!values){ + values=malloc(ALLOC_N_BLOCKS*sizeof(T*)); + goto create_block; + } + else if(block_length==max_block_length){ + block_length=0; +create_block: + values=realloc((blocks_count+ALLOC_N_BLOCKS)*sizeof(T*)); + blocks_count+=ALLOC_N_BLOCKS; + values[blocks_count]=malloc(max_block_length*sizeof(T)); + } + values[blocks_count-1][block_length]=value; + block_length++; + Length++; } template Autoarr2::~Autoarr2() { - -} - -template -uint32 Autoarr2::Length() { - + for (uint16 i=0;i class Autoarr2 { + T** values; uint16 blocks_count; uint16 block_length; - - T** values; + uint16 max_block_length; public: + uint32 Length; Autoarr2(); - uint32 Length(); - T Get(uint32 index); + explicit Autoarr2(uint16 _max_block_length); T* GetPtr(uint32 index); + T Get(uint32 index); void Set(uint32 index, T value); void Add(T value); ~Autoarr2(); diff --git a/src/base/base.h b/src/base/base.h index f9d56b8..2a962b9 100644 --- a/src/base/base.h +++ b/src/base/base.h @@ -9,6 +9,10 @@ extern "C" { #include "errors.h" #include "cptr.h" +#if __cplusplus +#include "errors.hpp" +#endif + // executes codeblock and prints execution time #ifdef CLOCK_REALTIME // non-standard high-precision clock #define optime(opname,repeats,codeblock) ({\ diff --git a/src/base/errors.cpp b/src/base/errors.cpp new file mode 100644 index 0000000..ec1e963 --- /dev/null +++ b/src/base/errors.cpp @@ -0,0 +1,9 @@ +#include "errors.hpp" + +void throwcpp(err_t eid){ + throwcpp(errname(eid)); +} + +void throwcpp(char* emsg){ + __EXIT(emsg); +} \ No newline at end of file diff --git a/src/base/errors.hpp b/src/base/errors.hpp new file mode 100644 index 0000000..93cdb3c --- /dev/null +++ b/src/base/errors.hpp @@ -0,0 +1,8 @@ +#pragma once + +#ifdef __cplusplus +#include "errors.h" + +void throwcpp(err_t eid); +void throwcpp(char* emsg); +#endif \ No newline at end of file