epoc32/include/s32btree.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 2 2fe1408b6811
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@4
     4
// under the terms of "Eclipse Public License v1.0"
williamr@2
     5
// which accompanies this distribution, and is available
williamr@4
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
#if !defined(__S32BTREE_H__)
williamr@2
    17
#define __S32BTREE_H__
williamr@2
    18
#if !defined(__S32PAGE_H__)
williamr@2
    19
#include <s32page.h>
williamr@2
    20
#endif
williamr@2
    21
williamr@2
    22
const TInt KMaxBtreeHeight=16;
williamr@2
    23
/** Maximum length for a B-tree key. */
williamr@2
    24
const TInt KMaxBtreeKeyLength=255;
williamr@2
    25
//
williamr@2
    26
typedef TInt TBtreeHeight;
williamr@2
    27
/** Buffer to store the result of MBtreeKey::Between(). */
williamr@2
    28
typedef TBuf8<KMaxBtreeKeyLength> TBtreePivot;
williamr@2
    29
//
williamr@2
    30
enum TBtreeMode {EBtreeSecure,EBtreeFast};
williamr@2
    31
williamr@2
    32
/**
williamr@2
    33
 * @publishedAll 
williamr@2
    34
 * @released
williamr@2
    35
 * Encapsulates the persistent parameters for a TBtree. 
williamr@2
    36
*/
williamr@2
    37
class TBtreeToken
williamr@2
    38
	{
williamr@2
    39
public:
williamr@2
    40
/** Provides a TBtreeToken initialisation flag. */
williamr@2
    41
	enum TEmpty {EEmpty};
williamr@2
    42
public:
williamr@2
    43
	/** Default constuctor. */
williamr@2
    44
	TBtreeToken() {}
williamr@2
    45
	inline TBtreeToken(TEmpty);
williamr@2
    46
	inline void Touch();
williamr@2
    47
//
williamr@2
    48
	inline TBool IsBroken() const;
williamr@2
    49
	inline TBool IsIntact() const;
williamr@2
    50
	inline TBool IsEmpty() const;
williamr@2
    51
//
williamr@2
    52
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
williamr@2
    53
	IMPORT_C void InternalizeL(RReadStream& aStream);
williamr@2
    54
protected:
williamr@2
    55
	IMPORT_C void Clear();
williamr@2
    56
private:
williamr@2
    57
	inline TBtreeToken(TPageRef aFirst,TPageRef aRoot,TBtreeHeight aHeight);
williamr@2
    58
private:
williamr@2
    59
	TPageRef iFirst;
williamr@2
    60
	TPageRef iRoot;
williamr@2
    61
	TBtreeHeight iHeight;
williamr@2
    62
private:
williamr@2
    63
	friend class TBtree;
williamr@2
    64
	};
williamr@2
    65
#define KEmptyBtreeToken TBtreeToken(TBtreeToken::EEmpty)
williamr@2
    66
williamr@2
    67
/**
williamr@2
    68
 * @publishedAll 
williamr@2
    69
 * @released
williamr@2
    70
 */
williamr@2
    71
class TBtreePath
williamr@2
    72
	{
williamr@2
    73
public:
williamr@2
    74
	inline TBtreePath();
williamr@2
    75
	inline TPageRef Node() const;
williamr@2
    76
	inline TInt Entry() const;
williamr@2
    77
	inline TBool IsLeaf() const;
williamr@2
    78
	inline TBtreeHeight End() const;
williamr@2
    79
	inline void SetEntry(TInt aEntry);
williamr@2
    80
	void GotoRoot(TBtreeHeight aHeight,TPageRef aRoot);
williamr@2
    81
	void Push(TPageRef aRef,TInt aEntry=0);
williamr@2
    82
	inline void Pop();
williamr@2
    83
private:
williamr@2
    84
	TBtreeHeight iEnd;
williamr@2
    85
	TPageRef iNodes[KMaxBtreeHeight];
williamr@2
    86
	TUint8 iEntries[KMaxBtreeHeight];
williamr@2
    87
	TUint8 iLasts[KMaxBtreeHeight];
williamr@2
    88
	};
