aff95158创建于 2025年12月23日历史提交
/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
#ifndef RBTREE_H
#define RBTREE_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

#ifndef NULL
#define NULL 0
#endif

#define RED 0
#define BLACK 1

#define BREAK_FLAG 0
#define CONTINUE_FLAG 1
#define RIGHT_FLAG 2
#define LEFT_FLAG 3

#define rb_parent(nc) ((struct rbtree_node *)(uintptr_t)((nc) & ~3UL))
#define rb_parent_node(rb) rb_parent((rb)->rbtree_parent_color)

#define rb_is_black(nc) ((nc) & 1UL)
#define rb_black(rb) rb_is_black((rb)->rbtree_parent_color)
#define rb_red(rb) (!(rb_black(rb)))

#define RB_CLEAR_NODE(node)  ((node)->rbtree_parent_color = (unsigned long)(node))
#define RB_EMPTY_NODE(node)  ((node)->rbtree_parent_color == (unsigned long)(node))
#define RB_EMPTY_ROOT(root)  ((root)->rbtree_node == NULL)

struct rbtree_node {
    unsigned long rbtree_parent_color;
    struct rbtree_node *rbtree_right;
    struct rbtree_node *rbtree_left;
};

struct rbtree_root {
    struct rbtree_node *rbtree_node;
    uint64_t rbtree_len;
};

struct rb_node {
    struct rbtree_node rbtree_node;
    uint64_t key;
};

struct rbtree_augment_callbacks {
    void (*propagate)(struct rbtree_node *node, struct rbtree_node *stop);
    void (*copy)(struct rbtree_node *rb_old, struct rbtree_node *rb_new);
    void (*rotate)(struct rbtree_node *rb_old, struct rbtree_node *rb_new);
};

#define RB_ROOT     (struct rbtree_root) {NULL, 0}
#define rb_entry(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))

void rbtree_set_parent_color(struct rbtree_node *rb, struct rbtree_node *p, int color);
void rbtree_insert_color(struct rbtree_node *node, struct rbtree_root *root);
void rbtree_link_node(struct rbtree_node *node, struct rbtree_node *parent, struct rbtree_node **rb_link);
struct rbtree_node *rbtree_next(const struct rbtree_node *node);
void __rbtree_erase(struct rbtree_node *node, struct rbtree_root *root);
struct rbtree_node *rbtree_prev(const struct rbtree_node *node);
struct rbtree_node *rbtree_first(const struct rbtree_root *root);
struct rbtree_node *rbtree_last(const struct rbtree_root *root);
void rbtree_replace_node(struct rbtree_node *victim, struct rbtree_node *new_, struct rbtree_root *root);

#define rbtree_node_for_each(node, root) for ((node) = rbtree_first(root); (node); (node) = rbtree_next(node))
#define rbtree_node_for_each_prev(node, root) for ((node) = rbtree_last(root); (node); (node) = rbtree_prev(node))
#define rbtree_node_for_each_prev_safe(node, n, root) \
    for ((node) = rbtree_last(root), (n) = ((node) == NULL) ? NULL : rbtree_prev(node); (node); \
        (node) = (n), (n) = ((node) == NULL) ? NULL : rbtree_prev(node))

static inline void rbtree_init(struct rbtree_root *root)
{
    root->rbtree_node = NULL;
    root->rbtree_len = 0;
}

/**
* @brief This interface is used to insert rb_node to rbtree and return a pointer of struct rb_node.
* @attention null
* @return struct rb_node *:
*  1. if the tree already has a node with the same key, then return the node with the same key
*  2. if the tree does not have a node with the same key, then return the node to be inserted
*/
struct rb_node *rbtree_insert_get_node(uint64_t key, struct rbtree_root *root, struct rb_node *node);
int rbtree_insert(uint64_t key, struct rbtree_root *root, struct rb_node *node);
void rbtree_erase(struct rbtree_root *root, struct rb_node *node);
struct rb_node *rbtree_get(uint64_t key, struct rbtree_root *root);
struct rb_node *rbtree_get_upper_bound(uint64_t key, struct rbtree_root *root);

struct rb_range_handle {
    uint64_t start;
    uint64_t end;
};

typedef void (*rb_range_handle_func)(struct rbtree_node *node, struct rb_range_handle *range_handle);

void _rbtree_erase(struct rbtree_root *root, struct rbtree_node *node);
bool rbtree_can_insert_range(struct rbtree_root *root, struct rb_range_handle *range,
    rb_range_handle_func get_range);
int rbtree_insert_by_range(struct rbtree_root *root, struct rbtree_node *node,
    rb_range_handle_func get_range);
struct rbtree_node *rbtree_search_by_range(struct rbtree_root *root, struct rb_range_handle *range,
    rb_range_handle_func get_range);
struct rbtree_node *rbtree_search_upper_bound_range(struct rbtree_root *root, uint64_t val,
    rb_range_handle_func get_range);

struct rbtree_node *rbtree_erase_one_node(struct rbtree_root *root);

#endif