1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci#ifndef INIT_HASH_MAP_
16d9f0492fSopenharmony_ci#define INIT_HASH_MAP_
17d9f0492fSopenharmony_ci#include <stdint.h>
18d9f0492fSopenharmony_ci#include <stdlib.h>
19d9f0492fSopenharmony_ci#include <string.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#ifdef __cplusplus
22d9f0492fSopenharmony_ci#if __cplusplus
23d9f0492fSopenharmony_ciextern "C" {
24d9f0492fSopenharmony_ci#endif
25d9f0492fSopenharmony_ci#endif
26d9f0492fSopenharmony_ci
27d9f0492fSopenharmony_ci#define HASH_TAB_BUCKET_MAX 1024
28d9f0492fSopenharmony_ci#define HASH_TAB_BUCKET_MIN 16
29d9f0492fSopenharmony_ci
30d9f0492fSopenharmony_citypedef struct HashNode_ {
31d9f0492fSopenharmony_ci    struct HashNode_ *next;
32d9f0492fSopenharmony_ci} HashNode;
33d9f0492fSopenharmony_ci
34d9f0492fSopenharmony_ci#define HASHMAP_ENTRY(ptr, type, member)   ((type *)((char *)(ptr) - offsetof(type, member)))
35d9f0492fSopenharmony_ci#define HASHMAPInitNode(node) (node)->next = NULL
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_citypedef int (*HashNodeCompare)(const HashNode *node1, const HashNode *node2);
38d9f0492fSopenharmony_citypedef int (*HashKeyCompare)(const HashNode *node1, const void *key);
39d9f0492fSopenharmony_citypedef int (*HashNodeFunction)(const HashNode *node);
40d9f0492fSopenharmony_citypedef int (*HashKeyFunction)(const void *key);
41d9f0492fSopenharmony_citypedef void (*HashNodeOnFree)(const HashNode *node, void *context);
42d9f0492fSopenharmony_ci
43d9f0492fSopenharmony_citypedef struct {
44d9f0492fSopenharmony_ci    HashNodeCompare nodeCompare;
45d9f0492fSopenharmony_ci    HashKeyCompare keyCompare;
46d9f0492fSopenharmony_ci    HashNodeFunction nodeHash;
47d9f0492fSopenharmony_ci    HashKeyFunction keyHash;
48d9f0492fSopenharmony_ci    HashNodeOnFree nodeFree;
49d9f0492fSopenharmony_ci    int maxBucket;
50d9f0492fSopenharmony_ci} HashInfo;
51d9f0492fSopenharmony_ci
52d9f0492fSopenharmony_citypedef void *HashMapHandle;
53d9f0492fSopenharmony_ci
54d9f0492fSopenharmony_ciint OH_HashMapIsEmpty(HashMapHandle handle);
55d9f0492fSopenharmony_ciint32_t OH_HashMapCreate(HashMapHandle *handle, const HashInfo *info);
56d9f0492fSopenharmony_civoid OH_HashMapDestory(HashMapHandle handle, void *context);
57d9f0492fSopenharmony_ciint32_t OH_HashMapAdd(HashMapHandle handle, HashNode *hashNode);
58d9f0492fSopenharmony_civoid OH_HashMapRemove(HashMapHandle handle, const void *key);
59d9f0492fSopenharmony_ciHashNode *OH_HashMapGet(HashMapHandle handle, const void *key);
60d9f0492fSopenharmony_ciHashNode *OH_HashMapFind(HashMapHandle handle,
61d9f0492fSopenharmony_ci    int hashCode, const void *key, HashKeyCompare keyCompare);
62d9f0492fSopenharmony_civoid OH_HashMapTraverse(HashMapHandle handle, void (*hashNodeTraverse)(const HashNode *node, const void *context),
63d9f0492fSopenharmony_ci    const void *context);
64d9f0492fSopenharmony_ci#ifdef __cplusplus
65d9f0492fSopenharmony_ci#if __cplusplus
66d9f0492fSopenharmony_ci}
67d9f0492fSopenharmony_ci#endif
68d9f0492fSopenharmony_ci#endif
69d9f0492fSopenharmony_ci#endif