comparison lwlib/lw_expr.h @ 337:3b5a45c6ab92

Speed improvement to lw_expr Instead of using a singly linked list and doing the slow append algorithm when adding an operand to an expression (scan from the start to find the end), now maintain a tail pointer. Also maintain a previous pointer in each entry. Benchmarking suggests this yields a rougly 30% improvement in runtime. Also refactor some of the code in lw_expr.c to make it somewhat clearer to understand. For some values of clearer and understand.
author William Astle <lost@l-w.ca>
date Sat, 02 Aug 2014 10:08:01 -0600
parents 1f1a28b797e1
children 6138e304ab9a
comparison
equal deleted inserted replaced
336:30b2bad9b5eb 337:3b5a45c6ab92
56 56
57 struct lw_expr_opers 57 struct lw_expr_opers
58 { 58 {
59 lw_expr_t p; 59 lw_expr_t p;
60 struct lw_expr_opers *next; 60 struct lw_expr_opers *next;
61 struct lw_expr_opers *prev;
61 }; 62 };
62 63
63 struct lw_expr_priv 64 struct lw_expr_priv
64 { 65 {
65 int type; // type of term 66 int type; // type of term
66 int value; // integer value 67 int value; // integer value
67 void *value2; // misc pointer value 68 void *value2; // misc pointer value
68 struct lw_expr_opers *operands; // ptr to list of operands (for operators) 69 struct lw_expr_opers *operands; // ptr to list of operands (for operators)
70 struct lw_expr_opers *operand_tail; // ptr to last operand
69 }; 71 };
70 72
71 typedef lw_expr_t lw_expr_fn_t(int t, void *ptr, void *priv); 73 typedef lw_expr_t lw_expr_fn_t(int t, void *ptr, void *priv);
72 typedef lw_expr_t lw_expr_fn2_t(char *var, void *priv); 74 typedef lw_expr_t lw_expr_fn2_t(char *var, void *priv);
73 typedef lw_expr_t lw_expr_fn3_t(char **p, void *priv); 75 typedef lw_expr_t lw_expr_fn3_t(char **p, void *priv);