File:  [parser3project] / parser3 / src / include / pa_hash.h
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Sat Jan 27 12:04:53 2001 UTC (25 years, 5 months ago) by paf
Branches: MAIN
CVS tags: HEAD
no message

/*
  $Id: pa_hash.h,v 1.2 2001/01/27 12:04:53 paf Exp $
*/

/*


*/

#ifndef PA_HASH_H
#define PA_HASH_H

#include <stddef.h>

#include "pa_types.h"
#include "pa_string.h"

class Pool;

typedef String Key;
typedef void Value;

class Hash {
public:

private:
	friend Pool;

	// expand when there would be used this %% of size
	enum {
		THRESHOLD_PERCENT=75
	};

	// the pool I'm allocated on
	Pool *pool;

	// the index of size in sizes
	int size_index;

	// possible sizes. prime numbers
	static uint sizes[];
	static int sizes_count;

	// number of allocated pairs
	int size;

	// helper: expanding when used == threshold
	int threshold;

	// used pairs
	int used;

	// main storage
	class Pair {
		friend Hash;

		uint code;
		Key key;
		Value *value;
		Pair *link;
		
		void *operator new(size_t size, Pool *apool);

		Pair(uint acode, Key& akey, Value *avalue, Pair *alink) :
			code(acode),
			key(akey),
			value(avalue),
			link(alink) {}
	} **refs;

	// new&constructors made private to enforce factory manufacturing at pool
	void *operator new(size_t size, Pool *apool);

	Hash(Pool *apool);

	bool full() {
		return used==threshold;
	}
	void expand();

public:

	static uint generic_code(uint aresult, char *start, uint size);
	void put(Key& key, Value *value);
	Value* get(Key& key);
};

#endif

E-mail: