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