This commit is contained in:
Timerix22 2022-02-14 23:24:33 +03:00
parent daeb29299f
commit a25f5bd5f1
8 changed files with 97 additions and 11 deletions

View File

@ -4,7 +4,9 @@
"cstdint": "c", "cstdint": "c",
"limits": "c", "limits": "c",
"cstdio": "c", "cstdio": "c",
"cwchar": "c" "cwchar": "c",
"compare": "c",
"type_traits": "c"
}, },
"C_Cpp.default.defines": [], "C_Cpp.default.defines": [],
"C_Cpp.intelliSenseCacheSize": 10 "C_Cpp.intelliSenseCacheSize": 10

67
DtsodC/src/Autoarr/new.h Normal file
View File

@ -0,0 +1,67 @@
#define Autoarr_length(autoarr) (uint32)(autoarr->max_block_length*(autoarr->max_blocks_count-1)+autoarr->block_length)
#define Autoarr_max_length(autoarr) (uint32)(autoarr->max_block_length*autoarr->max_blocks_count)
#define define_Autoarr(type) \
typedef struct Autoarr_##type{ \
uint16 blocks_count; \
uint16 max_blocks_count; \
uint16 block_length; \
uint16 max_block_length; \
type** values; \
void (*Autoarr_add)(struct Autoarr_##type* ar, type element); \
type (*Autoarr_get)(struct Autoarr_##type* ar, uint32 index); \
void (*Autoarr_set)(struct Autoarr_##type* ar, uint32 index, type element); \
} Autoarr_##type; \
\
void Autoarr_add_##type(struct Autoarr_##type* ar, type element){ \
if(!ar->values){ \
ar->values=malloc(ar->max_blocks_count*sizeof(type*)); \
ar->values[0]=malloc(ar->max_block_length*sizeof(type)); \
goto create_block; \
} \
if(ar->block_length==ar->max_block_length){ \
if (ar->blocks_count>=ar->max_blocks_count) throw(ERR_MAXLENGTH); \
ar->block_length=0; \
create_block: \
ar->values[ar->blocks_count]=malloc(ar->max_block_length*typesize(ar->type)); \
ar->blocks_count++; \
} \
ar->values[ar->blocks_count-1][ar->block_length]=element; \
ar->block_length++; \
} \
\
type Autoarr_get_##type(struct Autoarr_##type* ar, uint32 index){ \
if(index>=Autoarr_length(ar)) throw(ERR_WRONGINDEX); \
return ar->values[index/ar->max_block_length][index%ar->max_block_length]; \
} \
\
void Autoarr_set_##type(struct Autoarr_##type* ar, uint32 index, type element){ \
if(index>=Autoarr_length(ar)) throw(ERR_WRONGINDEX); \
ar->values[index/ar->max_block_length][index%ar->max_block_length]=element; \
} \
\
Autoarr_##type Autoarr_create_##type(uint16 max_blocks_count, uint16 max_block_length){ \
return (Autoarr_##type)={ \
.max_blocks_count=max_blocks_count, \
.blocks_count=0, \
.max_block_length=max_block_length, \
.block_length=0, \
.values=NULL, \
.Autoarr_add=Autoarr_add_##type, \
.Autoarr_get=Autoarr_get_##type, \
.Autoarr_set=Autoarr_set_##type \
}; \
} \
\
void Autoarr_clear_##type(Autoarr_##type ar){ \
for(uint16 i=0; i<ar->blocks_count;i++) \
free(ar->values[i]); \
free(ar->values); \
ar->values=NULL; \
ar->blocks_count=0; \
ar->block_length=0; \
}
#define Autoarr(type) Autoarr_##type
#define Autoarr_create(type, max_blocks_count, max_block_length) \
Autoarr_create_##type(max_blocks_count, max_block_length)

View File

