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