163 lines
3.6 KiB
C
Raw Normal View History

// 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_ */