williamr@2
    89
williamr@2
    90
/**
williamr@2
    91
 * @publishedAll 
williamr@2
    92
 * @released
williamr@2
    93
 * Identifies a position in a B-tree.
williamr@2
    94
williamr@2
    95
The class has no public members. Clients use it by getting TBtreePos objects 
williamr@2
    96
from some TBtree functions, and passing them into others.  
williamr@2
    97
*/
williamr@2
    98
class TBtreePos
williamr@2
    99
	{
williamr@2
   100
private:
williamr@2
   101
	TBtreePath iPath;
williamr@2
   102
private:
williamr@2
   103
	friend class TBtree;
williamr@2
   104
	};
williamr@2
   105
williamr@2
   106
/**
williamr@2
   107
 * @publishedAll 
williamr@2
   108
 * @released
williamr@2
   109
 * An iterator for a B-tree.
williamr@2
   110
williamr@2
   111
Functions that use a TBtreeMark are faster than those that use a TBtreePos, 
williamr@2
   112
and can be used with a broken B-tree. 
williamr@2
   113
williamr@2
   114
The class has no public members. Clients use it by getting TBtreeMark objects 
williamr@2
   115
from some TBtree functions, and passing them into others. 
williamr@2
   116
*/
williamr@2
   117
class TBtreeMark
williamr@2
   118
	{
williamr@2
   119
private:
williamr@2
   120
	TPageRef iLeaf;
williamr@2
   121
	TPageRef iLink;
williamr@2
   122
	TUint8 iEntry;
williamr@2
   123
	TUint8 iLast;
williamr@2
   124
private:
williamr@2
   125
	friend class TBtree;
williamr@2
   126
	};
williamr@2
   127
williamr@2
   128
/**
williamr@2
   129
 * @publishedAll 
williamr@2
   130
 * @released
williamr@2
   131
 * Interface for ordering and creating keys for entries in a B-tree.
williamr@2
   132
williamr@2
   133
Derived classes implement this interface for particular types of key. 
williamr@2
   134
*/
williamr@2
   135
class MBtreeKey
williamr@2
   136
	{
williamr@2
   137
public:
williamr@2
   138
	virtual IMPORT_C const TAny* Key(const TAny* anEntry) const;
williamr@2
   139
	
williamr@2
   140
	/** Orders two keys.
williamr@2
   141
	
williamr@2
   142
	@param aLeft Pointer to first key
williamr@2
   143
	@param aRight Pointer to second key
williamr@2
   144
	@return Positive, if the first key is after the second key; negative, if 
williamr@2
   145
	the first key is before the second key; zero, if the keys are equal */
williamr@2
   146
	virtual TInt Compare(const TAny* aLeft,const TAny* aRight) const=0;
williamr@2
   147
	
williamr@2
   148
	/** Gets the midpoint between two keys.
williamr@2
   149
	
williamr@2
   150
	The generated midpoint will be greater or equal to aLeft (by a comparison 
williamr@2
   151
	performed by the Compare() function), and less than aRight.
williamr@2
   152
	
williamr@2
   153
	@param aLeft First key
williamr@2
   154
	@param aRight Second key
williamr@2
   155
	@param aPivot On return, the midpoint between the two keys */
williamr@2
   156
	virtual void Between(const TAny* aLeft,const TAny* aRight,TBtreePivot& aPivot) const=0;
williamr@2
   157
	};
williamr@2
   158
williamr@2
   159
class MBtreeNodeOrg;
williamr@2
   160
class MBtreeLeafOrg;
williamr@2
   161
class MBtreeIndexOrg;
williamr@2
   162
williamr@2
   163