@ -1,26 +1,24 @@
#include "Hashtable.h" #include "Hashtable.h"
/*
Hashtable Hashtable_create(uint16 height){ Hashtable Hashtable_create(uint16 height){
Hashtable h={ Hashtable h={
.height=height, .height=height,
.rows=malloc(height*sizeof(Autoarr*)) .rows=malloc(height*sizeof(Autoarr))
}; };
return h; return h;
} }
void Hashtable_clear(Hashtable* ht){ void Hashtable_clear(Hashtable* ht){
for(uint16 i=0;i<ht->height;i++) for(uint16 i=0;i<ht->height;i++)
Autoarr_clear(ht->rows[i]); Autoarr_clear(ht->rows+i);
free(ht->rows);
} }
void Hashtable_add_kvpair(Hashtable* ht, KeyValuePair pair){ void Hashtable_add_kvpair(Hashtable* ht, KeyValuePair pair){
uint16 i=ht->height%ihash(pair.key); uint16 i=ht->height%ihash(pair.key);
if(!ht->rows[i])
ht->rows[i]=Autoarr_create(100,4,ht->type);
Autoarr_add_kvpair(ht->rows[i],pair); Autoarr_add_kvpair(ht->rows[i],pair);
} }
void Hashtable_add(Hashtable* ht, char* key, Unitype value){ void Hashtable_add(Hashtable* ht, char* key, Unitype value){
Hashtable_add_kvpair(ht,(KeyValuePair){key,value}); Hashtable_add_kvpair(ht,(KeyValuePair){key,value});
} }
*/

View File

@ -6,10 +6,10 @@
typedef struct Hashtable{ typedef struct Hashtable{
uint16 height; // amount of rows uint16 height; // amount of rows
Autoarr** rows; // Autoarr[height]s Autoarr* rows; // Autoarr[height]s
} Hashtable; } Hashtable;
Hashtable Hashtable_create(uint16 height,my_type type); Hashtable Hashtable_create(uint16 height);
void Hashtable_clear(Hashtable* ht); void Hashtable_clear(Hashtable* ht);
@ -22,4 +22,4 @@ const uint16 Hashtable_HTINY=61;
const uint16 Hashtable_HSMALL=631; const uint16 Hashtable_HSMALL=631;
const uint16 Hashtable_HMED=3889; const uint16 Hashtable_HMED=3889;
const uint16 Hashtable_HLARGE=19441; const uint16 Hashtable_HLARGE=19441;
const uint16 Hashtable_HMAX=65536; const uint16 Hashtable_HMAX=65521;

View File

@ -1,4 +1,5 @@
#include "SearchTree.h" #include "SearchTree.h"
#include "../Autoarr/Autoarr.h"
STNode* STNode_create(){ STNode* STNode_create(){
STNode* node=malloc(sizeof(STNode)); STNode* node=malloc(sizeof(STNode));

View File

@ -1,9 +1,9 @@
#include "base/base.h" #include "base/base.h"
#include "tests/tests.h" #include "tests/tests.h"
#include "Autoarr/Autoarr.h"
#include "SearchTree/SearchTree.h" #include "SearchTree/SearchTree.h"
#include "Hashtable/hash.h" #include "Hashtable/hash.h"
int main(){ int main(){
setlocale(LC_ALL, "en-US.Unicode"); setlocale(LC_ALL, "en-US.Unicode");
printf("\e[92mdtsod parser in c language!\e[97m\n"); printf("\e[92mdtsod parser in c language!\e[97m\n");

17
DtsodC/src/tests/new.c Normal file
View File

@ -0,0 +1,17 @@
#include "new.h"
#include "../Autoarr/new.h"
#include "../base/base.h"
define_Autoarr(uint16)
void test_new(){
printf("\e[96m------------[test_autoarr]-------------\n");
Autoarr(uint16) ar=Autoarr_create(uint16,10,16);
printf("\e[92mautoarr created\n\e[90m");
fillar(&ar);
printallval(&ar);
printf("\n\e[92mautoarr filled up\n");
printautoarr(&ar);
Autoarr_clear(&ar);
printf("\e[92mautoarr cleared\n");
}

1
DtsodC/src/tests/new.h Normal file
View File

@ -0,0 +1 @@
void test_new();