cdev-1.7.2n

This commit is contained in:
2022-12-13 12:44:04 +01:00
commit b3b88fc333
1357 changed files with 338883 additions and 0 deletions

View File

@@ -0,0 +1,204 @@
#ifndef _INT_HASH_H_
#define _INT_HASH_H_ 1
#include <cdevPlatforms.h>
class GENERIC_SERVER_API IntHashNode
{
friend class IntHash;
friend class IntHashIterator;
private:
int hashInt;
void * hashData;
IntHashNode * next;
IntHashNode ( int HashInt, void * HashData);
~IntHashNode ( void );
};
class GENERIC_SERVER_API IntHash
{
friend class IntHashIterator;
private:
enum { HASH_CNT=256, HASH_NO=256 };
IntHashNode * nodes[HASH_CNT];
public:
IntHash ( void );
~IntHash ( void );
inline unsigned char hash ( int hashInt );
inline void insert ( int hashInt, void * hashData );
inline void remove ( int hashInt );
inline void * find ( int hashInt );
};
class GENERIC_SERVER_API IntHashIterator
{
private:
IntHash * hashTbl;
IntHashNode * node;
int idx;
public:
IntHashIterator( IntHash * HashTbl );
~IntHashIterator( void );
inline void * first ( void );
inline void * operator ++ ( void );
inline void * operator ++ ( int x );
inline int key ( void );
inline void * data ( void );
};
inline IntHash::IntHash ( void )
{
memset(nodes, 0, sizeof(nodes));
}
inline IntHash::~IntHash ( void )
{
for(int i=0; i<HASH_CNT; i++)
{
while(nodes[i]!=NULL)
{
IntHashNode * node = nodes[i];
nodes[i] = node->next;
delete node;
}
}
}
inline unsigned char IntHash::hash ( int hashInt )
{
return (hashInt%HASH_NO);
}
inline void IntHash::insert (int hashInt, void * hashData )
{
unsigned char idx = hash(hashInt);
IntHashNode * prev = NULL, * node = nodes[idx];
IntHashNode * newNode = new IntHashNode(hashInt, hashData);
while(node!=NULL && node->hashInt!=hashInt)
{
prev = node;
node = prev->next;
}
if(node!=NULL)
{
newNode->next = node->next;
delete node;
}
if(prev!=NULL) prev->next = newNode;
else nodes[idx] = newNode;
}
inline void IntHash::remove ( int hashInt )
{
unsigned char idx = hash(hashInt);
IntHashNode * prev = NULL, * node = nodes[idx];
while(node!=NULL && node->hashInt!=hashInt)
{
prev = node;
node = prev->next;
}
if(node!=NULL)
{
if(prev!=NULL) prev->next = node->next;
else nodes[idx] = node->next;
delete node;
}
}
inline void * IntHash::find ( int hashInt )
{
unsigned char idx = hash(hashInt);
IntHashNode * prev = NULL, * node = nodes[idx];
while(node!=NULL && node->hashInt!=hashInt)
{
prev = node;
node = prev->next;
}
return node!=NULL?node->hashData:NULL;
}
inline IntHashIterator::IntHashIterator(IntHash * HashTbl)
: hashTbl(HashTbl), idx(0), node(NULL)
{
}
inline IntHashIterator::~IntHashIterator( void )
{
}
inline void * IntHashIterator::first ( void )
{
if(hashTbl!=NULL)
{
for(idx = 0; idx<IntHash::HASH_CNT &&
(node = hashTbl->nodes[idx])==NULL; idx++);
}
else node = NULL;
return (node!=NULL)?node->hashData:NULL;
}
inline void * IntHashIterator::operator ++ ( void )
{
if(hashTbl!=NULL)
{
if(node==NULL) first();
else if(node->next!=NULL) node = node->next;
else
{
node = NULL;
do {
idx++;
} while(idx<IntHash::HASH_CNT &&
(node = hashTbl->nodes[idx])==NULL);
}
}
else node = NULL;
return (node!=NULL)?node->hashData:NULL;
}
inline void * IntHashIterator::operator ++ ( int x )
{
if(hashTbl!=NULL && x==0)
{
if(node==NULL) first();
else if(node->next!=NULL) node = node->next;
else
{
node = NULL;
do {
idx++;
} while(idx<IntHash::HASH_CNT &&
(node = hashTbl->nodes[idx])==NULL);
}
}
else node = NULL;
return (node!=NULL)?node->hashData:NULL;
}
inline int IntHashIterator::key ( void )
{
return (node!=NULL)?node->hashInt:0;
}
inline void * IntHashIterator::data ( void )
{
return (node!=NULL)?node->hashData:NULL;
}
#endif /* _INT_HASH_H_ */