/**
williamr@2
   164
 * @publishedAll 
williamr@2
   165
 * @released
williamr@2
   166
 * Provides ordering of entries by key value in a B+-tree (balanced tree) 
williamr@2
   167
structure.
williamr@2
   168
williamr@2
   169
Entries and keys are handled as untyped TAny* parameters. You specify an entry 
williamr@2
   170
in the tree to manipulate through a position (TBtreePos) variable. You can 
williamr@2
   171
also use iterator functions, which take a TBtreeMark, to move through entries 
williamr@2
   172
in the tree. The tree's settings can be persisted using a TBtreeToken.
williamr@2
   173
williamr@2
   174
To use this class, you must provide a page pool, based on MPagePool, in which 
williamr@2
   175
to store entries in the tree, and a key handler, based on MBtreeKey, to provide 
williamr@2
   176
order and keys.
williamr@2
   177
williamr@2
   178
@see MBtreeKey
williamr@2
   179
@see MPagePool
williamr@2
   180
@see TBtreeMark
williamr@2
   181
@see TBtreePos
williamr@2
   182
@see TBtreeToken 
williamr@2
   183
*/
williamr@2
   184
class TBtree
williamr@2
   185
	{
williamr@2
   186
public:
williamr@2
   187
/** Sets the condition for a successful match when calling TBtree::Find(). */
williamr@2
   188
	enum TFind {
williamr@2
   189
		/** Find the first entry greater than or equal to the search target. */
williamr@2
   190
		EGreaterEqual,
williamr@2
   191
		/** Find the first entry equal to the search target. */
williamr@2
   192
		EEqualTo,
williamr@2
   193
		/** Find the last entry less than the search target. */
williamr@2
   194
		ELessThan,
williamr@2
   195
		/** Find the first entry greater than the search target. */
williamr@2
   196
		EGreaterThan,
williamr@2
   197
		/** Find the last entry less than or equal to the search target. */
williamr@2
   198
		ELessEqual};
williamr@2
   199
public:
williamr@2
   200
	IMPORT_C TBtree(TBtreeMode aMode);
williamr@2
   201
	IMPORT_C TBtree(const TBtreeToken& aToken,TBtreeMode aMode);
williamr@2
   202
	IMPORT_C void Connect(MPagePool* aPool,const MBtreeKey* aKey,const MBtreeLeafOrg* aLeafOrg,const MBtreeIndexOrg* anIndexOrg);
williamr@2
   203
	IMPORT_C void Set(const TBtreeToken& aToken,TBtreeMode aMode);
williamr@2
   204
	IMPORT_C TBtreeToken Token() const;
williamr@2
   205
//
williamr@2
   206
	inline TBool IsDirty() const;
williamr@2
   207
	inline void MarkCurrent();
williamr@2
   208
	inline void MarkDirty();
williamr@2
   209
//
williamr@2
   210
	inline TBool IsBroken() const;
williamr@2
   211
	inline TBool IsIntact() const;
williamr@2
   212
	inline void MarkBroken();
williamr@2
   213
	IMPORT_C TInt RepairL();
williamr@2
   214
//
williamr@2
   215
	inline TBool IsEmpty() const;
williamr@2
   216
	IMPORT_C void ClearL();
williamr@2
   217
//
williamr@2
   218
	IMPORT_C TBool FirstL(TBtreePos& aPos) const;
williamr@2
   219
	IMPORT_C TBool LastL(TBtreePos& aPos) const;
williamr@2
   220
	IMPORT_C TBool NextL(TBtreePos& aPos) const;
williamr@2
   221
	IMPORT_C TBool PreviousL(TBtreePos& aPos) const;
williamr@2
   222
//
williamr@2
   223
	IMPORT_C TBool FindL(TBtreePos& aPos,const TAny* aKey,TFind aMode=EEqualTo) const;
williamr@2
   224
	IMPORT_C TBool InsertL(TBtreePos& aPos,const TAny* anEntry,TInt aLength,TAllowDuplicates aDup=ENoDuplicates);
williamr@2
   225
	IMPORT_C TBool DeleteL(const TAny* aKey);
williamr@2
   226
	IMPORT_C void DeleteAtL(TBtreePos& aPos);
williamr@2
   227
	IMPORT_C void ExtractAtL(const TBtreePos& aPos,TAny* anEntry,TInt aMaxLength) const;
williamr@2
   228
//
williamr@2
   229
	IMPORT_C TBool ResetL(TBtreeMark& aMark) const;
williamr@2
   230
	IMPORT_C TBool NextL(TBtreeMark& aMark) const;
williamr@2
   231
	IMPORT_C void ExtractAtL(const TBtreeMark& aMark,TAny* anEntry,TInt aMaxLength) const;
williamr@2
   232
private:
williamr@2
   233
	TBool AscendAtLastL(TBtreePath& aPath) const;
williamr@2
   234
	TBool AscendAtFirstL(TBtreePath& aPath) const;
williamr@2
   235
	void DescendFirstL(TBtreePath& aPath) const;
williamr@2
   236
	void DescendLastL(TBtreePath& aPath) const;
williamr@2
   237
//
williamr@2
   238
	TBool SearchL(TBtreePath& aPath,const TAny* aKey,TBool aAfter=EFalse) const;
williamr@2
   239
	void NewPivot(const TAny* aLeftNode,const TAny* aRightNode,TBtreePivot& aPivot) const;
williamr@2
   240
	void ReplacePivotL(TBtreePath& aPath,TAny* aNode,TBtreePivot& aPivot);
williamr@2
   241
	void InsertAtL(TBtreePath& aPath,const TDesC8& anEntry);
williamr@2
   242
	void InsertAtL(TBtreePath& aPath,TBtreePivot& aPivot,TPageRef aChild);
williamr@2
   243
	TBool InsertAtL(TBtreePath& aPath,const TDesC8& anEntry,TPageRef aChild,TBtreePivot& aPivot,TPageRef& aPromote);
williamr@2
   244
	void DeleteAtL(TBtreePath& aPath);
williamr@2
   245
	void DeleteIndexSetL();
williamr@2
   246
	void DeleteIndexNodesL(TBtreePath& aPath,TBool aLeadingEdge);
williamr@2
   247
//
williamr@2
   248
	void NewTreeL();
williamr@2
   249
	void NewRootL();
williamr@2
   250
//
williamr@2
   251
	void BeginUpdateL();
williamr@2
   252
	void EndUpdate();
williamr@2
   253
	inline void MarkIntact();
williamr@2
   254
	void CheckIntactL() const;
williamr@2
   255
//
williamr@2
   256
	inline TBool IsRoot(const TBtreePath& aPath) const;
williamr@2
   257
	inline const MBtreeNodeOrg* NodeOrg(TBool aLeaf) const;
williamr@2
   258
	void GotoRoot(TBtreePath& aPath) const;
williamr@2
   259
//
williamr@2
   260
	TAny* GetNodeL(const TBtreePath& aPath) const;
williamr@2
   261
	void PutNode(TAny* aNode,TBool aLeaf) const;
williamr@2
   262
//
williamr@2
   263
	TInt LastEntryL(const TBtreePath& aPath) const;
williamr@2
   264
	TPageRef ChildNodeL(const TBtreePath& aPath) const;
williamr@2
   265
	TPageRef LastChildNodeL(TBtreePath& aPath) const;
williamr@2
   266
	TPageRef ChildNodeL(TBtreePath& aPath,TInt aChild) const;
williamr@2
   267
private:
williamr@2
   268
	enum {ESecure=EBtreeSecure,EFast=EBtreeFast,EBroken=0x40000000,EDirty=0x80000000};
williamr@2
   269
private:
williamr@2
   270
	MPagePool* iPages;
williamr@2
   271
	const MBtreeKey* iKey;
williamr@2
   272
	const MBtreeLeafOrg* iLeafOrg;
williamr@2
   273
	const MBtreeIndexOrg* iIndexOrg;
williamr@2
   274
	TPageRef iFirst;
williamr@2
   275
	TPageRef iRoot;
williamr@2
   276
	TBtreeHeight iHeight;
williamr@2
   277
	TInt iStatus;
williamr@2
   278
	};
