163 lines
3.6 KiB
C
163 lines
3.6 KiB
C
|
// Copyright 2015-2021 The NATS Authors
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
|
||
|
#ifndef HASH_H_
|
||
|
#define HASH_H_
|
||
|
|
||
|
struct __natsHashEntry;
|
||
|
|
||
|
typedef struct __natsHashEntry
|
||
|
{
|
||
|
int64_t key;
|
||
|
void *data;
|
||
|
struct __natsHashEntry *next;
|
||
|
|
||
|
} natsHashEntry;
|
||
|
|
||
|
typedef struct __natsHash
|
||
|
{
|
||
|
natsHashEntry **bkts;
|
||
|
int numBkts;
|
||
|
int mask;
|
||
|
int used;
|
||
|
bool canResize;
|
||
|
|
||
|
} natsHash;
|
||
|
|
||
|
typedef struct __natsHashIter
|
||
|
{
|
||
|
natsHash *hash;
|
||
|
natsHashEntry *current;
|
||
|
natsHashEntry *next;
|
||
|
int currBkt;
|
||
|
bool started;
|
||
|
|
||
|
} natsHashIter;
|
||
|
|
||
|
typedef struct __natsStrHashEntry
|
||
|
{
|
||
|
uint32_t hk;
|
||
|
char *key;
|
||
|
bool freeKey;
|
||
|
void *data;
|
||
|
struct __natsStrHashEntry *next;
|
||
|
|
||
|
} natsStrHashEntry;
|
||
|
|
||
|
typedef struct __natsStrHash
|
||
|
{
|
||
|
natsStrHashEntry **bkts;
|
||
|
int numBkts;
|
||
|
int mask;
|
||
|
int used;
|
||
|
bool canResize;
|
||
|
|
||
|
} natsStrHash;
|
||
|
|
||
|
typedef struct __natsStrHashIter
|
||
|
{
|
||
|
natsStrHash *hash;
|
||
|
natsStrHashEntry *current;
|
||
|
natsStrHashEntry *next;
|
||
|
int currBkt;
|
||
|
bool started;
|
||
|
|
||
|
} natsStrHashIter;
|
||
|
|
||
|
#define natsHash_Count(h) ((h)->used)
|
||
|
#define natsStrHash_Count(h) ((h)->used)
|
||
|
|
||
|
//
|
||
|
// Hash with in64_t as the key
|
||
|
//
|
||
|
natsStatus
|
||
|
natsHash_Create(natsHash **newHash, int initialSize);
|
||
|
|
||
|
natsStatus
|
||
|
natsHash_Set(natsHash *hash, int64_t key, void *data, void **oldData);
|
||
|
|
||
|
void*
|
||
|
natsHash_Get(natsHash *hash, int64_t key);
|
||
|
|
||
|
void*
|
||
|
natsHash_Remove(natsHash *hash, int64_t key);
|
||
|
|
||
|
natsStatus
|
||
|
natsHash_RemoveSingle(natsHash *hash, int64_t *key, void **data);
|
||
|
|
||
|
void
|
||
|
natsHash_Destroy(natsHash *hash);
|
||
|
|
||
|
//
|
||
|
// Iterator for Hash int64_t
|
||
|
//
|
||
|
void
|
||
|
natsHashIter_Init(natsHashIter *iter, natsHash *hash);
|
||
|
|
||
|
bool
|
||
|
natsHashIter_Next(natsHashIter *iter, int64_t *key, void **value);
|
||
|
|
||
|
natsStatus
|
||
|
natsHashIter_RemoveCurrent(natsHashIter *iter);
|
||
|
|
||
|
void
|
||
|
natsHashIter_Done(natsHashIter *iter);
|
||
|
|
||
|
//
|
||
|
// Hash with char* as the key
|
||
|
//
|
||
|
natsStatus
|
||
|
natsStrHash_Create(natsStrHash **newHash, int initialSize);
|
||
|
|
||
|
uint32_t
|
||
|
natsStrHash_Hash(const char *data, int dataLen);
|
||
|
|
||
|
#define natsStrHash_Set(h, k, c, d, o) natsStrHash_SetEx((h), (k), (c), ((c) ? true : false), (d), (o))
|
||
|
|
||
|
natsStatus
|
||
|
natsStrHash_SetEx(natsStrHash *hash, char *key, bool copyKey, bool freeKey,
|
||
|
void *data, void **oldData);
|
||
|
|
||
|
#define natsStrHash_Get(h, k) natsStrHash_GetEx((h), (k), (int) strlen(k))
|
||
|
|
||
|
void*
|
||
|
natsStrHash_GetEx(natsStrHash *hash, char *key, int keyLen);
|
||
|
|
||
|
void*
|
||
|
natsStrHash_Remove(natsStrHash *hash, char *key);
|
||
|
|
||
|
natsStatus
|
||
|
natsStrHash_RemoveSingle(natsStrHash *hash, char **key, void **data);
|
||
|
|
||
|
void
|
||
|
natsStrHash_Destroy(natsStrHash *hash);
|
||
|
|
||
|
//
|
||
|
// Iterator for Hash char*
|
||
|
//
|
||
|
void
|
||
|
natsStrHashIter_Init(natsStrHashIter *iter, natsStrHash *hash);
|
||
|
|
||
|
bool
|
||
|
natsStrHashIter_Next(natsStrHashIter *iter, char **key, void **value);
|
||
|
|
||
|
natsStatus
|
||
|
natsStrHashIter_RemoveCurrent(natsStrHashIter *iter);
|
||
|
|
||
|
void
|
||
|
natsStrHashIter_Done(natsStrHashIter *iter);
|
||
|
|
||
|
|
||
|
#endif /* HASH_H_ */
|