1*d6b92ffaSHans Petter Selasky /* 2*d6b92ffaSHans Petter Selasky * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. 3*d6b92ffaSHans Petter Selasky * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. 4*d6b92ffaSHans Petter Selasky * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5*d6b92ffaSHans Petter Selasky * 6*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 7*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 8*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 9*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 10*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 11*d6b92ffaSHans Petter Selasky * 12*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 13*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 14*d6b92ffaSHans Petter Selasky * conditions are met: 15*d6b92ffaSHans Petter Selasky * 16*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 17*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 18*d6b92ffaSHans Petter Selasky * disclaimer. 19*d6b92ffaSHans Petter Selasky * 20*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 21*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 22*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 23*d6b92ffaSHans Petter Selasky * provided with the distribution. 24*d6b92ffaSHans Petter Selasky * 25*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*d6b92ffaSHans Petter Selasky * SOFTWARE. 33*d6b92ffaSHans Petter Selasky * 34*d6b92ffaSHans Petter Selasky */ 35*d6b92ffaSHans Petter Selasky 36*d6b92ffaSHans Petter Selasky /* 37*d6b92ffaSHans Petter Selasky * Abstract: 38*d6b92ffaSHans Petter Selasky * Declaration of quick map, a binary tree where the caller always provides 39*d6b92ffaSHans Petter Selasky * all necessary storage. 40*d6b92ffaSHans Petter Selasky */ 41*d6b92ffaSHans Petter Selasky 42*d6b92ffaSHans Petter Selasky #ifndef _CL_QMAP_H_ 43*d6b92ffaSHans Petter Selasky #define _CL_QMAP_H_ 44*d6b92ffaSHans Petter Selasky 45*d6b92ffaSHans Petter Selasky #include <complib/cl_qpool.h> 46*d6b92ffaSHans Petter Selasky 47*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 48*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS extern "C" { 49*d6b92ffaSHans Petter Selasky # define END_C_DECLS } 50*d6b92ffaSHans Petter Selasky #else /* !__cplusplus */ 51*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS 52*d6b92ffaSHans Petter Selasky # define END_C_DECLS 53*d6b92ffaSHans Petter Selasky #endif /* __cplusplus */ 54*d6b92ffaSHans Petter Selasky 55*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS 56*d6b92ffaSHans Petter Selasky /****h* Component Library/Quick Map 57*d6b92ffaSHans Petter Selasky * NAME 58*d6b92ffaSHans Petter Selasky * Quick Map 59*d6b92ffaSHans Petter Selasky * 60*d6b92ffaSHans Petter Selasky * DESCRIPTION 61*d6b92ffaSHans Petter Selasky * Quick map implements a binary tree that stores user provided cl_map_item_t 62*d6b92ffaSHans Petter Selasky * structures. Each item stored in a quick map has a unique 64-bit key 63*d6b92ffaSHans Petter Selasky * (duplicates are not allowed). Quick map provides the ability to 64*d6b92ffaSHans Petter Selasky * efficiently search for an item given a key. 65*d6b92ffaSHans Petter Selasky * 66*d6b92ffaSHans Petter Selasky * Quick map does not allocate any memory, and can therefore not fail 67*d6b92ffaSHans Petter Selasky * any operations due to insufficient memory. Quick map can thus be useful 68*d6b92ffaSHans Petter Selasky * in minimizing the error paths in code. 69*d6b92ffaSHans Petter Selasky * 70*d6b92ffaSHans Petter Selasky * Quick map is not thread safe, and users must provide serialization when 71*d6b92ffaSHans Petter Selasky * adding and removing items from the map. 72*d6b92ffaSHans Petter Selasky * 73*d6b92ffaSHans Petter Selasky * The quick map functions operate on a cl_qmap_t structure which should be 74*d6b92ffaSHans Petter Selasky * treated as opaque and should be manipulated only through the provided 75*d6b92ffaSHans Petter Selasky * functions. 76*d6b92ffaSHans Petter Selasky * 77*d6b92ffaSHans Petter Selasky * SEE ALSO 78*d6b92ffaSHans Petter Selasky * Structures: 79*d6b92ffaSHans Petter Selasky * cl_qmap_t, cl_map_item_t, cl_map_obj_t 80*d6b92ffaSHans Petter Selasky * 81*d6b92ffaSHans Petter Selasky * Callbacks: 82*d6b92ffaSHans Petter Selasky * cl_pfn_qmap_apply_t 83*d6b92ffaSHans Petter Selasky * 84*d6b92ffaSHans Petter Selasky * Item Manipulation: 85*d6b92ffaSHans Petter Selasky * cl_qmap_set_obj, cl_qmap_obj, cl_qmap_key 86*d6b92ffaSHans Petter Selasky * 87*d6b92ffaSHans Petter Selasky * Initialization: 88*d6b92ffaSHans Petter Selasky * cl_qmap_init 89*d6b92ffaSHans Petter Selasky * 90*d6b92ffaSHans Petter Selasky * Iteration: 91*d6b92ffaSHans Petter Selasky * cl_qmap_end, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_prev 92*d6b92ffaSHans Petter Selasky * 93*d6b92ffaSHans Petter Selasky * Manipulation: 94*d6b92ffaSHans Petter Selasky * cl_qmap_insert, cl_qmap_get, cl_qmap_remove_item, cl_qmap_remove, 95*d6b92ffaSHans Petter Selasky * cl_qmap_remove_all, cl_qmap_merge, cl_qmap_delta, cl_qmap_get_next 96*d6b92ffaSHans Petter Selasky * 97*d6b92ffaSHans Petter Selasky * Search: 98*d6b92ffaSHans Petter Selasky * cl_qmap_apply_func 99*d6b92ffaSHans Petter Selasky * 100*d6b92ffaSHans Petter Selasky * Attributes: 101*d6b92ffaSHans Petter Selasky * cl_qmap_count, cl_is_qmap_empty, 102*d6b92ffaSHans Petter Selasky *********/ 103*d6b92ffaSHans Petter Selasky /****i* Component Library: Quick Map/cl_map_color_t 104*d6b92ffaSHans Petter Selasky * NAME 105*d6b92ffaSHans Petter Selasky * cl_map_color_t 106*d6b92ffaSHans Petter Selasky * 107*d6b92ffaSHans Petter Selasky * DESCRIPTION 108*d6b92ffaSHans Petter Selasky * The cl_map_color_t enumerated type is used to note the color of 109*d6b92ffaSHans Petter Selasky * nodes in a map. 110*d6b92ffaSHans Petter Selasky * 111*d6b92ffaSHans Petter Selasky * SYNOPSIS 112*d6b92ffaSHans Petter Selasky */ 113*d6b92ffaSHans Petter Selasky typedef enum _cl_map_color { 114*d6b92ffaSHans Petter Selasky CL_MAP_RED, 115*d6b92ffaSHans Petter Selasky CL_MAP_BLACK 116*d6b92ffaSHans Petter Selasky } cl_map_color_t; 117*d6b92ffaSHans Petter Selasky /* 118*d6b92ffaSHans Petter Selasky * VALUES 119*d6b92ffaSHans Petter Selasky * CL_MAP_RED 120*d6b92ffaSHans Petter Selasky * The node in the map is red. 121*d6b92ffaSHans Petter Selasky * 122*d6b92ffaSHans Petter Selasky * CL_MAP_BLACK 123*d6b92ffaSHans Petter Selasky * The node in the map is black. 124*d6b92ffaSHans Petter Selasky * 125*d6b92ffaSHans Petter Selasky * SEE ALSO 126*d6b92ffaSHans Petter Selasky * Quick Map, cl_map_item_t 127*d6b92ffaSHans Petter Selasky *********/ 128*d6b92ffaSHans Petter Selasky 129*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_map_item_t 130*d6b92ffaSHans Petter Selasky * NAME 131*d6b92ffaSHans Petter Selasky * cl_map_item_t 132*d6b92ffaSHans Petter Selasky * 133*d6b92ffaSHans Petter Selasky * DESCRIPTION 134*d6b92ffaSHans Petter Selasky * The cl_map_item_t structure is used by maps to store objects. 135*d6b92ffaSHans Petter Selasky * 136*d6b92ffaSHans Petter Selasky * The cl_map_item_t structure should be treated as opaque and should 137*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions. 138*d6b92ffaSHans Petter Selasky * 139*d6b92ffaSHans Petter Selasky * SYNOPSIS 140*d6b92ffaSHans Petter Selasky */ 141*d6b92ffaSHans Petter Selasky typedef struct _cl_map_item { 142*d6b92ffaSHans Petter Selasky /* Must be first to allow casting. */ 143*d6b92ffaSHans Petter Selasky cl_pool_item_t pool_item; 144*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_left; 145*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_right; 146*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_up; 147*d6b92ffaSHans Petter Selasky cl_map_color_t color; 148*d6b92ffaSHans Petter Selasky uint64_t key; 149*d6b92ffaSHans Petter Selasky #ifdef _DEBUG_ 150*d6b92ffaSHans Petter Selasky struct _cl_qmap *p_map; 151*d6b92ffaSHans Petter Selasky #endif 152*d6b92ffaSHans Petter Selasky } cl_map_item_t; 153*d6b92ffaSHans Petter Selasky /* 154*d6b92ffaSHans Petter Selasky * FIELDS 155*d6b92ffaSHans Petter Selasky * pool_item 156*d6b92ffaSHans Petter Selasky * Used to store the item in a doubly linked list, allowing more 157*d6b92ffaSHans Petter Selasky * efficient map traversal. 158*d6b92ffaSHans Petter Selasky * 159*d6b92ffaSHans Petter Selasky * p_left 160*d6b92ffaSHans Petter Selasky * Pointer to the map item that is a child to the left of the node. 161*d6b92ffaSHans Petter Selasky * 162*d6b92ffaSHans Petter Selasky * p_right 163*d6b92ffaSHans Petter Selasky * Pointer to the map item that is a child to the right of the node. 164*d6b92ffaSHans Petter Selasky * 165*d6b92ffaSHans Petter Selasky * p_up 166*d6b92ffaSHans Petter Selasky * Pointer to the map item that is the parent of the node. 167*d6b92ffaSHans Petter Selasky * 168*d6b92ffaSHans Petter Selasky * p_nil 169*d6b92ffaSHans Petter Selasky * Pointer to the map's NIL item, used as a terminator for leaves. 170*d6b92ffaSHans Petter Selasky * The NIL sentinel is in the cl_qmap_t structure. 171*d6b92ffaSHans Petter Selasky * 172*d6b92ffaSHans Petter Selasky * color 173*d6b92ffaSHans Petter Selasky * Indicates whether a node is red or black in the map. 174*d6b92ffaSHans Petter Selasky * 175*d6b92ffaSHans Petter Selasky * key 176*d6b92ffaSHans Petter Selasky * Value that uniquely represents a node in a map. This value is 177*d6b92ffaSHans Petter Selasky * set by calling cl_qmap_insert and can be retrieved by calling 178*d6b92ffaSHans Petter Selasky * cl_qmap_key. 179*d6b92ffaSHans Petter Selasky * 180*d6b92ffaSHans Petter Selasky * NOTES 181*d6b92ffaSHans Petter Selasky * None of the fields of this structure should be manipulated by users, as 182*d6b92ffaSHans Petter Selasky * they are crititcal to the proper operation of the map in which they 183*d6b92ffaSHans Petter Selasky * are stored. 184*d6b92ffaSHans Petter Selasky * 185*d6b92ffaSHans Petter Selasky * To allow storing items in either a quick list, a quick pool, or a quick 186*d6b92ffaSHans Petter Selasky * map, the map implementation guarantees that the map item can be safely 187*d6b92ffaSHans Petter Selasky * cast to a pool item used for storing an object in a quick pool, or cast 188*d6b92ffaSHans Petter Selasky * to a list item used for storing an object in a quick list. This removes 189*d6b92ffaSHans Petter Selasky * the need to embed a map item, a list item, and a pool item in objects 190*d6b92ffaSHans Petter Selasky * that need to be stored in a quick list, a quick pool, and a quick map. 191*d6b92ffaSHans Petter Selasky * 192*d6b92ffaSHans Petter Selasky * SEE ALSO 193*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert, cl_qmap_key, cl_pool_item_t, cl_list_item_t 194*d6b92ffaSHans Petter Selasky *********/ 195*d6b92ffaSHans Petter Selasky 196*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_map_obj_t 197*d6b92ffaSHans Petter Selasky * NAME 198*d6b92ffaSHans Petter Selasky * cl_map_obj_t 199*d6b92ffaSHans Petter Selasky * 200*d6b92ffaSHans Petter Selasky * DESCRIPTION 201*d6b92ffaSHans Petter Selasky * The cl_map_obj_t structure is used to store objects in maps. 202*d6b92ffaSHans Petter Selasky * 203*d6b92ffaSHans Petter Selasky * The cl_map_obj_t structure should be treated as opaque and should 204*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions. 205*d6b92ffaSHans Petter Selasky * 206*d6b92ffaSHans Petter Selasky * SYNOPSIS 207*d6b92ffaSHans Petter Selasky */ 208*d6b92ffaSHans Petter Selasky typedef struct _cl_map_obj { 209*d6b92ffaSHans Petter Selasky cl_map_item_t item; 210*d6b92ffaSHans Petter Selasky const void *p_object; 211*d6b92ffaSHans Petter Selasky } cl_map_obj_t; 212*d6b92ffaSHans Petter Selasky /* 213*d6b92ffaSHans Petter Selasky * FIELDS 214*d6b92ffaSHans Petter Selasky * item 215*d6b92ffaSHans Petter Selasky * Map item used by internally by the map to store an object. 216*d6b92ffaSHans Petter Selasky * 217*d6b92ffaSHans Petter Selasky * p_object 218*d6b92ffaSHans Petter Selasky * User defined context. Users should not access this field directly. 219*d6b92ffaSHans Petter Selasky * Use cl_qmap_set_obj and cl_qmap_obj to set and retrieve the value 220*d6b92ffaSHans Petter Selasky * of this field. 221*d6b92ffaSHans Petter Selasky * 222*d6b92ffaSHans Petter Selasky * NOTES 223*d6b92ffaSHans Petter Selasky * None of the fields of this structure should be manipulated by users, as 224*d6b92ffaSHans Petter Selasky * they are crititcal to the proper operation of the map in which they 225*d6b92ffaSHans Petter Selasky * are stored. 226*d6b92ffaSHans Petter Selasky * 227*d6b92ffaSHans Petter Selasky * Use cl_qmap_set_obj and cl_qmap_obj to set and retrieve the object 228*d6b92ffaSHans Petter Selasky * stored in a map item, respectively. 229*d6b92ffaSHans Petter Selasky * 230*d6b92ffaSHans Petter Selasky * SEE ALSO 231*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_set_obj, cl_qmap_obj, cl_map_item_t 232*d6b92ffaSHans Petter Selasky *********/ 233*d6b92ffaSHans Petter Selasky 234*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_qmap_t 235*d6b92ffaSHans Petter Selasky * NAME 236*d6b92ffaSHans Petter Selasky * cl_qmap_t 237*d6b92ffaSHans Petter Selasky * 238*d6b92ffaSHans Petter Selasky * DESCRIPTION 239*d6b92ffaSHans Petter Selasky * Quick map structure. 240*d6b92ffaSHans Petter Selasky * 241*d6b92ffaSHans Petter Selasky * The cl_qmap_t structure should be treated as opaque and should 242*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions. 243*d6b92ffaSHans Petter Selasky * 244*d6b92ffaSHans Petter Selasky * SYNOPSIS 245*d6b92ffaSHans Petter Selasky */ 246*d6b92ffaSHans Petter Selasky typedef struct _cl_qmap { 247*d6b92ffaSHans Petter Selasky cl_map_item_t root; 248*d6b92ffaSHans Petter Selasky cl_map_item_t nil; 249*d6b92ffaSHans Petter Selasky cl_state_t state; 250*d6b92ffaSHans Petter Selasky size_t count; 251*d6b92ffaSHans Petter Selasky } cl_qmap_t; 252*d6b92ffaSHans Petter Selasky /* 253*d6b92ffaSHans Petter Selasky * PARAMETERS 254*d6b92ffaSHans Petter Selasky * root 255*d6b92ffaSHans Petter Selasky * Map item that serves as root of the map. The root is set up to 256*d6b92ffaSHans Petter Selasky * always have itself as parent. The left pointer is set to point 257*d6b92ffaSHans Petter Selasky * to the item at the root. 258*d6b92ffaSHans Petter Selasky * 259*d6b92ffaSHans Petter Selasky * nil 260*d6b92ffaSHans Petter Selasky * Map item that serves as terminator for all leaves, as well as 261*d6b92ffaSHans Petter Selasky * providing the list item used as quick list for storing map items 262*d6b92ffaSHans Petter Selasky * in a list for faster traversal. 263*d6b92ffaSHans Petter Selasky * 264*d6b92ffaSHans Petter Selasky * state 265*d6b92ffaSHans Petter Selasky * State of the map, used to verify that operations are permitted. 266*d6b92ffaSHans Petter Selasky * 267*d6b92ffaSHans Petter Selasky * count 268*d6b92ffaSHans Petter Selasky * Number of items in the map. 269*d6b92ffaSHans Petter Selasky * 270*d6b92ffaSHans Petter Selasky * SEE ALSO 271*d6b92ffaSHans Petter Selasky * Quick Map 272*d6b92ffaSHans Petter Selasky *********/ 273*d6b92ffaSHans Petter Selasky 274*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Map/cl_pfn_qmap_apply_t 275*d6b92ffaSHans Petter Selasky * NAME 276*d6b92ffaSHans Petter Selasky * cl_pfn_qmap_apply_t 277*d6b92ffaSHans Petter Selasky * 278*d6b92ffaSHans Petter Selasky * DESCRIPTION 279*d6b92ffaSHans Petter Selasky * The cl_pfn_qmap_apply_t function type defines the prototype for 280*d6b92ffaSHans Petter Selasky * functions used to iterate items in a quick map. 281*d6b92ffaSHans Petter Selasky * 282*d6b92ffaSHans Petter Selasky * SYNOPSIS 283*d6b92ffaSHans Petter Selasky */ 284*d6b92ffaSHans Petter Selasky typedef void 285*d6b92ffaSHans Petter Selasky (*cl_pfn_qmap_apply_t) (IN cl_map_item_t * const p_map_item, IN void *context); 286*d6b92ffaSHans Petter Selasky /* 287*d6b92ffaSHans Petter Selasky * PARAMETERS 288*d6b92ffaSHans Petter Selasky * p_map_item 289*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_item_t structure. 290*d6b92ffaSHans Petter Selasky * 291*d6b92ffaSHans Petter Selasky * context 292*d6b92ffaSHans Petter Selasky * [in] Value passed to the callback function. 293*d6b92ffaSHans Petter Selasky * 294*d6b92ffaSHans Petter Selasky * RETURN VALUE 295*d6b92ffaSHans Petter Selasky * This function does not return a value. 296*d6b92ffaSHans Petter Selasky * 297*d6b92ffaSHans Petter Selasky * NOTES 298*d6b92ffaSHans Petter Selasky * This function type is provided as function prototype reference for the 299*d6b92ffaSHans Petter Selasky * function provided by users as a parameter to the cl_qmap_apply_func 300*d6b92ffaSHans Petter Selasky * function. 301*d6b92ffaSHans Petter Selasky * 302*d6b92ffaSHans Petter Selasky * SEE ALSO 303*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_apply_func 304*d6b92ffaSHans Petter Selasky *********/ 305*d6b92ffaSHans Petter Selasky 306*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_count 307*d6b92ffaSHans Petter Selasky * NAME 308*d6b92ffaSHans Petter Selasky * cl_qmap_count 309*d6b92ffaSHans Petter Selasky * 310*d6b92ffaSHans Petter Selasky * DESCRIPTION 311*d6b92ffaSHans Petter Selasky * The cl_qmap_count function returns the number of items stored 312*d6b92ffaSHans Petter Selasky * in a quick map. 313*d6b92ffaSHans Petter Selasky * 314*d6b92ffaSHans Petter Selasky * SYNOPSIS 315*d6b92ffaSHans Petter Selasky */ 316*d6b92ffaSHans Petter Selasky static inline uint32_t cl_qmap_count(IN const cl_qmap_t * const p_map) 317*d6b92ffaSHans Petter Selasky { 318*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 319*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 320*d6b92ffaSHans Petter Selasky return ((uint32_t) p_map->count); 321*d6b92ffaSHans Petter Selasky } 322*d6b92ffaSHans Petter Selasky 323*d6b92ffaSHans Petter Selasky /* 324*d6b92ffaSHans Petter Selasky * PARAMETERS 325*d6b92ffaSHans Petter Selasky * p_map 326*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item count to return. 327*d6b92ffaSHans Petter Selasky * 328*d6b92ffaSHans Petter Selasky * RETURN VALUE 329*d6b92ffaSHans Petter Selasky * Returns the number of items stored in the map. 330*d6b92ffaSHans Petter Selasky * 331*d6b92ffaSHans Petter Selasky * SEE ALSO 332*d6b92ffaSHans Petter Selasky * Quick Map, cl_is_qmap_empty 333*d6b92ffaSHans Petter Selasky *********/ 334*d6b92ffaSHans Petter Selasky 335*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_is_qmap_empty 336*d6b92ffaSHans Petter Selasky * NAME 337*d6b92ffaSHans Petter Selasky * cl_is_qmap_empty 338*d6b92ffaSHans Petter Selasky * 339*d6b92ffaSHans Petter Selasky * DESCRIPTION 340*d6b92ffaSHans Petter Selasky * The cl_is_qmap_empty function returns whether a quick map is empty. 341*d6b92ffaSHans Petter Selasky * 342*d6b92ffaSHans Petter Selasky * SYNOPSIS 343*d6b92ffaSHans Petter Selasky */ 344*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_qmap_empty(IN const cl_qmap_t * const p_map) 345*d6b92ffaSHans Petter Selasky { 346*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 347*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 348*d6b92ffaSHans Petter Selasky 349*d6b92ffaSHans Petter Selasky return (p_map->count == 0); 350*d6b92ffaSHans Petter Selasky } 351*d6b92ffaSHans Petter Selasky 352*d6b92ffaSHans Petter Selasky /* 353*d6b92ffaSHans Petter Selasky * PARAMETERS 354*d6b92ffaSHans Petter Selasky * p_map 355*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to test for emptiness. 356*d6b92ffaSHans Petter Selasky * 357*d6b92ffaSHans Petter Selasky * RETURN VALUES 358*d6b92ffaSHans Petter Selasky * TRUE if the quick map is empty. 359*d6b92ffaSHans Petter Selasky * 360*d6b92ffaSHans Petter Selasky * FALSE otherwise. 361*d6b92ffaSHans Petter Selasky * 362*d6b92ffaSHans Petter Selasky * SEE ALSO 363*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_count, cl_qmap_remove_all 364*d6b92ffaSHans Petter Selasky *********/ 365*d6b92ffaSHans Petter Selasky 366*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_set_obj 367*d6b92ffaSHans Petter Selasky * NAME 368*d6b92ffaSHans Petter Selasky * cl_qmap_set_obj 369*d6b92ffaSHans Petter Selasky * 370*d6b92ffaSHans Petter Selasky * DESCRIPTION 371*d6b92ffaSHans Petter Selasky * The cl_qmap_set_obj function sets the object stored in a map object. 372*d6b92ffaSHans Petter Selasky * 373*d6b92ffaSHans Petter Selasky * SYNOPSIS 374*d6b92ffaSHans Petter Selasky */ 375*d6b92ffaSHans Petter Selasky static inline void 376*d6b92ffaSHans Petter Selasky cl_qmap_set_obj(IN cl_map_obj_t * const p_map_obj, 377*d6b92ffaSHans Petter Selasky IN const void *const p_object) 378*d6b92ffaSHans Petter Selasky { 379*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map_obj); 380*d6b92ffaSHans Petter Selasky p_map_obj->p_object = p_object; 381*d6b92ffaSHans Petter Selasky } 382*d6b92ffaSHans Petter Selasky 383*d6b92ffaSHans Petter Selasky /* 384*d6b92ffaSHans Petter Selasky * PARAMETERS 385*d6b92ffaSHans Petter Selasky * p_map_obj 386*d6b92ffaSHans Petter Selasky * [in] Pointer to a map object stucture whose object pointer 387*d6b92ffaSHans Petter Selasky * is to be set. 388*d6b92ffaSHans Petter Selasky * 389*d6b92ffaSHans Petter Selasky * p_object 390*d6b92ffaSHans Petter Selasky * [in] User defined context. 391*d6b92ffaSHans Petter Selasky * 392*d6b92ffaSHans Petter Selasky * RETURN VALUE 393*d6b92ffaSHans Petter Selasky * This function does not return a value. 394*d6b92ffaSHans Petter Selasky * 395*d6b92ffaSHans Petter Selasky * SEE ALSO 396*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_obj 397*d6b92ffaSHans Petter Selasky *********/ 398*d6b92ffaSHans Petter Selasky 399*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_obj 400*d6b92ffaSHans Petter Selasky * NAME 401*d6b92ffaSHans Petter Selasky * cl_qmap_obj 402*d6b92ffaSHans Petter Selasky * 403*d6b92ffaSHans Petter Selasky * DESCRIPTION 404*d6b92ffaSHans Petter Selasky * The cl_qmap_obj function returns the object stored in a map object. 405*d6b92ffaSHans Petter Selasky * 406*d6b92ffaSHans Petter Selasky * SYNOPSIS 407*d6b92ffaSHans Petter Selasky */ 408*d6b92ffaSHans Petter Selasky static inline void *cl_qmap_obj(IN const cl_map_obj_t * const p_map_obj) 409*d6b92ffaSHans Petter Selasky { 410*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map_obj); 411*d6b92ffaSHans Petter Selasky return ((void *)p_map_obj->p_object); 412*d6b92ffaSHans Petter Selasky } 413*d6b92ffaSHans Petter Selasky 414*d6b92ffaSHans Petter Selasky /* 415*d6b92ffaSHans Petter Selasky * PARAMETERS 416*d6b92ffaSHans Petter Selasky * p_map_obj 417*d6b92ffaSHans Petter Selasky * [in] Pointer to a map object stucture whose object pointer to return. 418*d6b92ffaSHans Petter Selasky * 419*d6b92ffaSHans Petter Selasky * RETURN VALUE 420*d6b92ffaSHans Petter Selasky * Returns the value of the object pointer stored in the map object. 421*d6b92ffaSHans Petter Selasky * 422*d6b92ffaSHans Petter Selasky * SEE ALSO 423*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_set_obj 424*d6b92ffaSHans Petter Selasky *********/ 425*d6b92ffaSHans Petter Selasky 426*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_key 427*d6b92ffaSHans Petter Selasky * NAME 428*d6b92ffaSHans Petter Selasky * cl_qmap_key 429*d6b92ffaSHans Petter Selasky * 430*d6b92ffaSHans Petter Selasky * DESCRIPTION 431*d6b92ffaSHans Petter Selasky * The cl_qmap_key function retrieves the key value of a map item. 432*d6b92ffaSHans Petter Selasky * 433*d6b92ffaSHans Petter Selasky * SYNOPSIS 434*d6b92ffaSHans Petter Selasky */ 435*d6b92ffaSHans Petter Selasky static inline uint64_t cl_qmap_key(IN const cl_map_item_t * const p_item) 436*d6b92ffaSHans Petter Selasky { 437*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item); 438*d6b92ffaSHans Petter Selasky return (p_item->key); 439*d6b92ffaSHans Petter Selasky } 440*d6b92ffaSHans Petter Selasky 441*d6b92ffaSHans Petter Selasky /* 442*d6b92ffaSHans Petter Selasky * PARAMETERS 443*d6b92ffaSHans Petter Selasky * p_item 444*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose key value to return. 445*d6b92ffaSHans Petter Selasky * 446*d6b92ffaSHans Petter Selasky * RETURN VALUE 447*d6b92ffaSHans Petter Selasky * Returns the 64-bit key value for the specified map item. 448*d6b92ffaSHans Petter Selasky * 449*d6b92ffaSHans Petter Selasky * NOTES 450*d6b92ffaSHans Petter Selasky * The key value is set in a call to cl_qmap_insert. 451*d6b92ffaSHans Petter Selasky * 452*d6b92ffaSHans Petter Selasky * SEE ALSO 453*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert 454*d6b92ffaSHans Petter Selasky *********/ 455*d6b92ffaSHans Petter Selasky 456*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_init 457*d6b92ffaSHans Petter Selasky * NAME 458*d6b92ffaSHans Petter Selasky * cl_qmap_init 459*d6b92ffaSHans Petter Selasky * 460*d6b92ffaSHans Petter Selasky * DESCRIPTION 461*d6b92ffaSHans Petter Selasky * The cl_qmap_init function initialized a quick map for use. 462*d6b92ffaSHans Petter Selasky * 463*d6b92ffaSHans Petter Selasky * SYNOPSIS 464*d6b92ffaSHans Petter Selasky */ 465*d6b92ffaSHans Petter Selasky void cl_qmap_init(IN cl_qmap_t * const p_map); 466*d6b92ffaSHans Petter Selasky /* 467*d6b92ffaSHans Petter Selasky * PARAMETERS 468*d6b92ffaSHans Petter Selasky * p_map 469*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to initialize. 470*d6b92ffaSHans Petter Selasky * 471*d6b92ffaSHans Petter Selasky * RETURN VALUES 472*d6b92ffaSHans Petter Selasky * This function does not return a value. 473*d6b92ffaSHans Petter Selasky * 474*d6b92ffaSHans Petter Selasky * NOTES 475*d6b92ffaSHans Petter Selasky * Allows calling quick map manipulation functions. 476*d6b92ffaSHans Petter Selasky * 477*d6b92ffaSHans Petter Selasky * SEE ALSO 478*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert, cl_qmap_remove 479*d6b92ffaSHans Petter Selasky *********/ 480*d6b92ffaSHans Petter Selasky 481*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_end 482*d6b92ffaSHans Petter Selasky * NAME 483*d6b92ffaSHans Petter Selasky * cl_qmap_end 484*d6b92ffaSHans Petter Selasky * 485*d6b92ffaSHans Petter Selasky * DESCRIPTION 486*d6b92ffaSHans Petter Selasky * The cl_qmap_end function returns the end of a quick map. 487*d6b92ffaSHans Petter Selasky * 488*d6b92ffaSHans Petter Selasky * SYNOPSIS 489*d6b92ffaSHans Petter Selasky */ 490*d6b92ffaSHans Petter Selasky static inline const cl_map_item_t *cl_qmap_end(IN const cl_qmap_t * const p_map) 491*d6b92ffaSHans Petter Selasky { 492*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 493*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 494*d6b92ffaSHans Petter Selasky /* Nil is the end of the map. */ 495*d6b92ffaSHans Petter Selasky return (&p_map->nil); 496*d6b92ffaSHans Petter Selasky } 497*d6b92ffaSHans Petter Selasky 498*d6b92ffaSHans Petter Selasky /* 499*d6b92ffaSHans Petter Selasky * PARAMETERS 500*d6b92ffaSHans Petter Selasky * p_map 501*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose end to return. 502*d6b92ffaSHans Petter Selasky * 503*d6b92ffaSHans Petter Selasky * RETURN VALUE 504*d6b92ffaSHans Petter Selasky * Pointer to the end of the map. 505*d6b92ffaSHans Petter Selasky * 506*d6b92ffaSHans Petter Selasky * NOTES 507*d6b92ffaSHans Petter Selasky * cl_qmap_end is useful for determining the validity of map items returned 508*d6b92ffaSHans Petter Selasky * by cl_qmap_head, cl_qmap_tail, cl_qmap_next, or cl_qmap_prev. If the 509*d6b92ffaSHans Petter Selasky * map item pointer returned by any of these functions compares to the end, 510*d6b92ffaSHans Petter Selasky * the end of the map was encoutered. 511*d6b92ffaSHans Petter Selasky * When using cl_qmap_head or cl_qmap_tail, this condition indicates that 512*d6b92ffaSHans Petter Selasky * the map is empty. 513*d6b92ffaSHans Petter Selasky * 514*d6b92ffaSHans Petter Selasky * SEE ALSO 515*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_prev 516*d6b92ffaSHans Petter Selasky *********/ 517*d6b92ffaSHans Petter Selasky 518*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_head 519*d6b92ffaSHans Petter Selasky * NAME 520*d6b92ffaSHans Petter Selasky * cl_qmap_head 521*d6b92ffaSHans Petter Selasky * 522*d6b92ffaSHans Petter Selasky * DESCRIPTION 523*d6b92ffaSHans Petter Selasky * The cl_qmap_head function returns the map item with the lowest key 524*d6b92ffaSHans Petter Selasky * value stored in a quick map. 525*d6b92ffaSHans Petter Selasky * 526*d6b92ffaSHans Petter Selasky * SYNOPSIS 527*d6b92ffaSHans Petter Selasky */ 528*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_head(IN const cl_qmap_t * const p_map) 529*d6b92ffaSHans Petter Selasky { 530*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 531*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 532*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_map->nil.pool_item.list_item.p_next); 533*d6b92ffaSHans Petter Selasky } 534*d6b92ffaSHans Petter Selasky 535*d6b92ffaSHans Petter Selasky /* 536*d6b92ffaSHans Petter Selasky * PARAMETERS 537*d6b92ffaSHans Petter Selasky * p_map 538*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item with the lowest 539*d6b92ffaSHans Petter Selasky * key is returned. 540*d6b92ffaSHans Petter Selasky * 541*d6b92ffaSHans Petter Selasky * RETURN VALUES 542*d6b92ffaSHans Petter Selasky * Pointer to the map item with the lowest key in the quick map. 543*d6b92ffaSHans Petter Selasky * 544*d6b92ffaSHans Petter Selasky * Pointer to the map end if the quick map was empty. 545*d6b92ffaSHans Petter Selasky * 546*d6b92ffaSHans Petter Selasky * NOTES 547*d6b92ffaSHans Petter Selasky * cl_qmap_head does not remove the item from the map. 548*d6b92ffaSHans Petter Selasky * 549*d6b92ffaSHans Petter Selasky * SEE ALSO 550*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_tail, cl_qmap_next, cl_qmap_prev, cl_qmap_end, 551*d6b92ffaSHans Petter Selasky * cl_qmap_item_t 552*d6b92ffaSHans Petter Selasky *********/ 553*d6b92ffaSHans Petter Selasky 554*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_tail 555*d6b92ffaSHans Petter Selasky * NAME 556*d6b92ffaSHans Petter Selasky * cl_qmap_tail 557*d6b92ffaSHans Petter Selasky * 558*d6b92ffaSHans Petter Selasky * DESCRIPTION 559*d6b92ffaSHans Petter Selasky * The cl_qmap_tail function returns the map item with the highest key 560*d6b92ffaSHans Petter Selasky * value stored in a quick map. 561*d6b92ffaSHans Petter Selasky * 562*d6b92ffaSHans Petter Selasky * SYNOPSIS 563*d6b92ffaSHans Petter Selasky */ 564*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_tail(IN const cl_qmap_t * const p_map) 565*d6b92ffaSHans Petter Selasky { 566*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 567*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 568*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_map->nil.pool_item.list_item.p_prev); 569*d6b92ffaSHans Petter Selasky } 570*d6b92ffaSHans Petter Selasky 571*d6b92ffaSHans Petter Selasky /* 572*d6b92ffaSHans Petter Selasky * PARAMETERS 573*d6b92ffaSHans Petter Selasky * p_map 574*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item with the 575*d6b92ffaSHans Petter Selasky * highest key is returned. 576*d6b92ffaSHans Petter Selasky * 577*d6b92ffaSHans Petter Selasky * RETURN VALUES 578*d6b92ffaSHans Petter Selasky * Pointer to the map item with the highest key in the quick map. 579*d6b92ffaSHans Petter Selasky * 580*d6b92ffaSHans Petter Selasky * Pointer to the map end if the quick map was empty. 581*d6b92ffaSHans Petter Selasky * 582*d6b92ffaSHans Petter Selasky * NOTES 583*d6b92ffaSHans Petter Selasky * cl_qmap_end does not remove the item from the map. 584*d6b92ffaSHans Petter Selasky * 585*d6b92ffaSHans Petter Selasky * SEE ALSO 586*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_next, cl_qmap_prev, cl_qmap_end, 587*d6b92ffaSHans Petter Selasky * cl_qmap_item_t 588*d6b92ffaSHans Petter Selasky *********/ 589*d6b92ffaSHans Petter Selasky 590*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_next 591*d6b92ffaSHans Petter Selasky * NAME 592*d6b92ffaSHans Petter Selasky * cl_qmap_next 593*d6b92ffaSHans Petter Selasky * 594*d6b92ffaSHans Petter Selasky * DESCRIPTION 595*d6b92ffaSHans Petter Selasky * The cl_qmap_next function returns the map item with the next higher 596*d6b92ffaSHans Petter Selasky * key value than a specified map item. 597*d6b92ffaSHans Petter Selasky * 598*d6b92ffaSHans Petter Selasky * SYNOPSIS 599*d6b92ffaSHans Petter Selasky */ 600*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_next(IN const cl_map_item_t * const p_item) 601*d6b92ffaSHans Petter Selasky { 602*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item); 603*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_item->pool_item.list_item.p_next); 604*d6b92ffaSHans Petter Selasky } 605*d6b92ffaSHans Petter Selasky 606*d6b92ffaSHans Petter Selasky /* 607*d6b92ffaSHans Petter Selasky * PARAMETERS 608*d6b92ffaSHans Petter Selasky * p_item 609*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose successor to return. 610*d6b92ffaSHans Petter Selasky * 611*d6b92ffaSHans Petter Selasky * RETURN VALUES 612*d6b92ffaSHans Petter Selasky * Pointer to the map item with the next higher key value in a quick map. 613*d6b92ffaSHans Petter Selasky * 614*d6b92ffaSHans Petter Selasky * Pointer to the map end if the specified item was the last item in 615*d6b92ffaSHans Petter Selasky * the quick map. 616*d6b92ffaSHans Petter Selasky * 617*d6b92ffaSHans Petter Selasky * SEE ALSO 618*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_prev, cl_qmap_end, 619*d6b92ffaSHans Petter Selasky * cl_map_item_t 620*d6b92ffaSHans Petter Selasky *********/ 621*d6b92ffaSHans Petter Selasky 622*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_prev 623*d6b92ffaSHans Petter Selasky * NAME 624*d6b92ffaSHans Petter Selasky * cl_qmap_prev 625*d6b92ffaSHans Petter Selasky * 626*d6b92ffaSHans Petter Selasky * DESCRIPTION 627*d6b92ffaSHans Petter Selasky * The cl_qmap_prev function returns the map item with the next lower 628*d6b92ffaSHans Petter Selasky * key value than a precified map item. 629*d6b92ffaSHans Petter Selasky * 630*d6b92ffaSHans Petter Selasky * SYNOPSIS 631*d6b92ffaSHans Petter Selasky */ 632*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_prev(IN const cl_map_item_t * const p_item) 633*d6b92ffaSHans Petter Selasky { 634*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item); 635*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_item->pool_item.list_item.p_prev); 636*d6b92ffaSHans Petter Selasky } 637*d6b92ffaSHans Petter Selasky 638*d6b92ffaSHans Petter Selasky /* 639*d6b92ffaSHans Petter Selasky * PARAMETERS 640*d6b92ffaSHans Petter Selasky * p_item 641*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose predecessor to return. 642*d6b92ffaSHans Petter Selasky * 643*d6b92ffaSHans Petter Selasky * RETURN VALUES 644*d6b92ffaSHans Petter Selasky * Pointer to the map item with the next lower key value in a quick map. 645*d6b92ffaSHans Petter Selasky * 646*d6b92ffaSHans Petter Selasky * Pointer to the map end if the specifid item was the first item in 647*d6b92ffaSHans Petter Selasky * the quick map. 648*d6b92ffaSHans Petter Selasky * 649*d6b92ffaSHans Petter Selasky * SEE ALSO 650*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_end, 651*d6b92ffaSHans Petter Selasky * cl_map_item_t 652*d6b92ffaSHans Petter Selasky *********/ 653*d6b92ffaSHans Petter Selasky 654*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_insert 655*d6b92ffaSHans Petter Selasky * NAME 656*d6b92ffaSHans Petter Selasky * cl_qmap_insert 657*d6b92ffaSHans Petter Selasky * 658*d6b92ffaSHans Petter Selasky * DESCRIPTION 659*d6b92ffaSHans Petter Selasky * The cl_qmap_insert function inserts a map item into a quick map. 660*d6b92ffaSHans Petter Selasky * NOTE: Only if such a key does not alerady exist in the map !!!! 661*d6b92ffaSHans Petter Selasky * 662*d6b92ffaSHans Petter Selasky * SYNOPSIS 663*d6b92ffaSHans Petter Selasky */ 664*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_insert(IN cl_qmap_t * const p_map, 665*d6b92ffaSHans Petter Selasky IN const uint64_t key, 666*d6b92ffaSHans Petter Selasky IN cl_map_item_t * const p_item); 667*d6b92ffaSHans Petter Selasky /* 668*d6b92ffaSHans Petter Selasky * PARAMETERS 669*d6b92ffaSHans Petter Selasky * p_map 670*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure into which to add the item. 671*d6b92ffaSHans Petter Selasky * 672*d6b92ffaSHans Petter Selasky * key 673*d6b92ffaSHans Petter Selasky * [in] Value to assign to the item. 674*d6b92ffaSHans Petter Selasky * 675*d6b92ffaSHans Petter Selasky * p_item 676*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_item_t stucture to insert into the quick map. 677*d6b92ffaSHans Petter Selasky * 678*d6b92ffaSHans Petter Selasky * RETURN VALUE 679*d6b92ffaSHans Petter Selasky * Pointer to the item in the map with the specified key. If insertion 680*d6b92ffaSHans Petter Selasky * was successful, this is the pointer to the item. If an item with the 681*d6b92ffaSHans Petter Selasky * specified key already exists in the map, the pointer to that item is 682*d6b92ffaSHans Petter Selasky * returned - but the new key is NOT inserted... 683*d6b92ffaSHans Petter Selasky * 684*d6b92ffaSHans Petter Selasky * NOTES 685*d6b92ffaSHans Petter Selasky * Insertion operations may cause the quick map to rebalance. 686*d6b92ffaSHans Petter Selasky * 687*d6b92ffaSHans Petter Selasky * SEE ALSO 688*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_map_item_t 689*d6b92ffaSHans Petter Selasky *********/ 690*d6b92ffaSHans Petter Selasky 691*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_get 692*d6b92ffaSHans Petter Selasky * NAME 693*d6b92ffaSHans Petter Selasky * cl_qmap_get 694*d6b92ffaSHans Petter Selasky * 695*d6b92ffaSHans Petter Selasky * DESCRIPTION 696*d6b92ffaSHans Petter Selasky * The cl_qmap_get function returns the map item associated with a key. 697*d6b92ffaSHans Petter Selasky * 698*d6b92ffaSHans Petter Selasky * SYNOPSIS 699*d6b92ffaSHans Petter Selasky */ 700*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_get(IN const cl_qmap_t * const p_map, 701*d6b92ffaSHans Petter Selasky IN const uint64_t key); 702*d6b92ffaSHans Petter Selasky /* 703*d6b92ffaSHans Petter Selasky * PARAMETERS 704*d6b92ffaSHans Petter Selasky * p_map 705*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to retrieve the 706*d6b92ffaSHans Petter Selasky * item with the specified key. 707*d6b92ffaSHans Petter Selasky * 708*d6b92ffaSHans Petter Selasky * key 709*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired map item. 710*d6b92ffaSHans Petter Selasky * 711*d6b92ffaSHans Petter Selasky * RETURN VALUES 712*d6b92ffaSHans Petter Selasky * Pointer to the map item with the desired key value. 713*d6b92ffaSHans Petter Selasky * 714*d6b92ffaSHans Petter Selasky * Pointer to the map end if there was no item with the desired key value 715*d6b92ffaSHans Petter Selasky * stored in the quick map. 716*d6b92ffaSHans Petter Selasky * 717*d6b92ffaSHans Petter Selasky * NOTES 718*d6b92ffaSHans Petter Selasky * cl_qmap_get does not remove the item from the quick map. 719*d6b92ffaSHans Petter Selasky * 720*d6b92ffaSHans Petter Selasky * SEE ALSO 721*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_get_next, cl_qmap_remove 722*d6b92ffaSHans Petter Selasky *********/ 723*d6b92ffaSHans Petter Selasky 724*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_get_next 725*d6b92ffaSHans Petter Selasky * NAME 726*d6b92ffaSHans Petter Selasky * cl_qmap_get_next 727*d6b92ffaSHans Petter Selasky * 728*d6b92ffaSHans Petter Selasky * DESCRIPTION 729*d6b92ffaSHans Petter Selasky * The cl_qmap_get_next function returns the first map item associated with a 730*d6b92ffaSHans Petter Selasky * key > the key specified. 731*d6b92ffaSHans Petter Selasky * 732*d6b92ffaSHans Petter Selasky * SYNOPSIS 733*d6b92ffaSHans Petter Selasky */ 734*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_get_next(IN const cl_qmap_t * const p_map, 735*d6b92ffaSHans Petter Selasky IN const uint64_t key); 736*d6b92ffaSHans Petter Selasky /* 737*d6b92ffaSHans Petter Selasky * PARAMETERS 738*d6b92ffaSHans Petter Selasky * p_map 739*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to retrieve the 740*d6b92ffaSHans Petter Selasky * first item with a key > the specified key. 741*d6b92ffaSHans Petter Selasky * 742*d6b92ffaSHans Petter Selasky * key 743*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired map item. 744*d6b92ffaSHans Petter Selasky * 745*d6b92ffaSHans Petter Selasky * RETURN VALUES 746*d6b92ffaSHans Petter Selasky * Pointer to the first map item with a key > the desired key value. 747*d6b92ffaSHans Petter Selasky * 748*d6b92ffaSHans Petter Selasky * Pointer to the map end if there was no item with a key > the desired key 749*d6b92ffaSHans Petter Selasky * value stored in the quick map. 750*d6b92ffaSHans Petter Selasky * 751*d6b92ffaSHans Petter Selasky * NOTES 752*d6b92ffaSHans Petter Selasky * cl_qmap_get_next does not remove the item from the quick map. 753*d6b92ffaSHans Petter Selasky * 754*d6b92ffaSHans Petter Selasky * SEE ALSO 755*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_get, cl_qmap_remove 756*d6b92ffaSHans Petter Selasky *********/ 757*d6b92ffaSHans Petter Selasky 758*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove_item 759*d6b92ffaSHans Petter Selasky * NAME 760*d6b92ffaSHans Petter Selasky * cl_qmap_remove_item 761*d6b92ffaSHans Petter Selasky * 762*d6b92ffaSHans Petter Selasky * DESCRIPTION 763*d6b92ffaSHans Petter Selasky * The cl_qmap_remove_item function removes the specified map item 764*d6b92ffaSHans Petter Selasky * from a quick map. 765*d6b92ffaSHans Petter Selasky * 766*d6b92ffaSHans Petter Selasky * SYNOPSIS 767*d6b92ffaSHans Petter Selasky */ 768*d6b92ffaSHans Petter Selasky void 769*d6b92ffaSHans Petter Selasky cl_qmap_remove_item(IN cl_qmap_t * const p_map, 770*d6b92ffaSHans Petter Selasky IN cl_map_item_t * const p_item); 771*d6b92ffaSHans Petter Selasky /* 772*d6b92ffaSHans Petter Selasky * PARAMETERS 773*d6b92ffaSHans Petter Selasky * p_item 774*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item to remove from its quick map. 775*d6b92ffaSHans Petter Selasky * 776*d6b92ffaSHans Petter Selasky * RETURN VALUES 777*d6b92ffaSHans Petter Selasky * This function does not return a value. 778*d6b92ffaSHans Petter Selasky * 779*d6b92ffaSHans Petter Selasky * In a debug build, cl_qmap_remove_item asserts that the item being removed 780*d6b92ffaSHans Petter Selasky * is in the specified map. 781*d6b92ffaSHans Petter Selasky * 782*d6b92ffaSHans Petter Selasky * NOTES 783*d6b92ffaSHans Petter Selasky * Removes the map item pointed to by p_item from its quick map. 784*d6b92ffaSHans Petter Selasky * 785*d6b92ffaSHans Petter Selasky * SEE ALSO 786*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_qmap_remove_all, cl_qmap_insert 787*d6b92ffaSHans Petter Selasky *********/ 788*d6b92ffaSHans Petter Selasky 789*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove 790*d6b92ffaSHans Petter Selasky * NAME 791*d6b92ffaSHans Petter Selasky * cl_qmap_remove 792*d6b92ffaSHans Petter Selasky * 793*d6b92ffaSHans Petter Selasky * DESCRIPTION 794*d6b92ffaSHans Petter Selasky * The cl_qmap_remove function removes the map item with the specified key 795*d6b92ffaSHans Petter Selasky * from a quick map. 796*d6b92ffaSHans Petter Selasky * 797*d6b92ffaSHans Petter Selasky * SYNOPSIS 798*d6b92ffaSHans Petter Selasky */ 799*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_remove(IN cl_qmap_t * const p_map, 800*d6b92ffaSHans Petter Selasky IN const uint64_t key); 801*d6b92ffaSHans Petter Selasky /* 802*d6b92ffaSHans Petter Selasky * PARAMETERS 803*d6b92ffaSHans Petter Selasky * p_map 804*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to remove the item 805*d6b92ffaSHans Petter Selasky * with the specified key. 806*d6b92ffaSHans Petter Selasky * 807*d6b92ffaSHans Petter Selasky * key 808*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the map item to remove. 809*d6b92ffaSHans Petter Selasky * 810*d6b92ffaSHans Petter Selasky * RETURN VALUES 811*d6b92ffaSHans Petter Selasky * Pointer to the removed map item if it was found. 812*d6b92ffaSHans Petter Selasky * 813*d6b92ffaSHans Petter Selasky * Pointer to the map end if no item with the specified key exists in the 814*d6b92ffaSHans Petter Selasky * quick map. 815*d6b92ffaSHans Petter Selasky * 816*d6b92ffaSHans Petter Selasky * SEE ALSO 817*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove_item, cl_qmap_remove_all, cl_qmap_insert 818*d6b92ffaSHans Petter Selasky *********/ 819*d6b92ffaSHans Petter Selasky 820*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove_all 821*d6b92ffaSHans Petter Selasky * NAME 822*d6b92ffaSHans Petter Selasky * cl_qmap_remove_all 823*d6b92ffaSHans Petter Selasky * 824*d6b92ffaSHans Petter Selasky * DESCRIPTION 825*d6b92ffaSHans Petter Selasky * The cl_qmap_remove_all function removes all items in a quick map, 826*d6b92ffaSHans Petter Selasky * leaving it empty. 827*d6b92ffaSHans Petter Selasky * 828*d6b92ffaSHans Petter Selasky * SYNOPSIS 829*d6b92ffaSHans Petter Selasky */ 830*d6b92ffaSHans Petter Selasky static inline void cl_qmap_remove_all(IN cl_qmap_t * const p_map) 831*d6b92ffaSHans Petter Selasky { 832*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map); 833*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED); 834*d6b92ffaSHans Petter Selasky 835*d6b92ffaSHans Petter Selasky p_map->root.p_left = &p_map->nil; 836*d6b92ffaSHans Petter Selasky p_map->nil.pool_item.list_item.p_next = &p_map->nil.pool_item.list_item; 837*d6b92ffaSHans Petter Selasky p_map->nil.pool_item.list_item.p_prev = &p_map->nil.pool_item.list_item; 838*d6b92ffaSHans Petter Selasky p_map->count = 0; 839*d6b92ffaSHans Petter Selasky } 840*d6b92ffaSHans Petter Selasky 841*d6b92ffaSHans Petter Selasky /* 842*d6b92ffaSHans Petter Selasky * PARAMETERS 843*d6b92ffaSHans Petter Selasky * p_map 844*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to empty. 845*d6b92ffaSHans Petter Selasky * 846*d6b92ffaSHans Petter Selasky * RETURN VALUES 847*d6b92ffaSHans Petter Selasky * This function does not return a value. 848*d6b92ffaSHans Petter Selasky * 849*d6b92ffaSHans Petter Selasky * SEE ALSO 850*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_qmap_remove_item 851*d6b92ffaSHans Petter Selasky *********/ 852*d6b92ffaSHans Petter Selasky 853*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_merge 854*d6b92ffaSHans Petter Selasky * NAME 855*d6b92ffaSHans Petter Selasky * cl_qmap_merge 856*d6b92ffaSHans Petter Selasky * 857*d6b92ffaSHans Petter Selasky * DESCRIPTION 858*d6b92ffaSHans Petter Selasky * The cl_qmap_merge function moves all items from one map to another, 859*d6b92ffaSHans Petter Selasky * excluding duplicates. 860*d6b92ffaSHans Petter Selasky * 861*d6b92ffaSHans Petter Selasky * SYNOPSIS 862*d6b92ffaSHans Petter Selasky */ 863*d6b92ffaSHans Petter Selasky void 864*d6b92ffaSHans Petter Selasky cl_qmap_merge(OUT cl_qmap_t * const p_dest_map, 865*d6b92ffaSHans Petter Selasky IN OUT cl_qmap_t * const p_src_map); 866*d6b92ffaSHans Petter Selasky /* 867*d6b92ffaSHans Petter Selasky * PARAMETERS 868*d6b92ffaSHans Petter Selasky * p_dest_map 869*d6b92ffaSHans Petter Selasky * [out] Pointer to a cl_qmap_t structure to which items should be added. 870*d6b92ffaSHans Petter Selasky * 871*d6b92ffaSHans Petter Selasky * p_src_map 872*d6b92ffaSHans Petter Selasky * [in/out] Pointer to a cl_qmap_t structure whose items to add 873*d6b92ffaSHans Petter Selasky * to p_dest_map. 874*d6b92ffaSHans Petter Selasky * 875*d6b92ffaSHans Petter Selasky * RETURN VALUES 876*d6b92ffaSHans Petter Selasky * This function does not return a value. 877*d6b92ffaSHans Petter Selasky * 878*d6b92ffaSHans Petter Selasky * NOTES 879*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys only. 880*d6b92ffaSHans Petter Selasky * 881*d6b92ffaSHans Petter Selasky * Upon return from cl_qmap_merge, the quick map referenced by p_src_map 882*d6b92ffaSHans Petter Selasky * contains all duplicate items. 883*d6b92ffaSHans Petter Selasky * 884*d6b92ffaSHans Petter Selasky * SEE ALSO 885*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_delta 886*d6b92ffaSHans Petter Selasky *********/ 887*d6b92ffaSHans Petter Selasky 888*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_delta 889*d6b92ffaSHans Petter Selasky * NAME 890*d6b92ffaSHans Petter Selasky * cl_qmap_delta 891*d6b92ffaSHans Petter Selasky * 892*d6b92ffaSHans Petter Selasky * DESCRIPTION 893*d6b92ffaSHans Petter Selasky * The cl_qmap_delta function computes the differences between two maps. 894*d6b92ffaSHans Petter Selasky * 895*d6b92ffaSHans Petter Selasky * SYNOPSIS 896*d6b92ffaSHans Petter Selasky */ 897*d6b92ffaSHans Petter Selasky void 898*d6b92ffaSHans Petter Selasky cl_qmap_delta(IN OUT cl_qmap_t * const p_map1, 899*d6b92ffaSHans Petter Selasky IN OUT cl_qmap_t * const p_map2, 900*d6b92ffaSHans Petter Selasky OUT cl_qmap_t * const p_new, OUT cl_qmap_t * const p_old); 901*d6b92ffaSHans Petter Selasky /* 902*d6b92ffaSHans Petter Selasky * PARAMETERS 903*d6b92ffaSHans Petter Selasky * p_map1 904*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the first of two cl_qmap_t structures whose 905*d6b92ffaSHans Petter Selasky * differences to compute. 906*d6b92ffaSHans Petter Selasky * 907*d6b92ffaSHans Petter Selasky * p_map2 908*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the second of two cl_qmap_t structures whose 909*d6b92ffaSHans Petter Selasky * differences to compute. 910*d6b92ffaSHans Petter Selasky * 911*d6b92ffaSHans Petter Selasky * p_new 912*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_qmap_t structure that contains the 913*d6b92ffaSHans Petter Selasky * items unique to p_map2 upon return from the function. 914*d6b92ffaSHans Petter Selasky * 915*d6b92ffaSHans Petter Selasky * p_old 916*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_qmap_t structure that contains the 917*d6b92ffaSHans Petter Selasky * items unique to p_map1 upon return from the function. 918*d6b92ffaSHans Petter Selasky * 919*d6b92ffaSHans Petter Selasky * RETURN VALUES 920*d6b92ffaSHans Petter Selasky * This function does not return a value. 921*d6b92ffaSHans Petter Selasky * 922*d6b92ffaSHans Petter Selasky * NOTES 923*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys. Items that exist in both 924*d6b92ffaSHans Petter Selasky * p_map1 and p_map2 remain in their respective maps. Items that 925*d6b92ffaSHans Petter Selasky * exist only p_map1 are moved to p_old. Likewise, items that exist only 926*d6b92ffaSHans Petter Selasky * in p_map2 are moved to p_new. This function can be useful in evaluating 927*d6b92ffaSHans Petter Selasky * changes between two maps. 928*d6b92ffaSHans Petter Selasky * 929*d6b92ffaSHans Petter Selasky * Both maps pointed to by p_new and p_old must be empty on input. This 930*d6b92ffaSHans Petter Selasky * requirement removes the possibility of failures. 931*d6b92ffaSHans Petter Selasky * 932*d6b92ffaSHans Petter Selasky * SEE ALSO 933*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_merge 934*d6b92ffaSHans Petter Selasky *********/ 935*d6b92ffaSHans Petter Selasky 936*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_apply_func 937*d6b92ffaSHans Petter Selasky * NAME 938*d6b92ffaSHans Petter Selasky * cl_qmap_apply_func 939*d6b92ffaSHans Petter Selasky * 940*d6b92ffaSHans Petter Selasky * DESCRIPTION 941*d6b92ffaSHans Petter Selasky * The cl_qmap_apply_func function executes a specified function 942*d6b92ffaSHans Petter Selasky * for every item stored in a quick map. 943*d6b92ffaSHans Petter Selasky * 944*d6b92ffaSHans Petter Selasky * SYNOPSIS 945*d6b92ffaSHans Petter Selasky */ 946*d6b92ffaSHans Petter Selasky void 947*d6b92ffaSHans Petter Selasky cl_qmap_apply_func(IN const cl_qmap_t * const p_map, 948*d6b92ffaSHans Petter Selasky IN cl_pfn_qmap_apply_t pfn_func, 949*d6b92ffaSHans Petter Selasky IN const void *const context); 950*d6b92ffaSHans Petter Selasky /* 951*d6b92ffaSHans Petter Selasky * PARAMETERS 952*d6b92ffaSHans Petter Selasky * p_map 953*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure. 954*d6b92ffaSHans Petter Selasky * 955*d6b92ffaSHans Petter Selasky * pfn_func 956*d6b92ffaSHans Petter Selasky * [in] Function invoked for every item in the quick map. 957*d6b92ffaSHans Petter Selasky * See the cl_pfn_qmap_apply_t function type declaration for 958*d6b92ffaSHans Petter Selasky * details about the callback function. 959*d6b92ffaSHans Petter Selasky * 960*d6b92ffaSHans Petter Selasky * context 961*d6b92ffaSHans Petter Selasky * [in] Value to pass to the callback functions to provide context. 962*d6b92ffaSHans Petter Selasky * 963*d6b92ffaSHans Petter Selasky * RETURN VALUE 964*d6b92ffaSHans Petter Selasky * This function does not return a value. 965*d6b92ffaSHans Petter Selasky * 966*d6b92ffaSHans Petter Selasky * NOTES 967*d6b92ffaSHans Petter Selasky * The function provided must not perform any map operations, as these 968*d6b92ffaSHans Petter Selasky * would corrupt the quick map. 969*d6b92ffaSHans Petter Selasky * 970*d6b92ffaSHans Petter Selasky * SEE ALSO 971*d6b92ffaSHans Petter Selasky * Quick Map, cl_pfn_qmap_apply_t 972*d6b92ffaSHans Petter Selasky *********/ 973*d6b92ffaSHans Petter Selasky 974*d6b92ffaSHans Petter Selasky END_C_DECLS 975*d6b92ffaSHans Petter Selasky #endif /* _CL_QMAP_H_ */ 976