williamr@2
   279
williamr@2
   280
/**
williamr@2
   281
 * @publishedAll 
williamr@2
   282
 * @released
williamr@2
   283
 */
williamr@2
   284
class MBtreeNodeOrg
williamr@2
   285
	{
williamr@2
   286
public:
williamr@2
   287
	virtual IMPORT_C void Init(TAny* aNode) const;
williamr@2
   288
	virtual TInt LastEntry(const TAny* aNode) const=0;
williamr@2
   289
	virtual TPtrC8 Entry(const TAny* aNode,TInt aPos) const=0;
williamr@2
   290
	virtual const TAny* EntryPtr(const TAny* aNode,TInt aPos) const=0;
williamr@2
   291
	virtual TBool Search(const TAny* aNode,const TAny* aKey,const MBtreeKey& aComp,TBool aLast,TInt& aPos) const=0;
williamr@2
   292
	virtual TBool Delete(TAny* aNode,TInt aPos) const=0;
williamr@2
   293
	};
williamr@2
   294
williamr@2
   295
/**
williamr@2
   296
 * @publishedAll 
williamr@2
   297
 * @released
williamr@2
   298
 */
williamr@2
   299
class MBtreeLeafOrg : public MBtreeNodeOrg
williamr@2
   300
	{
williamr@2
   301
public:
williamr@2
   302
	IMPORT_C TBool Search(const TAny* aNode,const TAny* aKey,const MBtreeKey& aComp,TBool aLast,TInt& aPos) const;
williamr@2
   303
	virtual TBool Insert(TAny* aNode,TInt aPos,const TDesC8& anEntry) const=0;
williamr@2
   304
	virtual IMPORT_C TBool InsertOverflow(TAny* aLeftNode,TAny* aRightNode,TInt aPos,TBool aInsertOnLeft,const TDesC8& anEntry) const;
williamr@2
   305
	virtual void InsertSplit(TAny* aLeftNode,TAny* aRightNode,TInt aPos,const TDesC8& anEntry) const=0;
williamr@2
   306
	virtual TBool Redistribute(TAny* aLeftNode,TAny* aRightNode) const=0;
williamr@2
   307
	virtual void Concatenate(TAny* aLeftNode,const TAny* aRightNode) const=0;
williamr@2
   308
	virtual TPageRef LinkNode(const TAny* aNode) const=0;
williamr@2
   309
	virtual void SetLinkNode(TAny* aNode,TPageRef aNextNode) const=0;
williamr@2
   310
	};
