diff --git a/cmake/FastMathOptimizations.cmake b/cmake/FastMathOptimizations.cmake index b015502..2ac3102 100644 --- a/cmake/FastMathOptimizations.cmake +++ b/cmake/FastMathOptimizations.cmake @@ -4,22 +4,37 @@ # visible artifacts, but may be undesirable in some uses. In this case, disable the ENABLE_FAST_MATH option # and specify the safe set of flags via the CMAKE_C_FLAGS and CMAKE_CXX_FLAGS variables. -if(ENABLE_FAST_MATH) +if (ENABLE_FAST_MATH) include(CheckCCompilerFlag) - if(MSVC) + if (CMAKE_C_COMPILER_ID STREQUAL "MSVC") check_c_compiler_flag("/fp:fast" FAST_MATH_OPTIMIZATION_SUPPORTED) - if(FAST_MATH_OPTIMIZATION_SUPPORTED) + if (FAST_MATH_OPTIMIZATION_SUPPORTED) add_compile_options($<$:/fp:fast>) - endif() - else() + endif () + elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang") + check_c_compiler_flag("-O3" ALL_OPTIMIZATIONS_FLAG_SUPPORTED) + if (ALL_OPTIMIZATIONS_FLAG_SUPPORTED) + add_compile_options($<$:-O3>) + endif () + + # Clang has deprecated -Ofast, use -ffast-math instead. + check_c_compiler_flag("-ffast-math" FAST_MATH_OPTIMIZATION_SUPPORTED) + if (FAST_MATH_OPTIMIZATION_SUPPORTED) + add_compile_options($<$:-ffast-math>) + endif () + elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") check_c_compiler_flag("-Ofast" FAST_MATH_OPTIMIZATION_SUPPORTED) - if(FAST_MATH_OPTIMIZATION_SUPPORTED) + if (FAST_MATH_OPTIMIZATION_SUPPORTED) add_compile_options($<$:-Ofast>) - else() + else () check_c_compiler_flag("-O3" ALL_OPTIMIZATIONS_FLAG_SUPPORTED) - if(ALL_OPTIMIZATIONS_FLAG_SUPPORTED) + if (ALL_OPTIMIZATIONS_FLAG_SUPPORTED) add_compile_options($<$:-O3>) - endif() - endif() - endif() -endif() + endif () + endif () + else () + message(AUTHOR_WARNING + "ENABLE_FAST_MATH was requested, but compiler is not supported: ${CMAKE_C_COMPILER_ID}. " + "Please use CMAKE_C_FLAGS to pass the correct optimization flags manually.") + endif () +endif () diff --git a/projectm-eval/CompileContext.c b/projectm-eval/CompileContext.c index 54fbd56..57fa423 100644 --- a/projectm-eval/CompileContext.c +++ b/projectm-eval/CompileContext.c @@ -2,6 +2,7 @@ #include "Scanner.h" #include "Compiler.h" +#include "ExpressionTree.h" #include "MemoryBuffer.h" #include "TreeFunctions.h" @@ -10,19 +11,19 @@ #include prjm_eval_compiler_context_t* prjm_eval_create_compile_context(projectm_eval_mem_buffer global_memory, - PRJM_EVAL_F (* global_variables)[100]) + PRJM_EVAL_F (*global_variables)[100]) { prjm_eval_compiler_context_t* cctx = calloc(1, sizeof(prjm_eval_compiler_context_t)); prjm_eval_intrinsic_function_list intrinsics; - int intrinsics_count = 0; + uint32_t intrinsics_count = 0; prjm_eval_intrinsic_functions(&intrinsics, &intrinsics_count); assert(intrinsics); assert(intrinsics_count); prjm_eval_function_list_item_t* last_func = NULL; - for (int index = intrinsics_count - 1; index >= 0; --index) + for (int32_t index = (int32_t)intrinsics_count - 1; index >= 0; --index) { assert(&intrinsics[index]); prjm_eval_function_list_item_t* func = malloc(sizeof(prjm_eval_function_list_item_t)); @@ -137,7 +138,8 @@ void prjm_eval_reset_context_vars(prjm_eval_compiler_context_t* cctx) } } -const char* prjm_eval_compiler_get_error(prjm_eval_compiler_context_t* cctx, int* line, int* column_start, int* column_end) +const char* prjm_eval_compiler_get_error(prjm_eval_compiler_context_t* cctx, int* line, int* column_start, + int* column_end) { assert(cctx); @@ -157,4 +159,4 @@ const char* prjm_eval_compiler_get_error(prjm_eval_compiler_context_t* cctx, int } return cctx->error.error; -} \ No newline at end of file +} diff --git a/projectm-eval/CompilerFunctions.c b/projectm-eval/CompilerFunctions.c index 41be59e..83c87f8 100644 --- a/projectm-eval/CompilerFunctions.c +++ b/projectm-eval/CompilerFunctions.c @@ -1,5 +1,6 @@ #include "CompilerFunctions.h" +#include "ExpressionTree.h" #include "TreeFunctions.h" #include "TreeVariables.h" diff --git a/projectm-eval/MemoryBuffer.c b/projectm-eval/MemoryBuffer.c index d1e9876..ed2e70d 100644 --- a/projectm-eval/MemoryBuffer.c +++ b/projectm-eval/MemoryBuffer.c @@ -1,5 +1,6 @@ #include "MemoryBuffer.h" +#include #include #include @@ -61,7 +62,7 @@ void prjm_eval_memory_free(projectm_eval_mem_buffer buffer) projectm_eval_memory_host_unlock_mutex(); } -void prjm_eval_memory_free_block(projectm_eval_mem_buffer buffer, int block) +void prjm_eval_memory_free_block(projectm_eval_mem_buffer buffer, int32_t block) { if (block < 0) { @@ -75,7 +76,7 @@ void prjm_eval_memory_free_block(projectm_eval_mem_buffer buffer, int block) } } -PRJM_EVAL_F* prjm_eval_memory_allocate(projectm_eval_mem_buffer buffer, int index) +PRJM_EVAL_F* prjm_eval_memory_allocate(projectm_eval_mem_buffer buffer, int32_t index) { int block; if (!buffer) @@ -115,9 +116,9 @@ PRJM_EVAL_F* prjm_eval_memory_copy(projectm_eval_mem_buffer buffer, PRJM_EVAL_F* len) { // Add 0.0001 to avoid using the wrong index due to tiny float rounding errors. - int offset_dest = (int) (*dest + 0.0001); - int offset_src = (int) (*src + 0.0001); - int count = (int) (*len + 0.0001); + int32_t offset_dest = (int32_t) (*dest + 0.0001); + int32_t offset_src = (int32_t) (*src + 0.0001); + int32_t count = (int32_t) (*len + 0.0001); // Trim to front if an offset is less than zero. if (offset_src < 0) @@ -138,10 +139,10 @@ PRJM_EVAL_F* prjm_eval_memory_copy(projectm_eval_mem_buffer buffer, while (count > 0) { - int copy_length = count; + int32_t copy_length = count; - int max_dst_len = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_dest & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); - int max_src_len = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_src & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); + int32_t max_dst_len = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_dest & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); + int32_t max_src_len = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_src & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); if (offset_dest >= PRJM_EVAL_MEM_BLOCKS * PRJM_EVAL_MEM_ITEMSPERBLOCK || offset_src >= PRJM_EVAL_MEM_BLOCKS * PRJM_EVAL_MEM_ITEMSPERBLOCK) @@ -185,8 +186,8 @@ PRJM_EVAL_F* prjm_eval_memory_set(projectm_eval_mem_buffer buffer, PRJM_EVAL_F* len) { // Add 0.0001 to avoid using the wrong index due to tiny float rounding errors. - int offset_dest = (int) (*dest + 0.0001); - int count = (int) (*len + 0.0001); + int32_t offset_dest = (int32_t) (*dest + 0.0001); + int32_t count = (int32_t) (*len + 0.0001); // Trim to front if (offset_dest < 0) @@ -219,7 +220,7 @@ PRJM_EVAL_F* prjm_eval_memory_set(projectm_eval_mem_buffer buffer, break; } - int block_count = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_dest & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); + int32_t block_count = PRJM_EVAL_MEM_ITEMSPERBLOCK - (offset_dest & (PRJM_EVAL_MEM_ITEMSPERBLOCK - 1)); if (block_count > count) { block_count = count; diff --git a/projectm-eval/Scanner.c b/projectm-eval/Scanner.c index 7a8974f..09124ff 100644 --- a/projectm-eval/Scanner.c +++ b/projectm-eval/Scanner.c @@ -3,6 +3,7 @@ #include "Compiler.h" #include +#include #define YY_NO_UNISTD_H #define YY_STDINIT @@ -755,8 +756,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 51 -#define YY_END_OF_BUFFER 52 +#define YY_NUM_RULES 52 +#define YY_END_OF_BUFFER 53 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -766,14 +767,14 @@ struct yy_trans_info }; static const flex_int16_t yy_accept[80] = { 0, - 0, 0, 0, 0, 0, 0, 52, 50, 49, 49, - 39, 50, 35, 37, 41, 42, 33, 31, 47, 32, - 50, 34, 13, 46, 48, 29, 40, 30, 45, 14, - 14, 43, 44, 36, 38, 51, 3, 51, 6, 5, - 26, 0, 10, 0, 0, 17, 28, 19, 21, 15, - 16, 13, 1, 4, 20, 13, 13, 0, 24, 23, - 25, 14, 14, 22, 18, 27, 2, 0, 0, 9, - 7, 13, 0, 13, 14, 8, 11, 12, 0 + 0, 0, 0, 0, 0, 0, 53, 51, 50, 50, + 40, 51, 36, 38, 42, 43, 34, 32, 48, 33, + 51, 35, 13, 47, 49, 30, 41, 31, 46, 15, + 15, 44, 45, 37, 39, 52, 3, 52, 6, 5, + 27, 0, 10, 0, 0, 18, 29, 20, 22, 16, + 17, 13, 1, 4, 21, 13, 13, 0, 25, 24, + 26, 15, 15, 23, 19, 28, 2, 0, 0, 9, + 7, 13, 0, 13, 15, 8, 11, 12, 0 } ; static const YY_CHAR yy_ec[256] = @@ -889,11 +890,11 @@ static const flex_int16_t yy_chk[169] = /* Table of booleans, true if rule could match eol. */ -static const flex_int32_t yy_rule_can_match_eol[52] = +static const flex_int32_t yy_rule_can_match_eol[53] = { 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, }; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -1445,6 +1446,13 @@ YY_RULE_SETUP YY_BREAK case 14: YY_RULE_SETUP +{ + yylval->NUM = (PRJM_EVAL_F)atoi(yytext); + return NUM; + } + YY_BREAK +case 15: +YY_RULE_SETUP { if (prjm_eval_compiler_name_is_function(cctx, yytext)) { @@ -1456,156 +1464,156 @@ YY_RULE_SETUP } YY_BREAK /* Operators */ -case 15: +case 16: YY_RULE_SETUP { return ADDOP; } YY_BREAK -case 16: +case 17: YY_RULE_SETUP { return SUBOP; } YY_BREAK -case 17: +case 18: YY_RULE_SETUP { return MODOP; } YY_BREAK -case 18: +case 19: YY_RULE_SETUP { return OROP; } YY_BREAK -case 19: +case 20: YY_RULE_SETUP { return ANDOP; } YY_BREAK -case 20: +case 21: YY_RULE_SETUP { return DIVOP; } YY_BREAK -case 21: +case 22: YY_RULE_SETUP { return MULOP; } YY_BREAK -case 22: +case 23: YY_RULE_SETUP { return POWOP; } YY_BREAK -case 23: +case 24: YY_RULE_SETUP { return EQUAL; } YY_BREAK -case 24: +case 25: YY_RULE_SETUP { return BELEQ; } YY_BREAK -case 25: +case 26: YY_RULE_SETUP { return ABOEQ; } YY_BREAK -case 26: +case 27: YY_RULE_SETUP { return NOTEQ; } YY_BREAK -case 27: +case 28: YY_RULE_SETUP { return BOOLOR; } YY_BREAK -case 28: +case 29: YY_RULE_SETUP { return BOOLAND; } YY_BREAK -case 29: +case 30: YY_RULE_SETUP { return '<'; } YY_BREAK -case 30: +case 31: YY_RULE_SETUP { return '>'; } YY_BREAK -case 31: +case 32: YY_RULE_SETUP { return '+'; } YY_BREAK -case 32: +case 33: YY_RULE_SETUP { return '-'; } YY_BREAK -case 33: +case 34: YY_RULE_SETUP { return '*'; } YY_BREAK -case 34: +case 35: YY_RULE_SETUP { return '/'; } YY_BREAK -case 35: +case 36: YY_RULE_SETUP { return '%'; } YY_BREAK -case 36: +case 37: YY_RULE_SETUP { return '^'; } YY_BREAK -case 37: +case 38: YY_RULE_SETUP { return '&'; } YY_BREAK -case 38: +case 39: YY_RULE_SETUP { return '|'; } YY_BREAK -case 39: +case 40: YY_RULE_SETUP { return '!'; } YY_BREAK -case 40: +case 41: YY_RULE_SETUP { return '='; } YY_BREAK /* Syntactic elements */ -case 41: +case 42: YY_RULE_SETUP { return '('; } YY_BREAK -case 42: +case 43: YY_RULE_SETUP { return ')'; } YY_BREAK -case 43: +case 44: YY_RULE_SETUP { return '['; } YY_BREAK -case 44: +case 45: YY_RULE_SETUP { return ']'; } YY_BREAK -case 45: +case 46: YY_RULE_SETUP { return '?'; } YY_BREAK -case 46: +case 47: YY_RULE_SETUP { return ':'; } YY_BREAK -case 47: +case 48: YY_RULE_SETUP { return ','; } YY_BREAK /* Expression terminator */ -case 48: +case 49: YY_RULE_SETUP { return ';'; } YY_BREAK /* Ignored whitespace */ -case 49: -/* rule 49 can match eol */ +case 50: +/* rule 50 can match eol */ YY_RULE_SETUP { } YY_BREAK /* All other tokens are invalid */ -case 50: +case 51: YY_RULE_SETUP { return PRJM_EVAL_UNDEF; } YY_BREAK -case 51: +case 52: YY_RULE_SETUP ECHO; YY_BREAK diff --git a/projectm-eval/Scanner.h b/projectm-eval/Scanner.h index 0ef2aac..ba76251 100644 --- a/projectm-eval/Scanner.h +++ b/projectm-eval/Scanner.h @@ -7,6 +7,7 @@ #include "Compiler.h" #include +#include #define YY_NO_UNISTD_H #define YY_STDINIT diff --git a/projectm-eval/Scanner.l b/projectm-eval/Scanner.l index 5dbdf35..8d2579a 100644 --- a/projectm-eval/Scanner.l +++ b/projectm-eval/Scanner.l @@ -14,6 +14,7 @@ #include "Compiler.h" #include +#include #define YY_NO_UNISTD_H #define YY_STDINIT @@ -41,6 +42,7 @@ HEX [0-9a-fA-F] SIGN [+-] EXPO [eE]{SIGN}?{DIGIT}+ FLOAT ({DIGIT}+|{DIGIT}+\.{DIGIT}*|{DIGIT}*\.{DIGIT}+){EXPO}? +INT {DIGIT}+ NAME [_a-zA-Z][_a-zA-Z0-9]* %% @@ -67,10 +69,14 @@ NAME [_a-zA-Z][_a-zA-Z0-9]* (?i:gmem) { return GMEM; } -{FLOAT} { +{FLOAT} { yylval->NUM = atof(yytext); return NUM; } +{INT} { + yylval->NUM = (PRJM_EVAL_F)atoi(yytext); + return NUM; + } {NAME} { if (prjm_eval_compiler_name_is_function(cctx, yytext)) { diff --git a/projectm-eval/TreeFunctions.c b/projectm-eval/TreeFunctions.c index cf9b838..cf1a2c0 100644 --- a/projectm-eval/TreeFunctions.c +++ b/projectm-eval/TreeFunctions.c @@ -10,6 +10,11 @@ #include #include +#if PRJM_F_SIZE == 4 +typedef int32_t PRJM_EVAL_I; +#else +typedef int64_t PRJM_EVAL_I; +#endif /** * @brief projectM-EvalLib intrinsic Function table. * Contains all predefined functions and information about their invocation. Most functions beginning @@ -151,7 +156,7 @@ static const PRJM_EVAL_F close_factor_low = 1e-300; #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ -void prjm_eval_intrinsic_functions(prjm_eval_intrinsic_function_list_ptr list, int* count) +void prjm_eval_intrinsic_functions(prjm_eval_intrinsic_function_list_ptr list, uint32_t* count) { *count = sizeof(intrinsic_function_table) / sizeof(prjm_eval_function_def_t); *list = intrinsic_function_table; @@ -265,14 +270,14 @@ prjm_eval_function_decl(execute_loop) PRJM_EVAL_F* value_ptr = &ctx->value; invoke_arg(0, &value_ptr); - int loop_count_int = (int) (*value_ptr); + PRJM_EVAL_I loop_count_int = (PRJM_EVAL_I) (*value_ptr); /* Limit execution count */ if (loop_count_int > MAX_LOOP_COUNT) { loop_count_int = MAX_LOOP_COUNT; } - for (int i = 0; i < loop_count_int; i++) + for (PRJM_EVAL_I i = 0; i < loop_count_int; i++) { ctx->value = .0; value_ptr = &ctx->value; @@ -288,7 +293,7 @@ prjm_eval_function_decl(execute_while) ctx->value = .0; PRJM_EVAL_F* value_ptr = &ctx->value; - int loop_count_int = MAX_LOOP_COUNT; + PRJM_EVAL_I loop_count_int = MAX_LOOP_COUNT; do { invoke_arg(0, &value_ptr); @@ -361,7 +366,7 @@ prjm_eval_function_decl(mem) invoke_arg(0, &index_ptr); // Add 0.0001 to avoid using the wrong index due to tiny float rounding errors. - PRJM_EVAL_F* mem_addr = prjm_eval_memory_allocate(ctx->memory_buffer, (int) (*index_ptr + 0.0001)); + PRJM_EVAL_F* mem_addr = prjm_eval_memory_allocate(ctx->memory_buffer, (int32_t) (*index_ptr + 0.0001)); if (mem_addr) { assign_ret_ref(mem_addr); @@ -379,7 +384,7 @@ prjm_eval_function_decl(freembuf) invoke_arg(0, ret_val); // Add 0.0001 to avoid using the wrong index due to tiny float rounding errors. - prjm_eval_memory_free_block(ctx->memory_buffer, (int) (**ret_val + 0.0001)); + prjm_eval_memory_free_block(ctx->memory_buffer, (int32_t) (**ret_val + 0.0001)); } prjm_eval_function_decl(memcpy) @@ -601,13 +606,13 @@ prjm_eval_function_decl(mod) invoke_arg(0, &val1_ptr); invoke_arg(1, &val2_ptr); - int divisor = (int) *val2_ptr; + PRJM_EVAL_I divisor = (PRJM_EVAL_I) *val2_ptr; if (divisor == 0) { assign_ret_val(0.0); return; } - assign_ret_val((PRJM_EVAL_F) ((int) *val1_ptr % divisor)); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I) *val1_ptr % divisor)); } prjm_eval_function_decl(boolean_and_op) @@ -776,7 +781,7 @@ prjm_eval_function_decl(bitwise_or_op) invoke_arg(0, ret_val); invoke_arg(1, &val2_ptr); - assign_ret_val((PRJM_EVAL_F) ((int)(**ret_val) | (int)(*val2_ptr))); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I)(**ret_val) | (PRJM_EVAL_I)(*val2_ptr))); } prjm_eval_function_decl(bitwise_or) @@ -791,7 +796,7 @@ prjm_eval_function_decl(bitwise_or) invoke_arg(0, &val1_ptr); invoke_arg(1, &val2_ptr); - assign_ret_val((PRJM_EVAL_F) ((int)(*val1_ptr) | (int)(*val2_ptr))); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I)(*val1_ptr) | (PRJM_EVAL_I)(*val2_ptr))); } prjm_eval_function_decl(bitwise_and_op) @@ -804,7 +809,7 @@ prjm_eval_function_decl(bitwise_and_op) invoke_arg(0, ret_val); invoke_arg(1, &val2_ptr); - assign_ret_val((PRJM_EVAL_F) ((int)(**ret_val) & (int)(*val2_ptr))); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I)(**ret_val) & (PRJM_EVAL_I)(*val2_ptr))); } prjm_eval_function_decl(bitwise_and) @@ -819,7 +824,7 @@ prjm_eval_function_decl(bitwise_and) invoke_arg(0, &val1_ptr); invoke_arg(1, &val2_ptr); - assign_ret_val((PRJM_EVAL_F) ((int)(*val1_ptr) & (int)(*val2_ptr))); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I)(*val1_ptr) & (PRJM_EVAL_I)(*val2_ptr))); } prjm_eval_function_decl(mod_op) @@ -832,13 +837,13 @@ prjm_eval_function_decl(mod_op) invoke_arg(0, ret_val); invoke_arg(1, &val2_ptr); - int divisor = (int) *val2_ptr; + PRJM_EVAL_I divisor = (PRJM_EVAL_I) *val2_ptr; if (divisor == 0) { assign_ret_val(0.0); return; } - assign_ret_val((PRJM_EVAL_F) ((int)(**ret_val) % divisor)); + assign_ret_val((PRJM_EVAL_F) ((PRJM_EVAL_I)(**ret_val) % divisor)); } prjm_eval_function_decl(pow_op) diff --git a/projectm-eval/TreeFunctions.h b/projectm-eval/TreeFunctions.h index 4e0be55..aa55a69 100644 --- a/projectm-eval/TreeFunctions.h +++ b/projectm-eval/TreeFunctions.h @@ -5,7 +5,8 @@ #pragma once #include "CompilerTypes.h" -#include "ExpressionTree.h" + +#include /** * @brief Returns the list with the built-in function table. @@ -13,7 +14,7 @@ * @param list A pointer which will receive the list reference. * @param count The number of elements inserted into the list. */ -void prjm_eval_intrinsic_functions(prjm_eval_intrinsic_function_list_ptr list, int* count); +void prjm_eval_intrinsic_functions(prjm_eval_intrinsic_function_list_ptr list, uint32_t* count); /** * @brief Abbreviates parser function declaration. diff --git a/tests/TreeFunctionsTest.cpp b/tests/TreeFunctionsTest.cpp index 6bf140f..454454f 100644 --- a/tests/TreeFunctionsTest.cpp +++ b/tests/TreeFunctionsTest.cpp @@ -1,5 +1,9 @@ #include "TreeFunctionsTest.hpp" +extern "C" { +#include +} + #include #ifdef _MSC_VER @@ -17,7 +21,7 @@ prjm_eval_variable_def_t* TreeFunctions::FindVariable(const char* name) { - for (const auto var: m_variables) + for (const auto var : m_variables) { if (strcasecmp(name, var->name) == 0) { @@ -49,8 +53,8 @@ prjm_eval_exptreenode_t* TreeFunctions::CreateEmptyNode(int argCount) auto* node = reinterpret_cast(calloc(1, sizeof(prjm_eval_exptreenode_t))); if (argCount > 0) { - node->args = reinterpret_cast( calloc(argCount + 1, - sizeof(prjm_eval_exptreenode_t*))); + node->args = reinterpret_cast(calloc(argCount + 1, + sizeof(prjm_eval_exptreenode_t*))); } return node; } @@ -85,13 +89,13 @@ void TreeFunctions::SetUp() void TreeFunctions::TearDown() { - for (auto node: m_treeNodes) + for (auto node : m_treeNodes) { prjm_eval_destroy_exptreenode(node); } m_treeNodes.clear(); - for (const auto var: m_variables) + for (const auto var : m_variables) { free(var->name); // alloc'd via C malloc/strdup! delete var; @@ -105,7 +109,6 @@ void TreeFunctions::TearDown() } Test::TearDown(); - } @@ -139,7 +142,6 @@ TEST_F(TreeFunctions, Variable) TEST_F(TreeFunctions, ExecuteList) { - // Expression list ("x = -50; y = 50;") prjm_eval_variable_def_t* var1; auto* varNode1 = CreateVariableNode("x", 5.f, &var1); @@ -1586,7 +1588,7 @@ TEST_F(TreeFunctions, SineFunction) var->value = M_PI_2; sinNode->func(sinNode, &valuePointer); - EXPECT_PRJM_F_EQ(*valuePointer, 1.0) << "sin($PI/2)"; + EXPECT_PRJM_F_EQ(*valuePointer, 1.0) << "sin($PI/2)"; var->value = -M_PI_2; sinNode->func(sinNode, &valuePointer); @@ -1614,7 +1616,7 @@ TEST_F(TreeFunctions, CosineFunction) // Results for cos(PI/2) are close to 0, but too far for GTest to see as equal (~6e-17) var->value = M_PI; cosNode->func(cosNode, &valuePointer); - EXPECT_PRJM_F_EQ(*valuePointer, -1.0) << "cos($PI/2)"; + EXPECT_PRJM_F_EQ(*valuePointer, -1.0) << "cos($PI/2)"; var->value = -M_PI; cosNode->func(cosNode, &valuePointer); @@ -1641,7 +1643,7 @@ TEST_F(TreeFunctions, TangentFunction) var->value = M_PI_4; tanNode->func(tanNode, &valuePointer); - EXPECT_PRJM_F_EQ(*valuePointer, 1.0) << "tan($PI/4)"; + EXPECT_PRJM_F_EQ(*valuePointer, 1.0) << "tan($PI/4)"; var->value = -M_PI_4; tanNode->func(tanNode, &valuePointer); @@ -1668,7 +1670,7 @@ TEST_F(TreeFunctions, ArcSineFunction) var->value = 1.0; asinNode->func(asinNode, &valuePointer); - EXPECT_PRJM_F_EQ(*valuePointer, M_PI_2) << "asin(1.0)"; + EXPECT_PRJM_F_EQ(*valuePointer, M_PI_2) << "asin(1.0)"; var->value = -1.0; asinNode->func(asinNode, &valuePointer); @@ -1703,7 +1705,7 @@ TEST_F(TreeFunctions, ArcCosineFunction) var->value = 1.0; acosNode->func(acosNode, &valuePointer); - EXPECT_PRJM_F_EQ(*valuePointer, 0.0) << "acos(1.0)"; + EXPECT_PRJM_F_EQ(*valuePointer, 0.0) << "acos(1.0)"; var->value = -1.0; acosNode->func(acosNode, &valuePointer); @@ -2045,7 +2047,6 @@ TEST_F(TreeFunctions, SigmoidalFunction) var2->value = 1.0; sigmoidalNode->func(sigmoidalNode, &valuePointer); EXPECT_PRJM_F_EQ(*valuePointer, 0.0) << "sigmoid(-100000, 1)"; - } TEST_F(TreeFunctions, SquareFunction) @@ -2099,11 +2100,10 @@ TEST_F(TreeFunctions, SquareFunction) var->value = 3.402823466E+34f; #else // 10^8 below max value for a double - var->value = 1.7976931348623157E+300; + var->value = 1.7976931348623157E+300; #endif sqrNode->func(sqrNode, &valuePointer); EXPECT_PRJM_F_EQ(*valuePointer, INFINITY) << "sqr(" << var->value << ")"; - } TEST_F(TreeFunctions, AbsoluteFunction) @@ -2163,7 +2163,6 @@ TEST_F(TreeFunctions, MinimumFunction) var2->value = 100000.0; minNode->func(minNode, &valuePointer); EXPECT_PRJM_F_EQ(*valuePointer, -100000.0) << "min(-100000, 100000)"; - } TEST_F(TreeFunctions, MaximumFunction) @@ -2196,7 +2195,6 @@ TEST_F(TreeFunctions, MaximumFunction) var2->value = 100000.0; maxNode->func(maxNode, &valuePointer); EXPECT_PRJM_F_EQ(*valuePointer, 100000.0) << "max(-100000, 100000)"; - } TEST_F(TreeFunctions, SignFunction) @@ -2296,5 +2294,4 @@ TEST_F(TreeFunctions, InverseSquareRootFunction) var1->value = -1.0; invsqrtNode->func(invsqrtNode, &valuePointer); EXPECT_PRJM_F_EQ(*valuePointer, -INFINITY) << "invsqrt(-1.0)"; - }