17db96d56Sopenharmony_ci/* "Rotating trees" (Armin Rigo) 27db96d56Sopenharmony_ci * 37db96d56Sopenharmony_ci * Google "splay trees" for the general idea. 47db96d56Sopenharmony_ci * 57db96d56Sopenharmony_ci * It's a dict-like data structure that works best when accesses are not 67db96d56Sopenharmony_ci * random, but follow a strong pattern. The one implemented here is for 77db96d56Sopenharmony_ci * access patterns where the same small set of keys is looked up over 87db96d56Sopenharmony_ci * and over again, and this set of keys evolves slowly over time. 97db96d56Sopenharmony_ci */ 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#include <stdlib.h> 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci#define EMPTY_ROTATING_TREE ((rotating_node_t *)NULL) 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_citypedef struct rotating_node_s rotating_node_t; 167db96d56Sopenharmony_citypedef int (*rotating_tree_enum_fn) (rotating_node_t *node, void *arg); 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_cistruct rotating_node_s { 197db96d56Sopenharmony_ci void *key; 207db96d56Sopenharmony_ci rotating_node_t *left; 217db96d56Sopenharmony_ci rotating_node_t *right; 227db96d56Sopenharmony_ci}; 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_civoid RotatingTree_Add(rotating_node_t **root, rotating_node_t *node); 257db96d56Sopenharmony_cirotating_node_t* RotatingTree_Get(rotating_node_t **root, void *key); 267db96d56Sopenharmony_ciint RotatingTree_Enum(rotating_node_t *root, rotating_tree_enum_fn enumfn, 277db96d56Sopenharmony_ci void *arg); 28