#ifndef STORE_H_INCLUDED
#define STORE_H_INCLUDED 1

#include "types.h"
#include "pointer.h"
#include "list.h"

class MReclaimable {
public:
	virtual void SetCurrentStamp(uint16 Stamp) = 0;
	virtual void ReclaimL(uint16 upto) = 0;
};

class CReclaimManager : public CBase {
// NOTE: This doesn't take ownership
// of the managed objects
public:
	static CReclaimManager* NewL();
	void AddManagedL(MReclaimable* Managed);
	~CReclaimManager();
	void SetTimeStamp(uint16 Stamp);
	void TriggerReclaimL(uint16 Upto);
private:
	CReclaimManager();
	void ConstructL();
	CList<MReclaimable*>* iList;

	uint16 iCurrentStamp;
};

class MCellMap {
public:
	virtual void AddMappingL(uint16 Cell, uint32 Sequence) = 0;
	virtual void FindL(uint16 Cell) = 0;
	virtual uint32 NextL() = 0; // return 0 when no more matches
	virtual ~MCellMap() { }
	virtual int Count() const = 0;
};

struct TBaseCount {
	uint16	Base;
	uint16	Count;
	TBaseCount(uint16 b, uint16 c) : Base(b), Count(c) { }
	TBaseCount() { }
	// default copy constructor ok
};

class MSequenceMap {
public:
	virtual void AddMappingL(uint32 Sequence, uint16 Base) = 0;
	virtual void FindL(uint32 Sequence) = 0;
	virtual TBaseCount NextL() = 0; // Base==0 wheno no more matches
	virtual ~MSequenceMap() { }
	virtual int Count() const = 0;
};

class MSequenceIdMap {
public:
	virtual uint32 AddSequenceL(uint16* Sequence) = 0;
	virtual uint32 GetSequenceIdL(uint16* Sequence) = 0;
	virtual const uint16* GetSequenceL(uint32 Id) = 0;
	virtual ~MSequenceIdMap() { }
	virtual int Count() const = 0;
};

class MGenericIntMap {
public:
	virtual void AddDataL(uint32 Key, void* data) = 0;
	virtual void* GetData(uint32 Key) = 0;
	virtual void DeleteL(uint32 Key) = 0;
	virtual ~MGenericIntMap() { }
	virtual int Count() const = 0;
	virtual void SetDeletor( void(*delete_func)(void* data) ) = 0;
};

class MMapFactory {
public:
	virtual MCellMap*	CreateCellMapL() = 0;
	virtual MSequenceMap*	CreateSequenceMapL() = 0;
	virtual MSequenceIdMap* CreateSequenceIdMapL(int SequenceLen) = 0;
	virtual MGenericIntMap*	CreateGenericIntMapL() = 0;
};
#endif
