|
|
@ -5,6 +5,7 @@ |
|
|
|
|
|
|
|
void generator( |
|
|
|
tstring* header_filename, |
|
|
|
tstring* source_filename, |
|
|
|
tstring* prefix, |
|
|
|
tstring* bucket_count, |
|
|
|
tstring* K_size, tstring* K_comp_pred, tstring* K_hash_func, |
|
|
@ -40,7 +41,10 @@ void generator( |
|
|
|
"size_t operator()(",key_type," key) {\n" |
|
|
|
"return ", K_hash_func, "(key);\n" |
|
|
|
"}\n" |
|
|
|
"}\n" |
|
|
|
"};\n" |
|
|
|
); |
|
|
|
tstring* hash_type = tstring_n_compose("tc", |
|
|
|
prefix,"_hashtype" |
|
|
|
); |
|
|
|
tstring* hashmap_ptr_type = tstring_n_compose("tc", |
|
|
|
prefix,"_hashmap_ptr" |
|
|
@ -48,24 +52,32 @@ void generator( |
|
|
|
tstring* hashmap_decl = tstring_n_compose("ctc", |
|
|
|
"typedef void* ",hashmap_ptr_type,";\n" |
|
|
|
); |
|
|
|
tstring* cpp_hashmap_type = tstring_n_compose("ctctctctc", |
|
|
|
"mct20::lfhmap<",key_type,",",value_type,",",bucket_count,",",hash_type,">" |
|
|
|
); |
|
|
|
tstring* cpp_hashmap_ptr_type = tstring_n_compose("tc", |
|
|
|
cpp_hashmap_type,"*" |
|
|
|
); |
|
|
|
|
|
|
|
tstring* create_hashmap_decl = tstring_n_compose("tctc", |
|
|
|
hashmap_ptr_type," ",prefix,"_hm_create();\n" |
|
|
|
); |
|
|
|
tstring* destroy_hashmap_decl = tstring_n_compose("ctctc", |
|
|
|
"void ", prefix, "_hm_destroy(",hashmap_ptr_type,");\n" |
|
|
|
); |
|
|
|
tstring* hashmap_push_decl = tstring_n_compose("ctctctc", |
|
|
|
"void ", prefix, "_hm_push(",key_type,"* k, ",value_type,"* v);\n" |
|
|
|
tstring* hashmap_push_decl = tstring_n_compose("ctctctctc", |
|
|
|
"void ", prefix, "_hm_push(",hashmap_ptr_type," ptr, ",key_type,"* k, ",value_type,"* v);\n" |
|
|
|
); |
|
|
|
tstring* hashmap_get_decl = tstring_n_compose("tctctc", |
|
|
|
accessor_type, " ", prefix, "_hm_get(",key_type,"* k);\n" |
|
|
|
tstring* hashmap_get_decl = tstring_n_compose("tctctctc", |
|
|
|
accessor_type, " ", prefix, "_hm_get(",hashmap_ptr_type," ptr, ",key_type,"* k);\n" |
|
|
|
); |
|
|
|
tstring* hashmap_endget_decl = tstring_n_compose("ctctc", |
|
|
|
tstring* hashmap_endget_decl = tstring_n_compose("ctctctc", |
|
|
|
"void ", prefix, "_hm_endget(",accessor_type," acc);\n" |
|
|
|
); |
|
|
|
tstring* hashmap_remove_decl = tstring_n_compose("ctctc", |
|
|
|
"void ", prefix, "_hm_remove(",key_type,"* k);\n" |
|
|
|
tstring* hashmap_remove_decl = tstring_n_compose("ctctctc", |
|
|
|
"void ", prefix, "_hm_remove(",hashmap_ptr_type," ptr, ",key_type,"* k);\n" |
|
|
|
); |
|
|
|
|
|
|
|
tstring* top_guard = tstring_n_compose("ctctc", |
|
|
|
"#ifndef GUARD_", prefix, |
|
|
|
"\n#define GUARD_", prefix,"\n\n" |
|
|
@ -73,32 +85,146 @@ void generator( |
|
|
|
tstring* bottom_guard = tstring_n_compose("ctc", |
|
|
|
"\n#endif // GUARD_", prefix, "\n" |
|
|
|
); |
|
|
|
FILE* header; |
|
|
|
if( |
|
|
|
!(header = fopen(header_filename->data, "w")) |
|
|
|
) { |
|
|
|
char* m = header_filename->data; |
|
|
|
fprintf(stderr, "Couldn't open header file: %s\n", header_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
tstring* extc_top_guard = cstring_to_tstring( |
|
|
|
"#ifdef __cplusplus\n" |
|
|
|
"extern \"C\" {\n" |
|
|
|
"#endif\n" |
|
|
|
); |
|
|
|
tstring* extc_bottom_guard = cstring_to_tstring( |
|
|
|
"#ifdef __cplusplus\n" |
|
|
|
"}\n" |
|
|
|
"#endif\n" |
|
|
|
); |
|
|
|
tstring* cpp_header_include = cstring_to_tstring( |
|
|
|
"#include \"lfhmap.hpp\"\n" |
|
|
|
); |
|
|
|
tstring* key_equality_predicate_handler = tstring_n_compose("ctctctctc", |
|
|
|
"bool operator==(",key_type,"& lhs,",key_type,"& rhs) {\n" |
|
|
|
" return K_comp_pred((void*)&lhs,(void*)&rhs);\n" |
|
|
|
"}\n" |
|
|
|
"bool operator!=(",key_type,"& lhs,",key_type,"& rhs) {\n" |
|
|
|
" return !K_comp_pred((void*)&lhs,(void*)&rhs);\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
tstring* to_cpp_hashmap_cast = tstring_n_compose("ctc", |
|
|
|
"(", cpp_hashmap_ptr_type, ")" |
|
|
|
); |
|
|
|
tstring* from_cpp_hashmap_cast = tstring_n_compose("ctc", |
|
|
|
"(", hashmap_ptr_type, ")" |
|
|
|
); |
|
|
|
|
|
|
|
tstring* create_hashmap_impl = tstring_n_compose("tctctctc", |
|
|
|
hashmap_ptr_type," ",prefix,"_hm_create(){\n" |
|
|
|
" return ",from_cpp_hashmap_cast,"new ",cpp_hashmap_type,"();\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
tstring* destroy_hashmap_impl = tstring_n_compose("ctctctc", |
|
|
|
"void ", prefix, "_hm_destroy(",hashmap_ptr_type," value){\n" |
|
|
|
" delete ",to_cpp_hashmap_cast,"value;\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
|
|
|
|
tstring* hashmap_push_impl = tstring_n_compose("ctctctctctc", |
|
|
|
"void ", prefix, "_hm_push(",hashmap_ptr_type," ptr, ",key_type,"* k, ",value_type,"* v){\n" |
|
|
|
" (",to_cpp_hashmap_cast,"ptr)->set(*k, *v);\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
tstring* hashmap_get_impl = tstring_n_compose("tctctctctctctc", |
|
|
|
accessor_type, " ", prefix, "_hm_get(",hashmap_ptr_type," ptr, ",key_type,"* k){\n", |
|
|
|
accessor_type, " acc;\n" |
|
|
|
" auto obtained = (",to_cpp_hashmap_cast,"ptr)->get(*k);\n" |
|
|
|
" if(obtained) {\n" |
|
|
|
" acc.value = (void*)new accessor<",value_type,">(obtained.value());\n" |
|
|
|
" } else {\n" |
|
|
|
" acc.value = nullptr;\n" |
|
|
|
" }\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
tstring* hashmap_endget_impl = tstring_n_compose("ctctctc", |
|
|
|
"void ", prefix, "_hm_endget(",accessor_type," acc) {\n" |
|
|
|
" delete (accessor<",value_type,">*)acc.value;\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
tstring* hashmap_remove_impl = tstring_n_compose("ctctctctc", |
|
|
|
"void ", prefix, "_hm_remove(",hashmap_ptr_type," ptr, ",key_type,"* k) {\n" |
|
|
|
" (",to_cpp_hashmap_cast,"ptr)->remove(*k);\n" |
|
|
|
"}\n" |
|
|
|
); |
|
|
|
|
|
|
|
{ |
|
|
|
FILE* header; |
|
|
|
if( |
|
|
|
!(header = fopen(header_filename->data, "w")) |
|
|
|
) { |
|
|
|
char* m = header_filename->data; |
|
|
|
fprintf(stderr, "Couldn't open header file: %s\n", header_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
if( |
|
|
|
tstring_n_write( |
|
|
|
header,14, |
|
|
|
top_guard, |
|
|
|
extc_top_guard, |
|
|
|
key_type_decl, |
|
|
|
value_type_decl, |
|
|
|
accessor_type_decl, |
|
|
|
hashmap_decl, |
|
|
|
create_hashmap_decl, |
|
|
|
destroy_hashmap_decl, |
|
|
|
hashmap_get_decl, |
|
|
|
hashmap_endget_decl, |
|
|
|
hashmap_push_decl, |
|
|
|
hashmap_remove_decl, |
|
|
|
extc_bottom_guard, |
|
|
|
bottom_guard |
|
|
|
) != 0 |
|
|
|
) { |
|
|
|
fprintf(stderr, "Couldn't generate header file: error writing to file: %s\n", header_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
fclose(header); |
|
|
|
} |
|
|
|
if( |
|
|
|
tstring_n_write( |
|
|
|
header,12, |
|
|
|
top_guard, |
|
|
|
key_type_decl, |
|
|
|
value_type_decl, |
|
|
|
accessor_type_decl, |
|
|
|
hashmap_decl, |
|
|
|
create_hashmap_decl, |
|
|
|
destroy_hashmap_decl, |
|
|
|
hashmap_get_decl, |
|
|
|
hashmap_endget_decl, |
|
|
|
hashmap_push_decl, |
|
|
|
hashmap_remove_decl, |
|
|
|
bottom_guard |
|
|
|
) != 0 |
|
|
|
) { |
|
|
|
fprintf(stderr, "Couldn't generate header file: error writing to file: %s\n", header_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
{ |
|
|
|
FILE* source; |
|
|
|
if( |
|
|
|
!(source = fopen(source_filename->data, "w")) |
|
|
|
) { |
|
|
|
char* m = source_filename->data; |
|
|
|
fprintf(stderr, "Couldn't open source file: %s\n", source_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
if( |
|
|
|
tstring_n_write( |
|
|
|
source,21, |
|
|
|
top_guard, |
|
|
|
cpp_header_include, |
|
|
|
extc_top_guard, |
|
|
|
key_type_decl, |
|
|
|
value_type_decl, |
|
|
|
accessor_type_decl, |
|
|
|
hash_decl, |
|
|
|
hashmap_decl, |
|
|
|
|
|
|
|
create_hashmap_decl, |
|
|
|
destroy_hashmap_decl, |
|
|
|
hashmap_get_decl, |
|
|
|
hashmap_endget_decl, |
|
|
|
hashmap_push_decl, |
|
|
|
hashmap_remove_decl, |
|
|
|
|
|
|
|
create_hashmap_impl, |
|
|
|
destroy_hashmap_impl, |
|
|
|
hashmap_get_impl, |
|
|
|
hashmap_endget_impl, |
|
|
|
hashmap_push_impl, |
|
|
|
hashmap_remove_impl, |
|
|
|
extc_bottom_guard, |
|
|
|
bottom_guard |
|
|
|
) != 0 |
|
|
|
) { |
|
|
|
fprintf(stderr, "Couldn't generate header file: error writing to file: %s\n", source_filename->data); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
fclose(source); |
|
|
|
} |
|
|
|
} |
|
|
|
} |