williamr@2
   311
williamr@2
   312
/**
williamr@2
   313
 * @publishedAll 
williamr@2
   314
 * @released
williamr@2
   315
 */
williamr@2
   316
class MBtreeIndexOrg : public MBtreeNodeOrg
williamr@2
   317
	{
williamr@2
   318
public:
williamr@2
   319
	IMPORT_C TBool Search(const TAny* aNode,const TAny* aKey,const MBtreeKey& aComp,TBool aLast,TInt& aPos) const;
williamr@2
   320
	virtual TBool Insert(TAny* aNode,TInt aPos,const TDesC8& anEntry,TPageRef aChild) const=0;
williamr@2
   321
	virtual IMPORT_C TBool InsertOverflow(TAny* aLeftNode,TAny* aRightNode,TInt aPos,TBool aInsertOnLeft,const TDesC8& anEntry,TPageRef aChild,const TDesC8& aPivot,TBtreePivot& aNewPivot) const;
williamr@2
   322
	virtual void InsertSplit(TAny* aLeftNode,TAny* aRightNode,TInt aPos,const TDesC8& anEntry,TPageRef aChild,TBtreePivot& aPromote) const=0;
williamr@2
   323
	virtual IMPORT_C TBool Update(TAny* aNode,TInt aPos,const TDesC8& anEntry) const;
williamr@2
   324
	virtual TBool Redistribute(TAny* aLeftNode,TAny* aRightNode,const TDesC8& aPivot,TBtreePivot& aNewPivot) const=0;
williamr@2
   325
	virtual void Concatenate(TAny* aLeftNode,const TAny* aRightNode,const TDesC8& aPivot) const=0;
williamr@2
   326
	virtual void MakeRoot(TAny* aNode,TPageRef aChild) const=0;
williamr@2
   327
	virtual TPageRef ChildNode(const TAny* aNode,TInt aPos) const=0;
williamr@2
   328
	};
williamr@2
   329
williamr@2
   330
/**
williamr@2
   331
 * @publishedAll 
williamr@2
   332
 * @released
williamr@2
   333
 */
williamr@2
   334
