You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.0 KiB

/* BEGIN_LEGAL
Copyright (c) 2021 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
END_LEGAL */
#if !defined(_AVL_TREE_H_)
# define _AVL_TREE_H_
#include <stdint.h>
#if defined(AVL_KEY_32_BIT)
typedef uint32_t avl_key_t;
#else
typedef uint64_t avl_key_t;
#endif
struct avl_node_s; // fwd decl
typedef struct {
struct avl_node_s* top;
} avl_tree_t;
void avl_tree_init(avl_tree_t* tree);
// clear removes the tree nodes, not the data
void avl_tree_clear(avl_tree_t* tree, int free_data);
void* avl_find(avl_tree_t* tree, avl_key_t key);
// find the node with a key <= the given key. Returns found key value in
// lbkey and the data payoad as a return value.
void* avl_find_lower_bound(avl_tree_t* tree, avl_key_t key,
avl_key_t* lbkey); // output
// insert notices key collisions and will free the associated data if
// free_data is nonzero.
void avl_insert(avl_tree_t* tree, avl_key_t key, void* value, int free_data);
#if 0 // DELETE not done yet.
// return 1 on failure, 0 on success
int avl_delete(avl_tree_t* tree, avl_key_t key, int free_data);
#endif
struct avl_link_node_s; // fwd decl
typedef struct avl_iter_s {
struct avl_link_node_s* head;
struct avl_link_node_s* tail;
} avl_iter_t;
void avl_iter_begin( avl_iter_t* iter,avl_tree_t* tree);
void* avl_iter_current(avl_iter_t* iter);
void avl_iter_increment(avl_iter_t* iter);
int avl_iter_done(avl_iter_t* iter);
void avl_iter_cleanup(avl_iter_t* iter); // call if end iteration early
#endif