// AGMXIDX.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__AGMXIDX_H__)
#define __AGMXIDX_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__AGMUTIL_H__)
#include <agmutil.h>
#endif

#if !defined(__AGMDATE_H__)
#include <agmdate.h>
#endif

#if !defined(__AGMXKEY_H__)
#include <agmxkey.h>
#endif

const TInt ArrayGranularity = 32;

// ----------------------------------- Classes ---------------------------------
class CAgnIndexBase;
class CAgnIndex;
class CAgnSortEntryIndex;


// ----------------------------------- Referenced classes ----------------------
class CAgnSortEntry;
class CAgnEntry;

// ----------------------------------- CAgnIndexBase----------------------------
class CAgnIndexBase : public CBase
	{
public:
	~CAgnIndexBase();
	TBool IsOutOfDate();
	void SetOutOfDate(TBool aOutOfDate);
	virtual TBool IsValid(const CAgnSortEntry* aInfo) const;
	virtual TBool Compare(const CAgnSortEntry* aInfo, const CAgnEntry* aEntry) const;
	TInt Count() const;
	virtual TBool AddL(CAgnSortEntry* const aInfo);
	TBool AppendL(CAgnSortEntry* const aEntry);
	virtual TBool DeleteEntry(CAgnSortEntry* const aEntry);
	TBool RemoveEntry(CAgnSortEntry* const aInfo); 
	CAgnSortEntry* operator[](TInt anIndex);
	CAgnSortEntry* Get(TInt anIndex) const;
	void Delete(TInt aPos);
	void ExtendL();
	virtual void Sort();
	void Compress();
	void Reset();
	virtual TBool First(TAgnDate& /*aKeyValue*/, TInt& /*aPos*/) { return EFalse; }
	virtual TBool Next(TAgnDate& /*aKeyValue*/, TInt& /*aPos*/) const {return EFalse;}
	virtual void GetKeyValue(CAgnSortEntry* const /*aInfo*/, TAgnDate& /*aKeyValue*/) const {};
protected:
	void ConstructL(TInt aGranularity=ArrayGranularity);
	CAgnIndexBase();
	virtual TInt FindWithEntry(CAgnSortEntry* const aInfo);
	CArrayFixSeg<CAgnSortEntry*>* Array();
private:
	CArrayFixSeg<CAgnSortEntry*>* iArray;
	TBool iIsOutOfDate;
	};


// ------------------------- CAgnIndex<Entry, Key, KeyValue> -------------------
class CAgnIndex : public CAgnIndexBase
	{
public:
//	static CAgnIndex* NewL(TAgnKeyBase<CAgnSortEntry,TAgnDate>* aKey);
	~CAgnIndex();
	TBool AddL(CAgnSortEntry* const aEntry);
	TBool Find(const TAgnDate& aDate, TInt& aPos,TBool aFirst = ETrue);
	virtual TBool First(TAgnDate& aDate, TInt& aPos);
	virtual TBool FirstLessOrEqual(TAgnDate& aDate, TInt& aPos);
	virtual TBool Next(TAgnDate& aDate, TInt& aPos) const;
	virtual TBool Previous(TAgnDate& aDate, TInt& aPos) const;
	void GetKeyValue(TInt Pos, TAgnDate& aDate) const;
	virtual void GetKeyValue(CAgnSortEntry* const, TAgnDate& aDate) const;
	TBool DeleteWithEntry(CAgnSortEntry* const aEntry); 
	TBool DeleteEntry(CAgnSortEntry* const aEntry); 
	virtual void Sort();
protected:
	CAgnIndex(TAgnKeyBase<CAgnSortEntry,TAgnDate>* aKey,TAllowDuplicates aDup=ENoDuplicates);
	inline TInt FindWithEntry(CAgnSortEntry* const aEntry);
private:
	TAgnKeyBase<CAgnSortEntry,TAgnDate>* iKey;						// defines the index ordering
	TAllowDuplicates iDup;		// allow or not entries with duplicate key values
	};

//------------------------CAgnSortEntryIndex<Key,KeyValue>----------------------

class CAgnSortEntryIndex : public CAgnIndex
	{
public:
	virtual TBool Compare(const CAgnSortEntry* aInfo, const CAgnEntry* aEntry) const;
protected:
	CAgnSortEntryIndex(TAgnKeyBase<CAgnSortEntry,TAgnDate>* aKey,TAllowDuplicates aDup=ENoDuplicates);
	};

//#include <agmxidx.inl>

#endif

// -------------------------------- EOF ----------------------------------------