class TBtreeInlineLeafOrg : public MBtreeLeafOrg
williamr@2
   335
	{
williamr@2
   336
public:
williamr@2
   337
	IMPORT_C TBtreeInlineLeafOrg();
williamr@2
   338
	IMPORT_C void SetEntrySize(TInt aSize);
williamr@2
   339
//
williamr@2
   340
	IMPORT_C TInt LastEntry(const TAny* aNode) const;
williamr@2
   341
	IMPORT_C TPtrC8 Entry(const TAny* aNode,TInt aPos) const;
williamr@2
   342
	IMPORT_C const TAny* EntryPtr(const TAny* aNode,TInt aPos) const;
williamr@2
   343
	IMPORT_C TBool Insert(TAny* aNode,TInt aPos,const TDesC8& anEntry) const;
williamr@2
   344
	IMPORT_C TBool InsertOverflow(TAny* aLeftNode,TAny* aRightNode,TInt aPos,TBool aInsertOnLeft,const TDesC8& anEntry) const;
williamr@2
   345
	IMPORT_C void InsertSplit(TAny* aLeftNode,TAny* aRightNode,TInt aPos,const TDesC8& anEntry) const;
williamr@2
   346
	IMPORT_C TBool Delete(TAny* aNode,TInt aPos) const;
williamr@2
   347
	IMPORT_C TBool Redistribute(TAny* aLeftNode,TAny* aRightNode) const;
williamr@2
   348
	IMPORT_C void Concatenate(TAny* aLeftNode,const TAny* aRightNode) const;
williamr@2
   349
	IMPORT_C TPageRef LinkNode(const TAny* aNode) const;
williamr@2
   350
	IMPORT_C void SetLinkNode(TAny* aNode,TPageRef aNextNode) const;
williamr@2
   351
private:
williamr@2
   352
	TAny* DoRedistribute(TAny* aLeftNode,TAny* aRightNode,TInt aInsertPos=-1) const;
williamr@2
   353
	struct SHeader
williamr@2
   354
		{
williamr@2
   355
		TInt32 iCount;
williamr@2
   356
		TPageRef iLink;
williamr@2
   357
		};
williamr@2
   358
	struct SNode
williamr@2
   359
		{
williamr@2
   360
		SHeader iHead;
williamr@2
   361
		TUint8 iEntries[KPoolPageSize-sizeof(SHeader)];
williamr@2
   362
		};
williamr@2
   363
private:
williamr@2
   364
	inline static const SNode* Node(const TAny* aNode);
williamr@2
   365
	inline static SNode* Node(TAny* aNode);
williamr@2
   366
	inline const TUint8* Entry(const SNode* aNode,TInt anEntry) const;
williamr@2
   367
	inline TUint8* Entry(SNode* aNode,TInt anEntry) const;
williamr@2
   368
private:
williamr@2
   369
	TInt iEntrySize;
williamr@2
   370
	TInt iMaxEntries;
williamr@2
   371
	};
williamr@2
   372
williamr@2
   373
/**
williamr@2
   374
 * @publishedAll 
williamr@2
   375
 * @released
williamr@2
   376
 */
williamr@2
   377
