#define ADD_TO_HASH( what, next, orderby, hash, hash_size ) \
do												\
{												\
	int __iHash = (orderby)%(hash_size);		\
	(what)->next = (hash)[__iHash];	\
	(hash)[__iHash] = (what);					\
} while(0);
#define GET_FROM_HASH( what, member, what_type, next, hash, hash_size, result ) \
do												\
{												\
	int __iHash = (what)%(hash_size);		\
	(result) = NULL;							\
	for ( what_type *__what = (hash)[__iHash]; __what; __what = __what->next ) \
		if ( __what->member == (what) )			\
		{										\
			(result) = __what;					\
			break;								\
		}										\
} while(0);
#define IS_IN_HASH( what, what_type, next, orderby, hash, hash_size, result ) \
do												\
{												\
	int __iHash = (orderby)%(hash_size);		\
	(result) = false;							\
	for ( what_type *__what = (hash)[__iHash]; __what; __what = __what->next )	\
		if ( __what == (what) )					\
			(result) = true;					\
} while(0);

#define IS_IN_HASH_MEMBER( what, member, what_type, next, hash, hash_size, result ) \
do												\
{												\
	int __iHash = (what)%(hash_size);		\
	(result) = false;							\
	for ( what_type *__what = (hash)[__iHash]; __what; __what = __what->next )	\
		if ( __what->member == (what) )			\
		{										\
			(result) = true;					\
			break;								\
		}										\
} while(0);

#define REMOVE_FROM_HASH( what, what_type, next, orderby, hash, hash_size ) \
do												\
{												\
	int __iHash = (orderby)%(hash_size);		\
	if ( (what) == (hash)[__iHash] )			\
		(hash)[__iHash] = (what)->next;			\
	else										\
	{											\
		for ( what_type *__what = (hash)[__iHash]; __what; __what = __what->next ) \
			if ( __what->next == (what) )		\
				__what->next = (what)->next;	\
	}											\
} while(0);

#define REMOVE_FROM_HASH_BY_MEMBER( what, member, what_type, next,  hash, hash_size ) \
do													\
{													\
	int __iHash = (what)%(hash_size);			\
	if ( (what) == (hash)[__iHash] )				\
		(hash)[__iHash] = (what)->next				\
	else											\
	{												\
		for ( what_type *__what = (hash)[__iHash]; __what; __what = __what->next ) \
			if ( __what->next && __what->next->member == (what) )		\
			{										\
				__what->next = __what->next->next;	\
				break;								\
			}										\
	}												\
} while(0);