Scippy

    SCIP

    Solving Constraint Integer Programs

    rbtree.h
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file rbtree.h
    26 * @brief intrusive red black tree datastructure
    27 * @author Leona Gottwald
    28 */
    29
    30/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    31
    32#ifndef __SCIP_RB_TREE_H__
    33#define __SCIP_RB_TREE_H__
    34
    35#include "scip/def.h"
    36#include "scip/type_misc.h"
    37
    38#ifdef __cplusplus
    39extern "C" {
    40#endif
    41
    43
    45{
    46 uintptr_t parent;
    48};
    49
    50/* macro to make any structure a node in a rbtree.
    51 * It is very important that this is the first member of the structure.
    52 *
    53 * Example usage:
    54 * struct SomeStruct
    55 * {
    56 * SCIP_RBTREE_HOOKS;
    57 * OTHERDATA* mydata;
    58 * int othermember;
    59 * };
    60 *
    61 */
    62#define SCIP_RBTREE_HOOKS SCIP_RBTREENODE _rbtreenode
    63
    64/* convenience macros that automatically cast the given arguments to SCIP_RBTREENODE */
    65#define SCIPrbtreeFirst(root) SCIPrbtreeFirst_call((SCIP_RBTREENODE*)(root))
    66#define SCIPrbtreeLast(root) SCIPrbtreeLast_call((SCIP_RBTREENODE*)(root))
    67#define SCIPrbtreeSuccessor(x) SCIPrbtreeSuccessor_call((SCIP_RBTREENODE*)(x))
    68#define SCIPrbtreePredecessor(x) SCIPrbtreePredecessor_call((SCIP_RBTREENODE*)(x))
    69#define SCIPrbtreeDelete(root, node) SCIPrbtreeDelete_call((SCIP_RBTREENODE**)(root), (SCIP_RBTREENODE*)(node))
    70#define SCIPrbtreeInsert(r,p,c,n) SCIPrbtreeInsert_call((SCIP_RBTREENODE**)(r), (SCIP_RBTREENODE*)(p), (c), (SCIP_RBTREENODE*)(n) )
    71#define SCIPrbtreeFindInt(r,k,n) SCIPrbtreeFindInt_call((SCIP_RBTREENODE*)(r),(k),(SCIP_RBTREENODE**)(n))
    72#define SCIPrbtreeFindReal(r,k,n) SCIPrbtreeFindReal_call((SCIP_RBTREENODE*)(r),(k),(SCIP_RBTREENODE**)(n))
    73#define SCIPrbtreeFindPtr(c,r,k,n) SCIPrbtreeFindPtr_call((c),(SCIP_RBTREENODE*)(r),(void*)(k),(SCIP_RBTREENODE**)(n))
    74#define SCIPrbtreeFindElem(c,r,k,n) SCIPrbtreeFindElem_call((c),(SCIP_RBTREENODE*)(r),(SCIP_RBTREENODE*)(k),(SCIP_RBTREENODE**)(n))
    75
    76
    77#define FOR_EACH_NODE(type, n, r, body) \
    78 { \
    79 type n; \
    80 type __next; \
    81 n = (type) SCIPrbtreeFirst(r); \
    82 while( n != NULL ) \
    83 { \
    84 __next = (type) SCIPrbtreeSuccessor(n); \
    85 body \
    86 n = __next; \
    87 } \
    88 }
    89
    90#define SCIP_DEF_RBTREE_FIND(NAME, KEYTYPE, NODETYPE, LT, GT) \
    91 /** Searches for an element in the tree given by it's root. If a node equal to the given element exists in the tree, \
    92 * (*node) will point to that node upon termination of this function and 0 will be returned. \
    93 * If the tree is empty (*node) will be NULL. Otherwise (*node) will point to the predecessor or \
    94 * successor of the given element and -1 or 1 will be returned respectively. The return value and the \
    95 * predecessor or successor can then be passed to the insert function to insert the element but only if \
    96 * it is not in the tree already, i.e. this function did not return 0. \
    97 * \
    98 * @returns 0 if the key was found, then *node is the node with the key and \
    99 * -1 or 1 if the node was node found, then *node is the node with the \
    100 * next smaller, or next larger key repectively. \
    101 */ \
    102 int NAME( \
    103 NODETYPE* root, /**< root of the tree */ \
    104 KEYTYPE key, /**< key to search for */ \
    105 NODETYPE** node /**< pointer to return node */ \
    106 ) \
    107 { \
    108 SCIP_RBTREENODE* x; \
    109 *node = NULL; \
    110 x = (SCIP_RBTREENODE*) root; \
    111 while( x != NULL ) \
    112 { \
    113 *node = (NODETYPE*) x; \
    114 if( LT(key, ((NODETYPE*)x)) ) \
    115 x = x->child[0]; \
    116 else if( GT(key, ((NODETYPE*)x)) ) \
    117 x = x->child[1]; \
    118 else \
    119 return 0; \
    120 } \
    121 if( *node != NULL && LT(key, ((NODETYPE*)(*node)) ) ) \
    122 return 1; \
    123 return -1; \
    124 }
    125
    126
    127/** get first element in tree with respect to sorting key */
    128SCIP_EXPORT
    130 SCIP_RBTREENODE* root /**< root of the tree */
    131 );
    132
    133/** get last element in tree with respect to sorting key */
    134SCIP_EXPORT
    136 SCIP_RBTREENODE* root /**< root of the tree */
    137 );
    138
    139/** get successor of given element in the tree */
    140SCIP_EXPORT
    142 SCIP_RBTREENODE* x /**< element to get successor for */
    143 );
    144
    145/** get predecessor of given element in the tree */
    146SCIP_EXPORT
    148 SCIP_RBTREENODE* x /**< element to get predecessor for */
    149 );
    150
    151/** delete the given node from the tree given by it's root node.
    152 * The node must be contained in the tree rooted at root.
    153 */
    154SCIP_EXPORT
    156 SCIP_RBTREENODE** root, /**< root of the tree */
    157 SCIP_RBTREENODE* node /**< node to delete from tree */
    158 );
    159
    160/** insert node into the tree given by it's root. Requires the
    161 * future parent and the position of the parent as returned by
    162 * the tree's find function defined using the SCIP_DEF_RBTREE_FIND
    163 * macro.
    164 */
    165SCIP_EXPORT
    167 SCIP_RBTREENODE** root, /**< root of the tree */
    168 SCIP_RBTREENODE* parent, /**< future parent of node to be inserted */
    169 int pos, /**< position of parent with respect to node, i.e.
    170 * -1 if the parent's key comes before node and 1
    171 * if the parent's key comes after the node
    172 */
    173 SCIP_RBTREENODE* node /**< node to insert into the tree */
    174 );
    175
    176#ifdef __cplusplus
    177}
    178#endif
    179
    180#endif
    SCIP_VAR ** x
    Definition: circlepacking.c:63
    common defines and data types used in all packages of SCIP
    void SCIPrbtreeDelete_call(SCIP_RBTREENODE **root, SCIP_RBTREENODE *node)
    Definition: rbtree.c:297
    void SCIPrbtreeInsert_call(SCIP_RBTREENODE **root, SCIP_RBTREENODE *parent, int pos, SCIP_RBTREENODE *node)
    Definition: rbtree.c:352
    SCIP_RBTREENODE * SCIPrbtreeFirst_call(SCIP_RBTREENODE *root)
    Definition: rbtree.c:227
    SCIP_RBTREENODE * SCIPrbtreePredecessor_call(SCIP_RBTREENODE *x)
    Definition: rbtree.c:275
    SCIP_RBTREENODE * SCIPrbtreeLast_call(SCIP_RBTREENODE *root)
    Definition: rbtree.c:241
    SCIP_RBTREENODE * SCIPrbtreeSuccessor_call(SCIP_RBTREENODE *x)
    Definition: rbtree.c:255
    SCIP_RBTREENODE * child[2]
    Definition: rbtree.h:47
    uintptr_t parent
    Definition: rbtree.h:46
    type definitions for miscellaneous datastructures