class TBtreeInlineIndexOrg : public MBtreeIndexOrg
williamr@2
   378
	{
williamr@2
   379
public:
williamr@2
   380
	IMPORT_C TBtreeInlineIndexOrg();
williamr@2
   381
	IMPORT_C void SetEntrySize(TInt aSize);
williamr@2
   382
//
williamr@2
   383
	IMPORT_C TBool Insert(TAny* aNode,TInt aPos,const TDesC8& anEntry,TPageRef aChild) const;
williamr@2
   384
	IMPORT_C TBool InsertOverflow(TAny* aLeftNode,TAny* aRightNode,TInt aPos,TBool aInsertOnLeft,const TDesC8& anEntry,TPageRef aChild,const TDesC8& aPivot,TBtreePivot& aNewPivot) const;
williamr@2
   385
	IMPORT_C void InsertSplit(TAny* aLeftNode,TAny* aRightNode,TInt aPos,const TDesC8& anEntry,TPageRef aChild,TBtreePivot& aPromote) const;
williamr@2
   386
	IMPORT_C TBool Update(TAny* aNode,TInt aPos,const TDesC8& anEntry) const;
williamr@2
   387
	IMPORT_C TBool Delete(TAny* aNode,TInt aPos) const;
williamr@2
   388
	IMPORT_C TBool Redistribute(TAny* aLeftNode,TAny* aRightNode,const TDesC8& aPivot,TBtreePivot& aNewPivot) const;
williamr@2
   389
	IMPORT_C void Concatenate(TAny* aLeftNode,const TAny* aRightNode,const TDesC8& aPivot) const;
williamr@2
   390
williamr@2
   391
	IMPORT_C void MakeRoot(TAny* aNode,TPageRef aChild) const;
williamr@2
   392
	IMPORT_C TInt LastEntry(const TAny* aNode) const;
williamr@2
   393
	IMPORT_C TPtrC8 Entry(const TAny* aNode,TInt aPos) const;
williamr@2
   394
	IMPORT_C const TAny* EntryPtr(const TAny* aNode,TInt aPos) const;
williamr@2
   395
	IMPORT_C TPageRef ChildNode(const TAny* aNode,TInt aPos) const;
williamr@2
   396
private:
williamr@2
   397
	struct SEntry
williamr@2
   398
		{
williamr@2
   399
		TPageRef iChild;
williamr@2
   400
		TUint8 iKey[4]; // at least four bytes of key
williamr@2
   401
		};
williamr@2
   402
	struct SHeader
williamr@2
   403
		{
williamr@2
   404
		TInt32 iCount;
williamr@2
   405
		};
williamr@2
   406
	struct SNode
williamr@2
   407
		{
williamr@2
   408
		SHeader iHead;
williamr@2
   409
		TUint8 iEntries[KPoolPageSize-sizeof(SHeader)];
williamr@2
   410
		};
williamr@2
   411
	SNode* DoRedistribute(TAny* aLeftNode,TAny* aRightNode,const TDesC8& aPivot,TBtreePivot& aNewPivot,TInt aInsertPos=-1) const;
williamr@2
   412
private:
williamr@2
   413
	inline static const SNode* Node(const TAny* aNode);
williamr@2
   414
	inline static SNode* Node(TAny* aNode);
williamr@2
   415
	inline const SEntry* Entry(const SNode* aNode,TInt anEntry) const;
williamr@2
   416
	inline SEntry* Entry(SNode* aNode,TInt anEntry) const;
williamr@2
   417
	inline TInt KeySize() const;
williamr@2
   418
private:
williamr@2
   419
	TInt iEntrySize;
williamr@2
   420
	TInt iMaxEntries;
williamr@2
   421
	};
williamr@2
   422
williamr@2
   423
/**
williamr@2
   424
 * @publishedAll 
williamr@2
   425
 * @released
williamr@2
   426
 */
williamr@2
   427
class TBtreeKey : public MBtreeKey
williamr@2
   428
	{
williamr@2
   429
public:
williamr@2
   430
	IMPORT_C TBtreeKey();
williamr@2
   431
	IMPORT_C TBtreeKey(TInt aLength);
williamr@2
   432
	IMPORT_C TBtreeKey(TInt anOffset,TKeyCmpText aType);
williamr@2
   433
	IMPORT_C TBtreeKey(TInt anOffset,TKeyCmpText aType,TInt aLength);
williamr@2
   434
	IMPORT_C TBtreeKey(TInt anOffset,TKeyCmpNumeric aType);
williamr@2
   435
//
williamr@2
   436
	IMPORT_C const TAny* Key(const TAny* anEntry) const;
williamr@2
   437
	IMPORT_C TInt Compare(const TAny* aLeft,const TAny* aRight) const;
williamr@2
   438
	IMPORT_C void Between(const TAny* aLeft,const TAny* aRight,TBtreePivot& aPivot) const;
williamr@2
   439
protected:
williamr@2
   440
	TInt iKeyOffset;
williamr@2
   441
	TInt iCmpType;
williamr@2
   442
	TInt iKeyLength;
williamr@2
   443
	};
