00001 #ifndef _CP_SPLAY_H
00002 #define _CP_SPLAY_H
00003
00020 #include "common.h"
00021 #include "collection.h"
00022 #include "vector.h"
00023 #include "mempool.h"
00024
00025 __BEGIN_DECLS
00026
00027 CPROPS_DLL struct _cp_splaytree;
00028
00029 typedef CPROPS_DLL struct _cp_splaynode
00030 {
00031 void *key;
00032 void *value;
00033
00034 struct _cp_splaynode *left;
00035 struct _cp_splaynode *right;
00036 } cp_splaynode;
00037
00038
00039 CPROPS_DLL
00040 cp_splaynode *cp_splaynode_create(void *key, void *value, cp_mempool *pool);
00041
00042 CPROPS_DLL
00043 void cp_splaytree_destroy_node(struct _cp_splaytree *tree, cp_splaynode *node);
00044
00045 CPROPS_DLL
00046 void cp_splaytree_destroy_node_deep(struct _cp_splaytree *owner, cp_splaynode *node);
00047
00048
00049
00050 typedef CPROPS_DLL struct _cp_splaytree
00051 {
00052 cp_splaynode *root;
00053
00054 int items;
00055
00056 int mode;
00057 cp_compare_fn cmp;
00058 cp_copy_fn key_copy;
00059 cp_destructor_fn key_dtr;
00060 cp_copy_fn value_copy;
00061 cp_destructor_fn value_dtr;
00062 cp_lock *lock;
00063 cp_thread txowner;
00064 int txtype;
00065
00066 cp_mempool *mempool;
00067 } cp_splaytree;
00068
00069
00070
00071
00072
00073 CPROPS_DLL
00074 cp_splaytree *cp_splaytree_create(cp_compare_fn cmp);
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 CPROPS_DLL
00086 cp_splaytree *
00087 cp_splaytree_create_by_option(int mode, cp_compare_fn cmp,
00088 cp_copy_fn key_copy, cp_destructor_fn key_dtr,
00089 cp_copy_fn val_copy, cp_destructor_fn val_dtr);
00090
00091
00092
00093
00094 CPROPS_DLL
00095 void cp_splaytree_destroy(cp_splaytree *tree);
00096
00097
00098
00099
00100 CPROPS_DLL
00101 void cp_splaytree_destroy_custom(cp_splaytree *tree,
00102 cp_destructor_fn key_dtr,
00103 cp_destructor_fn val_dtr);
00104
00105
00106 CPROPS_DLL
00107 void *cp_splaytree_insert(cp_splaytree *tree, void *key, void *value);
00108
00109
00110 CPROPS_DLL
00111 void *cp_splaytree_get(cp_splaytree *tree, void *key);
00112
00113
00114 CPROPS_DLL
00115 void *cp_splaytree_find(cp_splaytree *tree, void *key, cp_op op);
00116
00117
00118 CPROPS_DLL
00119 int cp_splaytree_contains(cp_splaytree *tree, void *key);
00120
00121
00122 CPROPS_DLL
00123 void *cp_splaytree_delete(cp_splaytree *tree, void *key);
00124
00125
00126
00127
00128
00129 CPROPS_DLL
00130 int cp_splaytree_callback_preorder(cp_splaytree *tree,
00131 cp_callback_fn callback,
00132 void *prm);
00133
00134
00135
00136
00137 CPROPS_DLL
00138 int cp_splaytree_callback(cp_splaytree *tree, cp_callback_fn callback, void *prm);
00139
00140
00141
00142
00143 CPROPS_DLL
00144 int cp_splaytree_callback_postorder(cp_splaytree *tree,
00145 cp_callback_fn callback,
00146 void *prm);
00147
00148
00149 CPROPS_DLL
00150 int cp_splaytree_count(cp_splaytree *tree);
00151
00152
00153
00154
00155 CPROPS_DLL
00156 int cp_splaytree_lock(cp_splaytree *tree, int type);
00157
00158 #define cp_splaytree_rdlock(tree) \
00159 (cp_splaytree_lock((tree), COLLECTION_LOCK_READ))
00160
00161 #define cp_splaytree_wrlock(tree) \
00162 (cp_splaytree_lock((tree), COLLECTION_LOCK_WRITE))
00163
00164 CPROPS_DLL
00165 int cp_splaytree_unlock(cp_splaytree *tree);
00166
00167
00168
00169 CPROPS_DLL
00170 int cp_splaytree_get_mode(cp_splaytree *tree);
00171
00172 CPROPS_DLL
00173 int cp_splaytree_set_mode(cp_splaytree *tree, int mode);
00174
00175
00176
00177
00178 CPROPS_DLL
00179 int cp_splaytree_unset_mode(cp_splaytree *tree, int mode);
00180
00181
00182 CPROPS_DLL
00183 void cp_splaytree_dump(cp_splaytree *tree);
00184
00185
00186 CPROPS_DLL
00187 int cp_splaytree_use_mempool(cp_splaytree *tree, cp_mempool *pool);
00188
00189
00190 CPROPS_DLL
00191 int cp_splaytree_share_mempool(cp_splaytree *tree, cp_shared_mempool *pool);
00192
00193
00194 __END_DECLS
00195
00198 #endif
00199