small-package/luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_map.h

132 lines
2.8 KiB
C

/*
* Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com
*/
#ifndef _NGX_MAP_H_INCLUDED_
#define _NGX_MAP_H_INCLUDED_
#include <ngx_config.h>
#include <ngx_core.h>
/*
* key: key for map node
*/
typedef ngx_rbtree_key_t (* ngx_map_hash_pt)(intptr_t key);
/*
* if key1 < key2, return -1
* if key1 = key2, return 0
* if key1 > key2, return 1
*/
typedef int (* ngx_cmp_pt)(intptr_t key1, intptr_t key2);
/* ngx_str_t */
ngx_rbtree_key_t ngx_map_hash_str(intptr_t key);
int ngx_cmp_str(intptr_t key1, intptr_t key2);
/* ngx_uint_t */
ngx_rbtree_key_t ngx_map_hash_uint(intptr_t key);
int ngx_cmp_uint(intptr_t key1, intptr_t key2);
/* ngx_int_t */
ngx_rbtree_key_t ngx_map_hash_int(intptr_t key);
int ngx_cmp_int(intptr_t key1, intptr_t key2);
typedef struct {
ngx_rbtree_t rbtree;
ngx_rbtree_node_t sentinel;
ngx_map_hash_pt hash;
ngx_cmp_pt cmp;
} ngx_map_t;
typedef struct {
ngx_rbtree_node_t rn;
intptr_t raw_key;
ngx_map_t *map;
} ngx_map_node_t;
/*
* return value:
* None
* paras:
* map : map for initial
* hash: hash func for calc key's hash
* cmp : cmp func for cmp two keys
*/
void ngx_map_init(ngx_map_t *map, ngx_map_hash_pt hash, ngx_cmp_pt cmp);
/*
* return value:
* if map is empty return 1, else return 0
*/
#define ngx_map_empty(map) (map->rbtree.root == map->rbtree.sentinel)
/*
* return value:
* the mininum key map node, if map is empty, return NULL
* paras:
* map: map for operate
*/
ngx_map_node_t *ngx_map_begin(ngx_map_t *map);
/*
* return value:
* the maximum key map node, if map is empty, return NULL
* paras:
* map: map for operate
*/
ngx_map_node_t *ngx_map_rbegin(ngx_map_t *map);
/*
* return value:
* the next bigger key map node, if none, return NULL
* paras:
* n : current node
*/
ngx_map_node_t *ngx_map_next(ngx_map_node_t *n);
/*
* return value:
* the next smaller key map node, if none, return NULL
* paras:
* n : current node
*/
ngx_map_node_t *ngx_map_prev(ngx_map_node_t *n);
/*
* return value:
* None
* paras:
* map : map for operate
* node : map node for inserting into map
* covered: 1 for covered if key is same, 0 do nothing if key is same
*/
void ngx_map_insert(ngx_map_t *map, ngx_map_node_t *node, ngx_flag_t covered);
/*
* return value:
* None
* paras:
* map: map for operate
* key: map node key for deleting from map
*/
void ngx_map_delete(ngx_map_t *map, intptr_t key);
/*
* return value:
* node in map searching by key, NULL for not found
* paras:
* map: map for operate
* key: node key for searching
*/
ngx_map_node_t *ngx_map_find(ngx_map_t *map, intptr_t key);
#endif