williamr@2
   444
williamr@2
   445
/**
williamr@2
   446
 * @publishedAll 
williamr@2
   447
 * @released
williamr@2
   448
 * Base class for TBtreeFix, which provides a B-tree for fixed sized entries.  
williamr@2
   449
*/
williamr@2
   450
class TBtreeFixBase : public TBtree
williamr@2
   451
	{
williamr@2
   452
public:
williamr@2
   453
	IMPORT_C void Connect(MPagePool* aPool,const MBtreeKey* aKey);
williamr@2
   454
	IMPORT_C TBool InsertL(TBtreePos& aPos,const TAny* anEntry,TAllowDuplicates aDup=ENoDuplicates);
williamr@2
   455
	IMPORT_C void ExtractAtL(const TBtreePos& aPos,TAny* anEntry) const;
williamr@2
   456
	IMPORT_C void ExtractAtL(const TBtreeMark& aMark,TAny* anEntry) const;
williamr@2
   457
protected:
williamr@2
   458
	IMPORT_C TBtreeFixBase(TBtreeMode aMode,TInt anEntrySize,TInt aKeySize);
williamr@2
   459
	IMPORT_C TBtreeFixBase(const TBtreeToken& aToken,TBtreeMode aMode,TInt anEntrySize,TInt aKeySize);
williamr@2
   460
private:
williamr@2
   461
	TInt iEntrySize;
williamr@2
   462
	TBtreeInlineLeafOrg iLeafOrgFix;
williamr@2
   463
	TBtreeInlineIndexOrg iIndexOrgFix;
williamr@2
   464
	};
williamr@2
   465
williamr@2
   466
/**
williamr@2
   467
 * @publishedAll 
williamr@2
   468
 * @released
williamr@2
   469
 * A B-tree for fixed-sized keys and entries.
williamr@2
   470
williamr@2
   471
Entry is the type of entry to store. Key defines how items should be ordered: 
williamr@2
   472
there must be a member of this type in the Entry class. 
williamr@2
   473
*/
williamr@2
   474
template <class Entry,class Key>
williamr@2
   475
class TBtreeFix : public TBtreeFixBase
williamr@2
   476
	{
williamr@2
   477
public:
williamr@2
   478
	inline TBtreeFix(TBtreeMode aMode);
williamr@2
   479
	inline TBtreeFix(const TBtreeToken& aToken,TBtreeMode aMode);
williamr@2
   480
//
williamr@2
   481
	inline TBool FindL(TBtreePos& aPos,const Key& aKey,TFind aMode=EEqualTo) const;
williamr@2
   482
	inline TBool InsertL(TBtreePos& aPos,const Entry& anEntry,TAllowDuplicates aDup=ENoDuplicates);
williamr@2
   483
	inline TBool DeleteL(const Key& aKey);
williamr@2
   484
//
williamr@2
   485
	inline Entry AtL(const TBtreePos& aPos) const;
williamr@2
   486
	inline Entry AtL(const TBtreeMark& aMark) const;
williamr@2
   487
	inline void ExtractAtL(const TBtreePos& aPos,Entry& anEntry) const;
williamr@2
   488
	inline void ExtractAtL(const TBtreeMark& aMark,Entry& anEntry) const;
williamr@2
   489
	};
williamr@2
   490
williamr@2
   491
/**
williamr@2
   492
 * @publishedAll 
williamr@2
   493
 * @released
williamr@2
   494
 * A specialisation of the B-tree for untyped fixed sized items. 
williamr@2
   495
*/
williamr@2
   496
TEMPLATE_SPECIALIZATION class TBtreeFix<TAny,TAny> : public TBtreeFixBase
williamr@2
   497
	{
williamr@2
   498
public:
williamr@2
   499
	inline TBtreeFix(TBtreeMode aMode,TInt anEntrySize,TInt aKeySize);
williamr@2
   500
	inline TBtreeFix(const TBtreeToken& aToken,TBtreeMode aMode,TInt anEntrySize,TInt aKeySize);
williamr@2
   501
	};
williamr@2
   502
williamr@2
   503
#include <s32btree.inl>
williamr@2
   504
#endif